e1c151a316dcc4b00367971f1ce57bb4b30de446
[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  */
65 @SuppressWarnings("squid:S1874") // "@Deprecated" code should not be used
66 public class A1AdapterProvider implements AutoCloseable, A1ADAPTERAPIService {
67
68     private static final String A1_ADAPTER_API = "A1-ADAPTER-API";
69     private static final String RESPONSE_BODY = "responseBody";
70     private static final String RESPONSE_CODE = "response-code";
71     private static final String SYNC = "sync";
72
73     private static final String ADDING_INPUT_DATA_MESSAGE = "Adding INPUT data for {} input: {}";
74     private static final String A1_ADAPTER_CLIENT_GRAPH_MESSAGE = "A1AdapterClient has a Directed Graph for '{}'";
75     private static final String SERVICE_EXCEPTION_MESSAGE = "Caught exception executing service logic for {}, {}";
76     private static final String NO_SERVICE_LOGIC_ACTIVE_MESSAGE = "No service logic active for A1Adapter: '{}'";
77     private static final String LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE = "Caught exception looking for service logic, {}";
78
79     private static final Logger log = LoggerFactory.getLogger(A1AdapterProvider.class);
80
81     private static final String APPLICATION_NAME = "a1Adapter-api";
82
83     private final ExecutorService executor;
84     protected DataBroker dataBroker;
85     protected NotificationPublishService notificationService;
86     protected RpcProviderRegistry rpcRegistry;
87     protected BindingAwareBroker.RpcRegistration<A1ADAPTERAPIService> rpcRegistration;
88     private final A1AdapterClient a1AdapterClient;
89
90     public A1AdapterProvider(final DataBroker dataBroker, final NotificationPublishService notificationPublishService,
91             final RpcProviderRegistry rpcProviderRegistry, final A1AdapterClient a1AdapterClient) {
92
93         log.info("Creating provider for {}", APPLICATION_NAME);
94         executor = Executors.newFixedThreadPool(1);
95         this.dataBroker = dataBroker;
96         this.notificationService = notificationPublishService;
97         this.rpcRegistry = rpcProviderRegistry;
98         this.a1AdapterClient = a1AdapterClient;
99         initialize();
100     }
101
102     public void initialize() {
103         log.info("Initializing provider for {}", APPLICATION_NAME);
104         rpcRegistration = rpcRegistry.addRpcImplementation(A1ADAPTERAPIService.class, this);
105         log.info("Initialization complete for {}", APPLICATION_NAME);
106     }
107
108     protected void initializeChild() {
109         // Override if you have custom initialization intelligence
110     }
111
112     @Override
113     public void close() throws Exception {
114         log.info("Closing provider for {}", APPLICATION_NAME);
115         executor.shutdown();
116         rpcRegistration.close();
117         log.info("Successfully closed provider for {}", APPLICATION_NAME);
118     }
119
120     @Override
121     public ListenableFuture<RpcResult<DeleteA1PolicyOutput>> deleteA1Policy(DeleteA1PolicyInput input) {
122         log.info("Start of deleteA1Policy");
123         final String svcOperation = "deleteA1Policy";
124         Properties parms = new Properties();
125         DeleteA1PolicyOutputBuilder deleteResponse = new DeleteA1PolicyOutputBuilder();
126         // add input to parms
127         log.info(ADDING_INPUT_DATA_MESSAGE, svcOperation, input);
128         DeleteA1PolicyInputBuilder inputBuilder = new DeleteA1PolicyInputBuilder(input);
129         MdsalHelper.toProperties(parms, inputBuilder.build());
130         logSliParameters(parms);
131         // Call SLI sync method
132         try {
133             if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
134                 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
135                 try {
136                     Properties responseParms = a1AdapterClient.execute(A1_ADAPTER_API, svcOperation, null, SYNC, deleteResponse, parms);
137                     logResponse(responseParms);
138                     deleteResponse.setHttpStatus(Integer.valueOf(responseParms.getProperty(RESPONSE_CODE)));
139                 } catch (Exception e) {
140                     log.error(SERVICE_EXCEPTION_MESSAGE, svcOperation, e.getMessage());
141                     deleteResponse.setHttpStatus(500);
142                 }
143             } else {
144                 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
145                 deleteResponse.setHttpStatus(503);
146             }
147         } catch (Exception e) {
148             log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
149             deleteResponse.setHttpStatus(500);
150         }
151         RpcResult<DeleteA1PolicyOutput> rpcResult =
152                 RpcResultBuilder.<DeleteA1PolicyOutput>status(true).withResult(deleteResponse.build()).build();
153         log.info("End of deleteA1Policy");
154         return Futures.immediateFuture(rpcResult);
155     }
156
157     @Override
158     public ListenableFuture<RpcResult<GetA1PolicyOutput>> getA1Policy(GetA1PolicyInput input) {
159         log.info("Start of getA1Policy");
160         final String svcOperation = "getA1Policy";
161         Properties parms = new Properties();
162         GetA1PolicyOutputBuilder policyResponse = new GetA1PolicyOutputBuilder();
163         // add input to parms
164         log.info(ADDING_INPUT_DATA_MESSAGE, svcOperation, input);
165         GetA1PolicyInputBuilder inputBuilder = new GetA1PolicyInputBuilder(input);
166         MdsalHelper.toProperties(parms, inputBuilder.build());
167         logSliParameters(parms);
168         // Call SLI sync method
169         try {
170             if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
171                 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
172                 try {
173                     Properties responseParms = a1AdapterClient.execute(A1_ADAPTER_API, svcOperation, null, SYNC, policyResponse, parms);
174                     logResponse(responseParms);
175                     policyResponse.setBody(responseParms.getProperty(RESPONSE_BODY));
176                     policyResponse.setHttpStatus(Integer.valueOf(responseParms.getProperty(RESPONSE_CODE)));
177                 } catch (Exception e) {
178                     log.error(SERVICE_EXCEPTION_MESSAGE, svcOperation, e.getMessage());
179                     policyResponse.setHttpStatus(500);
180                 }
181             } else {
182                 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
183                 policyResponse.setHttpStatus(503);
184             }
185         } catch (Exception e) {
186             log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
187             policyResponse.setHttpStatus(500);
188         }
189         RpcResult<GetA1PolicyOutput> rpcResult =
190                 RpcResultBuilder.<GetA1PolicyOutput>status(true).withResult(policyResponse.build()).build();
191         log.info("End of getA1Policy");
192         return Futures.immediateFuture(rpcResult);
193     }
194
195     @Override
196     public ListenableFuture<RpcResult<GetA1PolicyStatusOutput>> getA1PolicyStatus(GetA1PolicyStatusInput input) {
197         log.info("Start of getA1PolicyStatus");
198         final String svcOperation = "getA1PolicyStatus";
199         Properties parms = new Properties();
200         GetA1PolicyStatusOutputBuilder policyStatusResponse = new GetA1PolicyStatusOutputBuilder();
201         // add input to parms
202         log.info(ADDING_INPUT_DATA_MESSAGE, svcOperation, input);
203         GetA1PolicyStatusInputBuilder inputBuilder = new GetA1PolicyStatusInputBuilder(input);
204         MdsalHelper.toProperties(parms, inputBuilder.build());
205         logSliParameters(parms);
206         // Call SLI sync method
207         try {
208             if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
209                 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
210                 try {
211                     Properties responseParms = a1AdapterClient.execute(A1_ADAPTER_API, svcOperation, null, SYNC, policyStatusResponse, parms);
212                     logResponse(responseParms);
213                     policyStatusResponse.setBody(responseParms.getProperty(RESPONSE_BODY));
214                     policyStatusResponse.setHttpStatus(Integer.valueOf(responseParms.getProperty(RESPONSE_CODE)));
215                 } catch (Exception e) {
216                     log.error(SERVICE_EXCEPTION_MESSAGE, svcOperation, e.getMessage());
217                     policyStatusResponse.setHttpStatus(500);
218                 }
219             } else {
220                 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
221                 policyStatusResponse.setHttpStatus(503);
222             }
223         } catch (Exception e) {
224             log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
225             policyStatusResponse.setHttpStatus(500);
226         }
227         RpcResult<GetA1PolicyStatusOutput> rpcResult =
228                 RpcResultBuilder.<GetA1PolicyStatusOutput>status(true).withResult(policyStatusResponse.build()).build();
229         log.info("End of getA1PolicyStatus");
230         return Futures.immediateFuture(rpcResult);
231     }
232
233     @Override
234     public ListenableFuture<RpcResult<GetA1PolicyTypeOutput>> getA1PolicyType(GetA1PolicyTypeInput input) {
235         log.info("Start of getA1PolicyType");
236         final String svcOperation = "getA1PolicyType";
237         Properties parms = new Properties();
238         GetA1PolicyTypeOutputBuilder policyTypeResponse = new GetA1PolicyTypeOutputBuilder();
239         // add input to parms
240         log.info(ADDING_INPUT_DATA_MESSAGE, svcOperation, input);
241         GetA1PolicyTypeInputBuilder inputBuilder = new GetA1PolicyTypeInputBuilder(input);
242         MdsalHelper.toProperties(parms, inputBuilder.build());
243         logSliParameters(parms);
244         // Call SLI sync method
245         try {
246             if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
247                 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
248                 try {
249                     Properties responseParms = a1AdapterClient.execute(A1_ADAPTER_API, svcOperation, null, SYNC, policyTypeResponse, parms);
250                     logResponse(responseParms);
251                     policyTypeResponse.setBody(responseParms.getProperty(RESPONSE_BODY));
252                     policyTypeResponse.setHttpStatus(Integer.valueOf(responseParms.getProperty(RESPONSE_CODE)));
253                 } catch (Exception e) {
254                     log.error(SERVICE_EXCEPTION_MESSAGE, svcOperation, e.getMessage());
255                     policyTypeResponse.setHttpStatus(500);
256                 }
257             } else {
258                 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
259                 policyTypeResponse.setHttpStatus(503);
260             }
261         } catch (Exception e) {
262             log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
263             policyTypeResponse.setHttpStatus(500);
264         }
265         RpcResult<GetA1PolicyTypeOutput> rpcResult =
266                 RpcResultBuilder.<GetA1PolicyTypeOutput>status(true).withResult(policyTypeResponse.build()).build();
267         log.info("End of getA1PolicyType");
268         return Futures.immediateFuture(rpcResult);
269     }
270
271     @Override
272     public ListenableFuture<RpcResult<PutA1PolicyOutput>> putA1Policy(PutA1PolicyInput input) {
273         log.info("Start of putA1Policy");
274         final String svcOperation = "putA1Policy";
275         Properties parms = new Properties();
276         PutA1PolicyOutputBuilder policyResponse = new PutA1PolicyOutputBuilder();
277         // add input to parms
278         log.info(ADDING_INPUT_DATA_MESSAGE, svcOperation, input);
279         PutA1PolicyInputBuilder inputBuilder = new PutA1PolicyInputBuilder(input);
280         MdsalHelper.toProperties(parms, inputBuilder.build());
281         logSliParameters(parms);
282         // Call SLI sync method
283         try {
284             if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
285                 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
286                 try {
287                     Properties responseParms = a1AdapterClient.execute(A1_ADAPTER_API, svcOperation, null, SYNC, policyResponse, parms);
288                     logResponse(responseParms);
289                     policyResponse.setBody(responseParms.getProperty(RESPONSE_BODY));
290                     policyResponse.setHttpStatus(Integer.valueOf(responseParms.getProperty(RESPONSE_CODE)));
291                 } catch (Exception e) {
292                     log.error(SERVICE_EXCEPTION_MESSAGE, svcOperation, e.getMessage());
293                     policyResponse.setHttpStatus(500);
294                 }
295             } else {
296                 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
297                 policyResponse.setHttpStatus(503);
298             }
299         } catch (Exception e) {
300             log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
301             policyResponse.setHttpStatus(500);
302         }
303         RpcResult<PutA1PolicyOutput> rpcResult =
304                 RpcResultBuilder.<PutA1PolicyOutput>status(true).withResult(policyResponse.build()).build();
305         log.info("End of putA1Policy");
306         return Futures.immediateFuture(rpcResult);
307     }
308
309     private void logSliParameters(Properties parms) {
310         log.info("Printing SLI parameters to be passed");
311         // iterate properties file to get key-value pairs
312         for (String key : parms.stringPropertyNames()) {
313             String value = parms.getProperty(key);
314             log.info("The SLI parameter in {} is: {}", key, value);
315         }
316     }
317
318     private void logResponse(Properties responseParms) {
319         log.info("responseBody::{}", responseParms.getProperty(RESPONSE_BODY));
320         log.info("responseCode::{}", responseParms.getProperty(RESPONSE_CODE));
321         log.info("responseMessage::{}", responseParms.getProperty("response-message"));
322     }
323 }