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