Clean up A1 controller dependencies
[nonrtric.git] / sdnc-a1-controller / northbound / nonrt-ric-api / provider / src / main / java / org / o_ran_sc / nonrtric / sdnc_a1 / northbound / provider / NonrtRicApiProvider.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019 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.o_ran_sc.nonrtric.sdnc_a1.northbound.provider;
22
23 import com.google.common.util.concurrent.CheckedFuture;
24 import com.google.common.util.concurrent.Futures;
25 import com.google.common.util.concurrent.ListenableFuture;
26 import java.util.concurrent.ExecutionException;
27 import java.util.concurrent.ExecutorService;
28 import java.util.concurrent.Executors;
29 import org.o_ran_sc.nonrtric.sdnc_a1.northbound.restadapter.RestAdapter;
30 import org.o_ran_sc.nonrtric.sdnc_a1.northbound.restadapter.RestAdapterImpl;
31 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
32 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
33 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
34 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
35 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.A1ADAPTERAPIService;
36 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.DeleteA1PolicyInput;
37 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.DeleteA1PolicyOutput;
38 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.DeleteA1PolicyOutputBuilder;
39 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyInput;
40 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyInputBuilder;
41 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyOutput;
42 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyOutputBuilder;
43 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyStatusInput;
44 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyStatusOutput;
45 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyStatusOutputBuilder;
46 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyTypeInput;
47 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyTypeOutput;
48 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.GetA1PolicyTypeOutputBuilder;
49 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.PutA1PolicyInput;
50 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.PutA1PolicyOutput;
51 import org.opendaylight.yang.gen.v1.org.o_ran_sc.nonrtric.sdnc_a1.northbound.a1.adapter.rev200122.PutA1PolicyOutputBuilder;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
53 import org.opendaylight.yangtools.yang.common.RpcResult;
54 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57 import org.springframework.http.ResponseEntity;
58 import org.springframework.web.client.RestClientResponseException;
59
60 /**
61  * Defines a base implementation for your provider. This class overrides the
62  * generated interface from the YANG model and implements the request model for
63  * the A1 interface. This class identifies the Near-RT RIC throught the IP passed
64  * over the payload and calls the corresponding Near-RT RIC over Rest API
65  *
66  * <pre>
67  *
68  * @author lathishbabu.ganesan@est.tech
69  *
70  */
71
72 @SuppressWarnings("squid:S1874") // "@Deprecated" code should not be used
73 public class NonrtRicApiProvider implements AutoCloseable, A1ADAPTERAPIService {
74
75   protected static final String APP_NAME = "nonrt-ric-api";
76   protected static final String NO_SERVICE_LOGIC_ACTIVE = "No service logic active for ";
77   private static final String NON_NULL_PARAM = "non-null";
78   private static final String NULL_PARAM = "null";
79   private static final String REST_CLIENT_RESPONSE_EXCEPTION_MSG = "Caught RestClientResponseException: {}";
80
81   private final Logger log = LoggerFactory.getLogger(NonrtRicApiProvider.class);
82   private final ExecutorService executor;
83
84   protected DataBroker dataBroker;
85   protected NotificationPublishService notificationService;
86   protected RpcProviderRegistry rpcRegistry;
87   private RestAdapter restAdapter;
88
89   public NonrtRicApiProvider(DataBroker dataBroker, NotificationPublishService notificationPublishService,
90       RpcProviderRegistry rpcProviderRegistry) {
91     log.info("Creating provider for {}", APP_NAME);
92     executor = Executors.newFixedThreadPool(1);
93     setDataBroker(dataBroker);
94     setNotificationService(notificationPublishService);
95     setRpcRegistry(rpcProviderRegistry);
96     initialize();
97   }
98
99   public void initialize() {
100     log.info("Initializing provider for {}", APP_NAME);
101     restAdapter = new RestAdapterImpl();
102     log.info("Initialization complete for {}", APP_NAME);
103   }
104
105   @Override
106   public void close() throws Exception {
107     log.info("Closing provider for {}", APP_NAME);
108     executor.shutdown();
109     log.info("Successfully closed provider for {}", APP_NAME);
110   }
111
112   public void setDataBroker(DataBroker dataBroker) {
113     this.dataBroker = dataBroker;
114     if (log.isDebugEnabled()) {
115       log.debug("DataBroker set to {}", dataBroker == null ? NULL_PARAM : NON_NULL_PARAM);
116     }
117   }
118
119   public void setNotificationService(NotificationPublishService notificationService) {
120     this.notificationService = notificationService;
121     if (log.isDebugEnabled()) {
122       log.debug("Notification Service set to {}", notificationService == null ? NULL_PARAM : NON_NULL_PARAM);
123     }
124   }
125
126   public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
127     this.rpcRegistry = rpcRegistry;
128     if (log.isDebugEnabled()) {
129       log.debug("RpcRegistry set to {}", rpcRegistry == null ? NULL_PARAM : NON_NULL_PARAM);
130     }
131   }
132
133   @Override
134   public ListenableFuture<RpcResult<PutA1PolicyOutput>> putA1Policy(PutA1PolicyInput input) {
135     log.info("Start of putPolicy");
136     PutA1PolicyOutputBuilder putPolicyResponseBuilder = new PutA1PolicyOutputBuilder();
137
138     try {
139         final Uri uri = input.getNearRtRicUrl();
140         log.info("PUT Request input.GetA1Policy() : {} ", uri);
141         ResponseEntity<String> putPolicyResponse = restAdapter.put(uri.getValue(), input.getBody(), String.class);
142         if (putPolicyResponse.hasBody()) {
143             log.info("Response PutA1Policy : {} ", putPolicyResponse.getBody());
144             putPolicyResponseBuilder.setBody(putPolicyResponse.getBody());
145         }
146         putPolicyResponseBuilder.setHttpStatus(putPolicyResponse.getStatusCodeValue());
147     } catch (RestClientResponseException ex) {
148         log.error(REST_CLIENT_RESPONSE_EXCEPTION_MSG, ex.getMessage());
149         if (ex.getResponseBodyAsByteArray() != null) {
150             putPolicyResponseBuilder.setBody(ex.getResponseBodyAsString());
151         }
152         putPolicyResponseBuilder.setHttpStatus(ex.getRawStatusCode());
153     }
154
155     log.info("End of PutA1Policy");
156     RpcResult<PutA1PolicyOutput> rpcResult = RpcResultBuilder.<PutA1PolicyOutput>status(true)
157         .withResult(putPolicyResponseBuilder.build()).build();
158     return Futures.immediateFuture(rpcResult);
159   }
160
161   @Override
162   public ListenableFuture<RpcResult<DeleteA1PolicyOutput>> deleteA1Policy(DeleteA1PolicyInput input) {
163     log.info("Start of DeleteA1Policy");
164     DeleteA1PolicyOutputBuilder deletePolicyResponseBuilder = new DeleteA1PolicyOutputBuilder();
165
166     try {
167         final Uri uri = input.getNearRtRicUrl();
168         ResponseEntity<Object> deletePolicyResponse = restAdapter.delete(uri.getValue());
169         if (deletePolicyResponse.hasBody()) {
170             log.info("Response DeleteA1Policy : {} ", deletePolicyResponse.getBody());
171             deletePolicyResponseBuilder.setBody(deletePolicyResponse.getBody().toString());
172         }
173         deletePolicyResponseBuilder.setHttpStatus(deletePolicyResponse.getStatusCodeValue());
174     } catch (RestClientResponseException ex) {
175         log.error(REST_CLIENT_RESPONSE_EXCEPTION_MSG, ex.getMessage());
176         if (ex.getResponseBodyAsByteArray() != null) {
177             deletePolicyResponseBuilder.setBody(ex.getResponseBodyAsString());
178         }
179         deletePolicyResponseBuilder.setHttpStatus(ex.getRawStatusCode());
180     }
181
182     log.info("End of DeleteA1Policy");
183     RpcResult<DeleteA1PolicyOutput> rpcResult = RpcResultBuilder.<DeleteA1PolicyOutput>status(true)
184         .withResult(deletePolicyResponseBuilder.build()).build();
185     return Futures.immediateFuture(rpcResult);
186   }
187
188   protected GetA1PolicyOutput getA1(GetA1PolicyInput input) {
189     log.info("Start of getA1");
190     GetA1PolicyOutputBuilder getPolicyResponseBuilder = new GetA1PolicyOutputBuilder();
191
192     try {
193         final Uri uri = input.getNearRtRicUrl();
194         ResponseEntity<String> getPolicyResponse = restAdapter.get(uri.getValue(), String.class);
195         if (getPolicyResponse.hasBody()) {
196             log.info("Response getA1 : {} ", getPolicyResponse.getBody());
197             getPolicyResponseBuilder.setBody(getPolicyResponse.getBody());
198         }
199         getPolicyResponseBuilder.setHttpStatus(getPolicyResponse.getStatusCodeValue());
200     } catch (RestClientResponseException ex) {
201         log.error(REST_CLIENT_RESPONSE_EXCEPTION_MSG, ex.getMessage());
202         if (ex.getResponseBodyAsByteArray() != null) {
203             getPolicyResponseBuilder.setBody(ex.getResponseBodyAsString());
204         }
205         getPolicyResponseBuilder.setHttpStatus(ex.getRawStatusCode());
206     }
207
208     log.info("End of getA1");
209     return getPolicyResponseBuilder.build();
210   }
211
212   @Override
213   public ListenableFuture<RpcResult<GetA1PolicyOutput>> getA1Policy(GetA1PolicyInput input) {
214     GetA1PolicyOutput output = getA1(input);
215     RpcResult<GetA1PolicyOutput> rpcResult = RpcResultBuilder.<GetA1PolicyOutput>status(true).withResult(output)
216         .build();
217     return Futures.immediateFuture(rpcResult);
218   }
219
220   @Override
221   public ListenableFuture<RpcResult<GetA1PolicyStatusOutput>> getA1PolicyStatus(GetA1PolicyStatusInput input) {
222     GetA1PolicyInputBuilder getPolicyStatusInputBuilder = new GetA1PolicyInputBuilder();
223     getPolicyStatusInputBuilder.setNearRtRicUrl(input.getNearRtRicUrl());
224     GetA1PolicyOutput getOutput = getA1(getPolicyStatusInputBuilder.build());
225
226     GetA1PolicyStatusOutputBuilder getPolicyStatusoutputBuilder = new GetA1PolicyStatusOutputBuilder();
227     getPolicyStatusoutputBuilder.setBody(getOutput.getBody());
228     getPolicyStatusoutputBuilder.setHttpStatus(getOutput.getHttpStatus());
229
230     return Futures.immediateFuture(RpcResultBuilder.<GetA1PolicyStatusOutput>status(true) //
231         .withResult(getPolicyStatusoutputBuilder.build()) //
232         .build());
233   }
234
235   @Override
236   public ListenableFuture<RpcResult<GetA1PolicyTypeOutput>> getA1PolicyType(GetA1PolicyTypeInput input) {
237     GetA1PolicyInputBuilder getPolicyTypeInputBuilder = new GetA1PolicyInputBuilder();
238     getPolicyTypeInputBuilder.setNearRtRicUrl(input.getNearRtRicUrl());
239     GetA1PolicyOutput getOutput = getA1(getPolicyTypeInputBuilder.build());
240
241     GetA1PolicyTypeOutputBuilder getPolicyTypeOutputBuilder = new GetA1PolicyTypeOutputBuilder();
242     getPolicyTypeOutputBuilder.setBody(getOutput.getBody());
243     getPolicyTypeOutputBuilder.setHttpStatus(getOutput.getHttpStatus());
244
245     return Futures.immediateFuture(RpcResultBuilder.<GetA1PolicyTypeOutput>status(true) //
246         .withResult(getPolicyTypeOutputBuilder.build()) //
247         .build());
248   }
249
250 }