66af597edeba57e1accb04c011ecf4a7852fed72
[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.base.Optional;
24 import com.google.common.util.concurrent.CheckedFuture;
25 import com.google.common.util.concurrent.Futures;
26 import com.google.common.util.concurrent.ListenableFuture;
27 import java.text.DateFormat;
28 import java.text.SimpleDateFormat;
29 import java.util.ArrayList;
30 import java.util.Date;
31 import java.util.List;
32 import java.util.TimeZone;
33 import java.util.concurrent.ExecutionException;
34 import java.util.concurrent.ExecutorService;
35 import java.util.concurrent.Executors;
36 import org.json.JSONObject;
37 import org.onap.sdnc.northbound.restadpter.NearRicUrlProvider;
38 import org.onap.sdnc.northbound.restadpter.RestAdapter;
39 import org.onap.sdnc.northbound.restadpter.RestAdapterImpl;
40 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
41 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
42 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
43 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
44 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
45 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
46 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.A1ADAPTERAPIService;
47 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.CreatePolicyInstanceInput;
48 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.CreatePolicyInstanceOutput;
49 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.CreatePolicyInstanceOutputBuilder;
50 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.CreatePolicyTypeInput;
51 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.CreatePolicyTypeOutput;
52 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.CreatePolicyTypeOutputBuilder;
53 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.DeletePolicyInstanceInput;
54 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.DeletePolicyInstanceOutput;
55 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.DeletePolicyInstanceOutputBuilder;
56 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.DeletePolicyTypeInput;
57 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.DeletePolicyTypeOutput;
58 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.DeletePolicyTypeOutputBuilder;
59 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetHealthCheckInput;
60 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetHealthCheckOutput;
61 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetHealthCheckOutputBuilder;
62 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetNearRTRICsInput;
63 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetNearRTRICsOutput;
64 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetNearRTRICsOutputBuilder;
65 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyInstanceInput;
66 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyInstanceOutput;
67 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyInstanceOutputBuilder;
68 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyInstancesInput;
69 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyInstancesOutput;
70 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyInstancesOutputBuilder;
71 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyTypeInput;
72 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyTypeOutput;
73 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyTypeOutputBuilder;
74 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyTypesInput;
75 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyTypesOutput;
76 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetPolicyTypesOutputBuilder;
77 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetStatusInput;
78 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetStatusOutput;
79 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.a1.adapter.rev191002.GetStatusOutputBuilder;
80 import org.opendaylight.yangtools.yang.common.RpcResult;
81 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
82 import org.slf4j.Logger;
83 import org.slf4j.LoggerFactory;
84
85 /**
86  * Defines a base implementation for your provider. This class overrides the generated interface
87  * from the YANG model and implements the request model for the A1 interface. This class identifies
88  * the Near-RIC throught the IP passed over the payload and calls the corresponding Near-RIC over
89  * Rest API
90  *
91  * <pre>
92  *
93  * @author lathishbabu.ganesan@est.tech
94  *
95  */
96
97 public class NonrtRicApiProvider implements AutoCloseable, A1ADAPTERAPIService {
98
99   protected static final String APP_NAME = "nonrt-ric-api";
100   protected static final String NO_SERVICE_LOGIC_ACTIVE = "No service logic active for ";
101   private static final String NON_NULL_PARAM = "non-null";
102   private static final String NULL_PARAM = "null";
103   private static final String RESPONSE_SUCCESS = "Success";
104   private static final String RESPONSE_CODE_SUCCESS = "200";
105
106   private final Logger log = LoggerFactory.getLogger(NonrtRicApiProvider.class);
107   private final ExecutorService executor;
108
109   protected DataBroker dataBroker;
110   protected NotificationPublishService notificationService;
111   protected RpcProviderRegistry rpcRegistry;
112   protected BindingAwareBroker.RpcRegistration<?> rpcRegistration;
113   private RestAdapter restAdapter;
114   private NearRicUrlProvider nearRicUrlProvider;
115
116   public NonrtRicApiProvider(DataBroker dataBroker,
117       NotificationPublishService notificationPublishService,
118       RpcProviderRegistry rpcProviderRegistry) {
119     log.info("Creating provider for {}", APP_NAME);
120     executor = Executors.newFixedThreadPool(1);
121     setDataBroker(dataBroker);
122     setNotificationService(notificationPublishService);
123     setRpcRegistry(rpcProviderRegistry);
124     initialize();
125
126   }
127
128   public void initialize() {
129     log.info("Initializing provider for {}", APP_NAME);
130     createContainers();
131     restAdapter = new RestAdapterImpl();
132     nearRicUrlProvider = new NearRicUrlProvider();
133     log.info("Initialization complete for {}", APP_NAME);
134   }
135
136   protected void initializeChild() {
137     // Override if you have custom initialization intelligence
138   }
139
140   @Override
141   public void close() throws Exception {
142     log.info("Closing provider for {}", APP_NAME);
143     executor.shutdown();
144     rpcRegistration.close();
145     log.info("Successfully closed provider for {}", APP_NAME);
146   }
147
148   private static class Iso8601Util {
149
150     private static TimeZone timeZone = TimeZone.getTimeZone("UTC");
151     private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
152
153     private Iso8601Util() {}
154
155     static {
156       dateFormat.setTimeZone(timeZone);
157     }
158
159     private static String now() {
160       return dateFormat.format(new Date());
161     }
162   }
163
164   public void setDataBroker(DataBroker dataBroker) {
165     this.dataBroker = dataBroker;
166     if (log.isDebugEnabled()) {
167       log.debug("DataBroker set to {}", dataBroker == null ? NULL_PARAM : NON_NULL_PARAM);
168     }
169   }
170
171   public void setNotificationService(NotificationPublishService notificationService) {
172     this.notificationService = notificationService;
173     if (log.isDebugEnabled()) {
174       log.debug("Notification Service set to {}",
175           notificationService == null ? NULL_PARAM : NON_NULL_PARAM);
176     }
177   }
178
179   public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
180     this.rpcRegistry = rpcRegistry;
181     if (log.isDebugEnabled()) {
182       log.debug("RpcRegistry set to {}", rpcRegistry == null ? NULL_PARAM : NON_NULL_PARAM);
183     }
184   }
185
186   private void createContainers() {
187
188     final WriteTransaction t = dataBroker.newReadWriteTransaction();
189
190     try {
191       CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = t.submit();
192       checkedFuture.get();
193       log.info("Create containers succeeded!");
194
195     } catch (InterruptedException | ExecutionException e) {
196       log.error("Create containers failed: ", e);
197     }
198   }
199
200   @Override
201   public ListenableFuture<RpcResult<CreatePolicyInstanceOutput>> createPolicyInstance(
202       CreatePolicyInstanceInput input) {
203     log.info("Start of createPolicyInstance");
204     String uri = nearRicUrlProvider.getPolicyInstanceId(String.valueOf(input.getNearRtRicId()),
205             String.valueOf(input.getPolicyTypeId()), String.valueOf(input.getPolicyInstanceId()));
206     log.info("PUT Request input.getPolicyInstance() : {} ", input.getPolicyInstance());
207     restAdapter.put(uri, input.getPolicyInstance());
208     CreatePolicyInstanceOutputBuilder responseBuilder = new CreatePolicyInstanceOutputBuilder();
209     log.info("End of createPolicyInstance");
210     RpcResult<CreatePolicyInstanceOutput> rpcResult = RpcResultBuilder
211         .<CreatePolicyInstanceOutput>status(true).withResult(responseBuilder.build()).build();
212     return Futures.immediateFuture(rpcResult);
213   }
214
215   @Override
216   public ListenableFuture<RpcResult<CreatePolicyTypeOutput>> createPolicyType(
217       CreatePolicyTypeInput input) {
218     log.info("Start of createPolicyType");
219     String uri = nearRicUrlProvider.getPolicyTypeId(String.valueOf(input.getNearRtRicId()),
220             String.valueOf(input.getPolicyTypeId()));
221     log.info("PUT Request input.getPolicyType() : {} ", input.getPolicyType());
222     restAdapter.put(uri, input.getPolicyType());
223     CreatePolicyTypeOutputBuilder responseBuilder = new CreatePolicyTypeOutputBuilder();
224     responseBuilder.setCode(RESPONSE_CODE_SUCCESS);
225     responseBuilder.setStatus(RESPONSE_SUCCESS);
226     log.info("End of createPolicyType");
227     RpcResult<CreatePolicyTypeOutput> rpcResult = RpcResultBuilder
228         .<CreatePolicyTypeOutput>status(true).withResult(responseBuilder.build()).build();
229     return Futures.immediateFuture(rpcResult);
230   }
231
232   @Override
233   public ListenableFuture<RpcResult<DeletePolicyInstanceOutput>> deletePolicyInstance(
234       DeletePolicyInstanceInput input) {
235     log.info("Start of deletePolicyInstance");
236     String uri = nearRicUrlProvider.getPolicyInstanceId(String.valueOf(input.getNearRtRicId()),
237             String.valueOf(input.getPolicyTypeId()), String.valueOf(input.getPolicyInstanceId()));
238     restAdapter.delete(uri);
239     DeletePolicyInstanceOutputBuilder responseBuilder = new DeletePolicyInstanceOutputBuilder();
240     log.info("End of deletePolicyInstance");
241     RpcResult<DeletePolicyInstanceOutput> rpcResult = RpcResultBuilder
242         .<DeletePolicyInstanceOutput>status(true).withResult(responseBuilder.build()).build();
243     return Futures.immediateFuture(rpcResult);
244   }
245
246   @Override
247   public ListenableFuture<RpcResult<DeletePolicyTypeOutput>> deletePolicyType(
248       DeletePolicyTypeInput input) {
249     log.info("Start of deletePolicyType");
250     String uri = nearRicUrlProvider.getPolicyTypeId(String.valueOf(input.getNearRtRicId()),
251             String.valueOf(input.getPolicyTypeId()));
252     restAdapter.delete(uri);
253     DeletePolicyTypeOutputBuilder responseBuilder = new DeletePolicyTypeOutputBuilder();
254     log.info("End of deletePolicyType");
255     RpcResult<DeletePolicyTypeOutput> rpcResult = RpcResultBuilder
256         .<DeletePolicyTypeOutput>status(true).withResult(responseBuilder.build()).build();
257     return Futures.immediateFuture(rpcResult);
258   }
259
260   @Override
261   public ListenableFuture<RpcResult<GetHealthCheckOutput>> getHealthCheck(
262       GetHealthCheckInput input) {
263     log.info("Start of getHealthCheck");
264     String uri = nearRicUrlProvider.getHealthCheck(String.valueOf(input.getNearRtRicId()));
265     restAdapter.get(uri, String.class);
266     GetHealthCheckOutputBuilder responseBuilder = new GetHealthCheckOutputBuilder();
267     responseBuilder.setHealthStatus(true);
268     log.info("End of getHealthCheck");
269     RpcResult<GetHealthCheckOutput> rpcResult = RpcResultBuilder.<GetHealthCheckOutput>status(true)
270         .withResult(responseBuilder.build()).build();
271     return Futures.immediateFuture(rpcResult);
272   }
273
274   @Override
275   public ListenableFuture<RpcResult<GetNearRTRICsOutput>> getNearRTRICs(GetNearRTRICsInput input) {
276       log.info("Start of getNearRTRICs");
277       GetNearRTRICsOutputBuilder responseBuilder = new GetNearRTRICsOutputBuilder();
278       responseBuilder.setNearRtRicIdList(nearRicUrlProvider.getNearRTRicIdsList());
279       log.info("End of getNearRTRICs");
280       RpcResult<GetNearRTRICsOutput> rpcResult = RpcResultBuilder.<GetNearRTRICsOutput>status(true)
281           .withResult(responseBuilder.build()).build();
282       return Futures.immediateFuture(rpcResult);
283   }
284
285   @Override
286   public ListenableFuture<RpcResult<GetPolicyInstanceOutput>> getPolicyInstance(
287       GetPolicyInstanceInput input) {
288     log.info("Start of getPolicyInstance");
289     log.info("Policy Type Id : {},  Policy Instance Id : {}", input.getPolicyTypeId(), input.getPolicyInstanceId());
290     String uri = nearRicUrlProvider.getPolicyInstanceId(String.valueOf(input.getNearRtRicId()),
291             String.valueOf(input.getPolicyTypeId()), String.valueOf(input.getPolicyInstanceId()));
292     Optional<String> policyInstance = restAdapter.get(uri, String.class);
293     GetPolicyInstanceOutputBuilder responseBuilder = new GetPolicyInstanceOutputBuilder();
294     if (policyInstance.isPresent()) {
295         log.info("Response policyInstance.get() : {} ", policyInstance.get());
296         responseBuilder.setPolicyInstance(policyInstance.get());
297     }
298     log.info("End of getPolicyInstance");
299     RpcResult<GetPolicyInstanceOutput> rpcResult = RpcResultBuilder
300         .<GetPolicyInstanceOutput>status(true).withResult(responseBuilder.build()).build();
301     return Futures.immediateFuture(rpcResult);
302   }
303
304   @Override
305   public ListenableFuture<RpcResult<GetPolicyInstancesOutput>> getPolicyInstances(
306       GetPolicyInstancesInput input) {
307     log.info("Start of getPolicyInstances");
308     String uri = nearRicUrlProvider.getPolicyInstances(String.valueOf(input.getNearRtRicId()),
309             String.valueOf(input.getPolicyTypeId()));
310     Optional<List<String>> policyInstances = restAdapter.get(uri, List.class);
311     GetPolicyInstancesOutputBuilder responseBuilder = new GetPolicyInstancesOutputBuilder();
312     if (policyInstances.isPresent()) {
313       log.info("Response policyInstances.get() : {} ", policyInstances.get());
314       responseBuilder.setPolicyInstanceIdList(policyInstances.get());
315     }
316     log.info("End of getPolicyInstances");
317     RpcResult<GetPolicyInstancesOutput> rpcResult = RpcResultBuilder
318         .<GetPolicyInstancesOutput>status(true).withResult(responseBuilder.build()).build();
319     return Futures.immediateFuture(rpcResult);
320   }
321
322   @Override
323   public ListenableFuture<RpcResult<GetPolicyTypeOutput>> getPolicyType(GetPolicyTypeInput input) {
324     log.info("Start of getPolicyType");
325     log.info("Policy Type Id : {} ", input.getPolicyTypeId());
326     String uri = nearRicUrlProvider.getPolicyTypeId(String.valueOf(input.getNearRtRicId()),
327             String.valueOf(input.getPolicyTypeId()));
328     Optional<String> policyType = restAdapter.get(uri, String.class);
329     GetPolicyTypeOutputBuilder responseBuilder = new GetPolicyTypeOutputBuilder();
330     if (policyType.isPresent()) {
331       log.info("Response policyType.get() : {} ", policyType.get());
332       JSONObject policyTypeObj = new JSONObject(policyType.get());
333       responseBuilder.setDescription(policyTypeObj.getString("description"));
334       responseBuilder.setName(policyTypeObj.getString("name"));
335       responseBuilder.setPolicyType(policyTypeObj.getJSONObject("create_schema").toString());
336     }
337     log.info("End of getPolicyType");
338     RpcResult<GetPolicyTypeOutput> rpcResult = RpcResultBuilder.<GetPolicyTypeOutput>status(true)
339         .withResult(responseBuilder.build()).build();
340     return Futures.immediateFuture(rpcResult);
341   }
342
343   @Override
344   public ListenableFuture<RpcResult<GetPolicyTypesOutput>> getPolicyTypes(
345       GetPolicyTypesInput input) {
346     log.info("Start of getPolicyTypes");
347     String uri = nearRicUrlProvider.getPolicyTypes(String.valueOf(input.getNearRtRicId()));
348     Optional<List<Integer>> policyTypes = restAdapter.get(uri, List.class);
349     GetPolicyTypesOutputBuilder responseBuilder = new GetPolicyTypesOutputBuilder();
350     if (policyTypes.isPresent()) {
351         log.info("Response policyTypes.get() : {} ", policyTypes.get());
352         List<Integer> policyTypesListInteger = policyTypes.get();
353         List<Long> policyTypesListLong = new ArrayList<>();
354         for(Integer i : policyTypesListInteger){
355             policyTypesListLong.add(i.longValue());
356         }
357         responseBuilder.setPolicyTypeIdList(policyTypesListLong);
358     }
359     log.info("End of getPolicyTypes");
360     RpcResult<GetPolicyTypesOutput> rpcResult = RpcResultBuilder.<GetPolicyTypesOutput>status(true)
361         .withResult(responseBuilder.build()).build();
362     return Futures.immediateFuture(rpcResult);
363   }
364
365   @Override
366   public ListenableFuture<RpcResult<GetStatusOutput>> getStatus(GetStatusInput input) {
367     log.info("Start of getStatus");
368     String uri = nearRicUrlProvider.getPolicyInstanceIdStatus(String.valueOf(input.getNearRtRicId()),
369         String.valueOf(input.getPolicyTypeId()), String.valueOf(input.getPolicyInstanceId()));
370     Optional<String> status = restAdapter.get(uri, String.class);
371     GetStatusOutputBuilder responseBuilder = new GetStatusOutputBuilder();
372     if (status.isPresent()) {
373         log.info("Response status.get() : {} ", status.get());
374         JSONObject statusObj = new JSONObject(status.get());
375         responseBuilder.setStatus(statusObj.getString("status"));
376     }
377     log.info("End of getStatus");
378     RpcResult<GetStatusOutput> rpcResult =
379         RpcResultBuilder.<GetStatusOutput>status(true).withResult(responseBuilder.build()).build();
380     return Futures.immediateFuture(rpcResult);
381   }
382 }