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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.ccsdk.features.a1.adapter;
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;
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
65 @SuppressWarnings("squid:S1874") // "@Deprecated" code should not be used
66 public class A1AdapterProvider implements AutoCloseable, A1ADAPTERAPIService {
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";
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, {}";
79 private static final Logger log = LoggerFactory.getLogger(A1AdapterProvider.class);
81 private static final String APPLICATION_NAME = "a1Adapter-api";
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;
90 public A1AdapterProvider(final DataBroker dataBroker, final NotificationPublishService notificationPublishService,
91 final RpcProviderRegistry rpcProviderRegistry, final A1AdapterClient a1AdapterClient) {
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;
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);
108 protected void initializeChild() {
109 // Override if you have custom initialization intelligence
113 public void close() throws Exception {
114 log.info("Closing provider for {}", APPLICATION_NAME);
116 rpcRegistration.close();
117 log.info("Successfully closed provider for {}", APPLICATION_NAME);
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
133 if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
134 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
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);
144 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
145 deleteResponse.setHttpStatus(503);
147 } catch (Exception e) {
148 log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
149 deleteResponse.setHttpStatus(500);
151 RpcResult<DeleteA1PolicyOutput> rpcResult =
152 RpcResultBuilder.<DeleteA1PolicyOutput>status(true).withResult(deleteResponse.build()).build();
153 log.info("End of deleteA1Policy");
154 return Futures.immediateFuture(rpcResult);
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
170 if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
171 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
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);
182 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
183 policyResponse.setHttpStatus(503);
185 } catch (Exception e) {
186 log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
187 policyResponse.setHttpStatus(500);
189 RpcResult<GetA1PolicyOutput> rpcResult =
190 RpcResultBuilder.<GetA1PolicyOutput>status(true).withResult(policyResponse.build()).build();
191 log.info("End of getA1Policy");
192 return Futures.immediateFuture(rpcResult);
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
208 if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
209 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
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);
220 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
221 policyStatusResponse.setHttpStatus(503);
223 } catch (Exception e) {
224 log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
225 policyStatusResponse.setHttpStatus(500);
227 RpcResult<GetA1PolicyStatusOutput> rpcResult =
228 RpcResultBuilder.<GetA1PolicyStatusOutput>status(true).withResult(policyStatusResponse.build()).build();
229 log.info("End of getA1PolicyStatus");
230 return Futures.immediateFuture(rpcResult);
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
246 if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
247 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
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);
258 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
259 policyTypeResponse.setHttpStatus(503);
261 } catch (Exception e) {
262 log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
263 policyTypeResponse.setHttpStatus(500);
265 RpcResult<GetA1PolicyTypeOutput> rpcResult =
266 RpcResultBuilder.<GetA1PolicyTypeOutput>status(true).withResult(policyTypeResponse.build()).build();
267 log.info("End of getA1PolicyType");
268 return Futures.immediateFuture(rpcResult);
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
284 if (a1AdapterClient.hasGraph(A1_ADAPTER_API, svcOperation, null, SYNC)) {
285 log.info(A1_ADAPTER_CLIENT_GRAPH_MESSAGE, svcOperation);
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);
296 log.error(NO_SERVICE_LOGIC_ACTIVE_MESSAGE, svcOperation);
297 policyResponse.setHttpStatus(503);
299 } catch (Exception e) {
300 log.error(LOOKUP_SERVICE_LOGIC_EXCEPTION_MESSAGE, e.getMessage());
301 policyResponse.setHttpStatus(500);
303 RpcResult<PutA1PolicyOutput> rpcResult =
304 RpcResultBuilder.<PutA1PolicyOutput>status(true).withResult(policyResponse.build()).build();
305 log.info("End of putA1Policy");
306 return Futures.immediateFuture(rpcResult);
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);
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"));