ed7bc95ec3c0996043b0623db74b651bf8076e7c
[ccsdk/oran.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2020 Nordix Foundation.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.ccsdk.features.a1.adapter;
22
23 import com.google.common.util.concurrent.Futures;
24 import com.google.common.util.concurrent.ListenableFuture;
25 import java.util.Properties;
26 import java.util.concurrent.ExecutorService;
27 import java.util.concurrent.Executors;
28 import org.onap.ccsdk.sli.core.sli.provider.MdsalHelper;
29 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
30 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
31 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
32 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
33 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.A1ADAPTERAPIService;
34 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.DeleteA1PolicyInput;
35 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.DeleteA1PolicyInputBuilder;
36 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.DeleteA1PolicyOutput;
37 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.DeleteA1PolicyOutputBuilder;
38 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyInput;
39 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyInputBuilder;
40 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyOutput;
41 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyOutputBuilder;
42 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyStatusInput;
43 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyStatusInputBuilder;
44 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyStatusOutput;
45 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyStatusOutputBuilder;
46 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyTypeInput;
47 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyTypeInputBuilder;
48 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyTypeOutput;
49 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.GetA1PolicyTypeOutputBuilder;
50 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.PutA1PolicyInput;
51 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.PutA1PolicyInputBuilder;
52 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.PutA1PolicyOutput;
53 import org.opendaylight.yang.gen.v1.org.onap.a1.adapter.rev200122.PutA1PolicyOutputBuilder;
54 import org.opendaylight.yangtools.yang.common.RpcResult;
55 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
58
59 /**
60  * Defines a base implementation for your provider. This class overrides the generated interface from the YANG model and
61  * implements the request model for the A1 interface. This class identifies the Near-RT RIC throught the IP passed over
62  * the payload and calls the corresponding Near-RT RIC over Rest API
63  *
64  * <pre>
65  *
66  */
67 @SuppressWarnings("squid:S1874") // "@Deprecated" code should not be used
68 public class A1AdapterProvider implements AutoCloseable, A1ADAPTERAPIService {
69
70     private static final Logger log = LoggerFactory.getLogger(A1AdapterProvider.class);
71
72     private static final String APPLICATION_NAME = "a1Adapter-api";
73
74     private final ExecutorService executor;
75     protected DataBroker dataBroker;
76     protected NotificationPublishService notificationService;
77     protected RpcProviderRegistry rpcRegistry;
78     protected BindingAwareBroker.RpcRegistration<A1ADAPTERAPIService> rpcRegistration;
79     private final A1AdapterClient a1AdapterClient;
80
81     public A1AdapterProvider(final DataBroker dataBroker, final NotificationPublishService notificationPublishService,
82             final RpcProviderRegistry rpcProviderRegistry, final A1AdapterClient a1AdapterClient) {
83
84         log.info("Creating provider for {}", APPLICATION_NAME);
85         executor = Executors.newFixedThreadPool(1);
86         this.dataBroker = dataBroker;
87         this.notificationService = notificationPublishService;
88         this.rpcRegistry = rpcProviderRegistry;
89         this.a1AdapterClient = a1AdapterClient;
90         initialize();
91     }
92
93     public void initialize() {
94         log.info("Initializing provider for {}", APPLICATION_NAME);
95         rpcRegistration = rpcRegistry.addRpcImplementation(A1ADAPTERAPIService.class, this);
96         log.info("Initialization complete for {}", APPLICATION_NAME);
97     }
98
99     protected void initializeChild() {
100         // Override if you have custom initialization intelligence
101     }
102
103     @Override
104     public void close() throws Exception {
105         log.info("Closing provider for {}", APPLICATION_NAME);
106         executor.shutdown();
107         rpcRegistration.close();
108         log.info("Successfully closed provider for {}", APPLICATION_NAME);
109     }
110
111     @Override
112     public ListenableFuture<RpcResult<DeleteA1PolicyOutput>> deleteA1Policy(DeleteA1PolicyInput input) {
113         log.info("Start of deleteA1Policy");
114         final String svcOperation = "deleteA1Policy";
115         Properties parms = new Properties();
116         DeleteA1PolicyOutputBuilder deleteResponse = new DeleteA1PolicyOutputBuilder();
117         // add input to parms
118         log.info("Adding INPUT data for " + svcOperation + " input: " + input);
119         DeleteA1PolicyInputBuilder inputBuilder = new DeleteA1PolicyInputBuilder(input);
120         MdsalHelper.toProperties(parms, inputBuilder.build());
121         log.info("Printing SLI parameters to be passed");
122         // iterate properties file to get key-value pairs
123         for (String key : parms.stringPropertyNames()) {
124             String value = parms.getProperty(key);
125             log.info("The SLI parameter in " + key + " is: " + value);
126         }
127         // Call SLI sync method
128         try {
129             if (a1AdapterClient.hasGraph("A1-ADAPTER-API", svcOperation, null, "sync")) {
130                 log.info("A1AdapterClient has a Directed Graph for '" + svcOperation + "'");
131                 try {
132                     a1AdapterClient.execute("A1-ADAPTER-API", svcOperation, null, "sync", deleteResponse, parms);
133                     deleteResponse.setHttpStatus(200);
134                 } catch (Exception e) {
135                     log.error("Caught exception executing service logic for " + svcOperation, e);
136                     deleteResponse.setHttpStatus(500);
137                 }
138             } else {
139                 log.error("No service logic active for A1Adapter: '" + svcOperation + "'");
140                 deleteResponse.setHttpStatus(503);
141             }
142         } catch (Exception e) {
143             log.error("Caught exception looking for service logic", e);
144             deleteResponse.setHttpStatus(500);
145         }
146         RpcResult<DeleteA1PolicyOutput> rpcResult =
147                 RpcResultBuilder.<DeleteA1PolicyOutput>status(true).withResult(deleteResponse.build()).build();
148         log.info("End of getA1Policy");
149         return Futures.immediateFuture(rpcResult);
150     }
151
152     @Override
153     public ListenableFuture<RpcResult<GetA1PolicyOutput>> getA1Policy(GetA1PolicyInput input) {
154         log.info("Start of getA1Policy");
155         final String svcOperation = "getA1Policy";
156         Properties parms = new Properties();
157         GetA1PolicyOutputBuilder policyResponse = new GetA1PolicyOutputBuilder();
158         // add input to parms
159         log.info("Adding INPUT data for " + svcOperation + " input: " + input);
160         GetA1PolicyInputBuilder inputBuilder = new GetA1PolicyInputBuilder(input);
161         MdsalHelper.toProperties(parms, inputBuilder.build());
162         log.info("Printing SLI parameters to be passed");
163         // iterate properties file to get key-value pairs
164         for (String key : parms.stringPropertyNames()) {
165             String value = parms.getProperty(key);
166             log.info("The SLI parameter in " + key + " is: " + value);
167         }
168         // Call SLI sync method
169         try {
170             if (a1AdapterClient.hasGraph("A1-ADAPTER-API", svcOperation, null, "sync")) {
171                 log.info("A1AdapterClient has a Directed Graph for '" + svcOperation + "'");
172                 try {
173                     a1AdapterClient.execute("A1-ADAPTER-API", svcOperation, null, "sync", policyResponse, parms);
174                     policyResponse.setHttpStatus(200);
175                 } catch (Exception e) {
176                     log.error("Caught exception executing service logic for " + svcOperation, e);
177                     policyResponse.setHttpStatus(500);
178                 }
179             } else {
180                 log.error("No service logic active for A1Adapter: '" + svcOperation + "'");
181                 policyResponse.setHttpStatus(503);
182             }
183         } catch (Exception e) {
184             log.error("Caught exception looking for service logic", e);
185             policyResponse.setHttpStatus(500);
186         }
187         RpcResult<GetA1PolicyOutput> rpcResult =
188                 RpcResultBuilder.<GetA1PolicyOutput>status(true).withResult(policyResponse.build()).build();
189         log.info("End of getA1Policy");
190         return Futures.immediateFuture(rpcResult);
191     }
192
193     @Override
194     public ListenableFuture<RpcResult<GetA1PolicyStatusOutput>> getA1PolicyStatus(GetA1PolicyStatusInput input) {
195         log.info("Start of getA1PolicyStatus");
196         final String svcOperation = "getA1PolicyStatus";
197         Properties parms = new Properties();
198         GetA1PolicyStatusOutputBuilder policyStatusResponse = new GetA1PolicyStatusOutputBuilder();
199         // add input to parms
200         log.info("Adding INPUT data for " + svcOperation + " input: " + input);
201         GetA1PolicyStatusInputBuilder inputBuilder = new GetA1PolicyStatusInputBuilder(input);
202         MdsalHelper.toProperties(parms, inputBuilder.build());
203         log.info("Printing SLI parameters to be passed");
204         // iterate properties file to get key-value pairs
205         for (String key : parms.stringPropertyNames()) {
206             String value = parms.getProperty(key);
207             log.info("The SLI parameter in " + key + " is: " + value);
208         }
209         // Call SLI sync method
210         try {
211             if (a1AdapterClient.hasGraph("A1-ADAPTER-API", svcOperation, null, "sync")) {
212                 log.info("A1AdapterClient has a Directed Graph for '" + svcOperation + "'");
213                 try {
214                     a1AdapterClient.execute("A1-ADAPTER-API", svcOperation, null, "sync", policyStatusResponse, parms);
215                     policyStatusResponse.setHttpStatus(200);
216                 } catch (Exception e) {
217                     log.error("Caught exception executing service logic for " + svcOperation, e);
218                     policyStatusResponse.setHttpStatus(500);
219                 }
220             } else {
221                 log.error("No service logic active for A1Adapter: '" + svcOperation + "'");
222                 policyStatusResponse.setHttpStatus(503);
223             }
224         } catch (Exception e) {
225             log.error("Caught exception looking for service logic", e);
226             policyStatusResponse.setHttpStatus(500);
227         }
228         RpcResult<GetA1PolicyStatusOutput> rpcResult =
229                 RpcResultBuilder.<GetA1PolicyStatusOutput>status(true).withResult(policyStatusResponse.build()).build();
230         log.info("End of getA1PolicyStatus");
231         return Futures.immediateFuture(rpcResult);
232     }
233
234     @Override
235     public ListenableFuture<RpcResult<GetA1PolicyTypeOutput>> getA1PolicyType(GetA1PolicyTypeInput input) {
236         log.info("Start of getA1PolicyType");
237         final String svcOperation = "getA1PolicyType";
238         Properties parms = new Properties();
239         GetA1PolicyTypeOutputBuilder policyTypeResponse = new GetA1PolicyTypeOutputBuilder();
240         // add input to parms
241         log.info("Adding INPUT data for " + svcOperation + " input: " + input);
242         GetA1PolicyTypeInputBuilder inputBuilder = new GetA1PolicyTypeInputBuilder(input);
243         MdsalHelper.toProperties(parms, inputBuilder.build());
244         log.info("Printing SLI parameters to be passed");
245         // iterate properties file to get key-value pairs
246         for (String key : parms.stringPropertyNames()) {
247             String value = parms.getProperty(key);
248             log.info("The SLI parameter in " + key + " is: " + value);
249         }
250         // Call SLI sync method
251         try {
252             if (a1AdapterClient.hasGraph("A1-ADAPTER-API", svcOperation, null, "sync")) {
253                 log.info("A1AdapterClient has a Directed Graph for '" + svcOperation + "'");
254                 try {
255                     a1AdapterClient.execute("A1-ADAPTER-API", svcOperation, null, "sync", policyTypeResponse, parms);
256                     policyTypeResponse.setHttpStatus(200);
257                 } catch (Exception e) {
258                     log.error("Caught exception executing service logic for " + svcOperation, e);
259                     policyTypeResponse.setHttpStatus(500);
260                 }
261             } else {
262                 log.error("No service logic active for A1Adapter: '" + svcOperation + "'");
263                 policyTypeResponse.setHttpStatus(503);
264             }
265         } catch (Exception e) {
266             log.error("Caught exception looking for service logic", e);
267             policyTypeResponse.setHttpStatus(500);
268         }
269         RpcResult<GetA1PolicyTypeOutput> rpcResult =
270                 RpcResultBuilder.<GetA1PolicyTypeOutput>status(true).withResult(policyTypeResponse.build()).build();
271         log.info("End of getA1PolicyType");
272         return Futures.immediateFuture(rpcResult);
273     }
274
275     @Override
276     public ListenableFuture<RpcResult<PutA1PolicyOutput>> putA1Policy(PutA1PolicyInput input) {
277         log.info("Start of putA1Policy");
278         final String svcOperation = "putA1Policy";
279         Properties parms = new Properties();
280         PutA1PolicyOutputBuilder policyResponse = new PutA1PolicyOutputBuilder();
281         // add input to parms
282         log.info("Adding INPUT data for " + svcOperation + " input: " + input);
283         PutA1PolicyInputBuilder inputBuilder = new PutA1PolicyInputBuilder(input);
284         MdsalHelper.toProperties(parms, inputBuilder.build());
285         log.info("Printing SLI parameters to be passed");
286         // iterate properties file to get key-value pairs
287         for (String key : parms.stringPropertyNames()) {
288             String value = parms.getProperty(key);
289             log.info("The SLI parameter in " + key + " is: " + value);
290         }
291         // Call SLI sync method
292         try {
293             if (a1AdapterClient.hasGraph("A1-ADAPTER-API", svcOperation, null, "sync")) {
294                 log.info("A1AdapterClient has a Directed Graph for '" + svcOperation + "'");
295                 try {
296                     a1AdapterClient.execute("A1-ADAPTER-API", svcOperation, null, "sync", policyResponse, parms);
297                     policyResponse.setHttpStatus(200);
298                 } catch (Exception e) {
299                     log.error("Caught exception executing service logic for " + svcOperation, e);
300                     policyResponse.setHttpStatus(500);
301                 }
302             } else {
303                 log.error("No service logic active for A1Adapter: '" + svcOperation + "'");
304                 policyResponse.setHttpStatus(503);
305             }
306         } catch (Exception e) {
307             log.error("Caught exception looking for service logic", e);
308             policyResponse.setHttpStatus(500);
309         }
310         RpcResult<PutA1PolicyOutput> rpcResult =
311                 RpcResultBuilder.<PutA1PolicyOutput>status(true).withResult(policyResponse.build()).build();
312         log.info("End of putA1Policy");
313         return Futures.immediateFuture(rpcResult);
314     }
315
316 }