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