Code changes in BPMN infra for RAN Slice Use case
[so.git] / bpmn / so-bpmn-moi / src / main / java / org / onap / so / bpmn / moi / util / AAISliceProfileUtil.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (c) 2022 Deutsche telekom
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21
22 package org.onap.so.bpmn.moi.util;
23
24 import com.fasterxml.jackson.databind.ObjectMapper;
25 import org.onap.aai.domain.yang.*;
26 import org.onap.aaiclient.client.aai.AAIRestClientImpl;
27 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri;
28 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory;
29 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder;
30 import org.onap.so.bpmn.common.BuildingBlockExecution;
31 import org.onap.so.bpmn.common.InjectionHelper;
32 import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35 import org.springframework.beans.factory.annotation.Autowired;
36 import org.springframework.stereotype.Component;
37 import java.util.ArrayList;
38 import java.util.List;
39 import java.util.Map;
40 import java.util.Optional;
41 import java.util.stream.Collectors;
42
43 @Component
44 public class AAISliceProfileUtil {
45
46     private static final Logger LOGGER = LoggerFactory.getLogger(AAISliceProfileUtil.class);
47
48     private static final ObjectMapper mapper = new ObjectMapper();
49
50     @Autowired
51     private InjectionHelper injectionHelper;
52
53     private AAIRestClientImpl aaiRestClient = new AAIRestClientImpl();
54
55
56     public Optional<ServiceInstance> getServiceInstance(BuildingBlockExecution execution) {
57         GeneralBuildingBlock gBB = execution.getGeneralBuildingBlock();
58         String serviceInstanceId = gBB.getServiceInstance().getServiceInstanceId();
59         Customer customer = getCustomer(execution);
60
61         AAIResourceUri serviceInstanceURI =
62                 AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(customer.getGlobalCustomerId())
63                         .serviceSubscription(
64                                 customer.getServiceSubscriptions().getServiceSubscription().get(0).getServiceType())
65                         .serviceInstance(serviceInstanceId));
66         return injectionHelper.getAaiClient().get(ServiceInstance.class, serviceInstanceURI);
67     }
68
69     public void deleteSliceProfile(BuildingBlockExecution execution, String profileId) {
70         Optional<ServiceInstance> getServiceInstance = getServiceInstance(execution);
71         if (getServiceInstance.isPresent()) {
72             ServiceInstance serviceInstance = getServiceInstance.get();
73             String NssiId = serviceInstance.getServiceInstanceId();
74             LOGGER.info("NSSID {}", NssiId);
75             List<Relationship> listOfNssiRelationship = serviceInstance.getRelationshipList().getRelationship();
76
77             List<Relationship> listOfNssiRelationshipAR = listOfNssiRelationship.stream()
78                     .filter(relationship -> relationship.getRelatedTo().equalsIgnoreCase("allotted-resource"))
79                     .collect(Collectors.toList());
80             int size = listOfNssiRelationshipAR.size();
81
82             List<SliceProfile> sliceProfileList;
83             LOGGER.info("ProfileID from Request: {}", profileId);
84             boolean isDeleted = false;
85             for (Relationship relationship : listOfNssiRelationshipAR) {
86                 for (RelationshipData relationshipData : relationship.getRelationshipData()) {
87                     if (relationshipData.getRelationshipKey()
88                             .equalsIgnoreCase("service-instance.service-instance-id")) {
89                         String sliceProfileInstanceId = relationshipData.getRelationshipValue();
90                         LOGGER.debug(">>> sliceProfileInstance: {}", sliceProfileInstanceId);
91                         Optional<ServiceInstance> sliceProfile1 = aaiRestClient
92                                 .getServiceInstanceByIdWithDepth(sliceProfileInstanceId, "5G", "5GCustomer");
93                         if (sliceProfile1.isPresent()) {
94                             sliceProfileList = sliceProfile1.get().getSliceProfiles().getSliceProfile();
95                             LOGGER.info("sliceProfileList {}", sliceProfileList);
96                             for (SliceProfile slice : sliceProfileList) {
97                                 if (slice.getProfileId().equalsIgnoreCase(profileId)) {
98                                     LOGGER.info("ProfileID matched Deleting slice profile");
99                                     deleteSliceProfileFromAAI(sliceProfileInstanceId, size, execution, NssiId);
100                                     isDeleted = true;
101                                     break;
102                                 }
103                             }
104                         }
105                     }
106                     if (isDeleted)
107                         break;
108                 }
109                 if (isDeleted)
110                     break;
111             }
112         }
113     }
114
115     public void updateSliceProfile(BuildingBlockExecution execution, String profileId, SliceProfile updatedSlice) {
116         GeneralBuildingBlock gBB = execution.getGeneralBuildingBlock();
117         List<Map<String, Object>> sliceProfilesData = gBB.getRequestContext().getRequestParameters().getUserParams();
118         LOGGER.info(">>> mapParam: {}", sliceProfilesData);
119
120         Optional<ServiceInstance> getServiceInstance = getServiceInstance(execution);
121         if (getServiceInstance.isPresent()) {
122             ServiceInstance serviceInstance = getServiceInstance.get();
123             List<Relationship> listOfNssiRelationship = serviceInstance.getRelationshipList().getRelationship();
124
125             List<Relationship> listOfNssiRelationshipAR = listOfNssiRelationship.stream()
126                     .filter(relationship -> relationship.getRelatedTo().equalsIgnoreCase("allotted-resource"))
127                     .collect(Collectors.toList());
128
129             List<SliceProfile> sliceProfileList;
130             LOGGER.info("ProfileID : {}", profileId);
131             for (Relationship relationship : listOfNssiRelationshipAR) {
132                 for (RelationshipData relationshipData : relationship.getRelationshipData()) {
133                     if (relationshipData.getRelationshipKey()
134                             .equalsIgnoreCase("service-instance.service-instance-id")) {
135                         String sliceProfileInstanceId = relationshipData.getRelationshipValue();
136                         LOGGER.debug(">>> sliceProfileInstance: {}", sliceProfileInstanceId);
137
138                         Optional<ServiceInstance> sliceProfile1 = aaiRestClient
139                                 .getServiceInstanceByIdWithDepth(sliceProfileInstanceId, "5G", "5GCustomer");
140
141                         Optional<ServiceInstance> sliceProfileInstanceNodepth =
142                                 aaiRestClient.getServiceInstanceById(sliceProfileInstanceId, "5G", "5GCustomer");
143
144                         if (sliceProfile1.isPresent()) {
145                             sliceProfileList = sliceProfile1.get().getSliceProfiles().getSliceProfile();
146                             int size = sliceProfileList.size();
147                             ServiceInstance updatedSliceInstance = sliceProfileInstanceNodepth.get();
148
149                             for (SliceProfile slice : sliceProfileList) {
150                                 if (slice.getProfileId().equalsIgnoreCase(profileId)) {
151                                     LOGGER.info("Profile ID matched... updating slice profile");
152                                     updateSliceProfileInAAI(execution, sliceProfileInstanceId, updatedSlice);
153
154                                     // for update in administrativeState
155                                     updatedSliceInstance =
156                                             mapUserParamsToServiceInstance(updatedSliceInstance, sliceProfilesData);
157                                     LOGGER.info(("Updating Slice-profile Instance"));
158                                     updateSliceProfileInstance(execution, updatedSliceInstance);
159                                 }
160
161                             }
162                         }
163                     }
164
165                 }
166             }
167         }
168     }
169
170     public void updateSliceProfileInAAI(BuildingBlockExecution execution, String sliceProfileInstanceId,
171             SliceProfile sliceProfile1) {
172         Customer customer = getCustomer(execution);
173         AAIResourceUri updateSliceURI =
174                 AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(customer.getGlobalCustomerId())
175                         .serviceSubscription(
176                                 customer.getServiceSubscriptions().getServiceSubscription().get(0).getServiceType())
177                         .serviceInstance(sliceProfileInstanceId).sliceProfile(sliceProfile1.getProfileId()));
178         try {
179             injectionHelper.getAaiClient().update(updateSliceURI, sliceProfile1);
180         } catch (Exception e) {
181             LOGGER.info("Error in updating Slice Profile {}", e);
182         }
183     }
184
185     public void updateSliceProfileInstance(BuildingBlockExecution execution, ServiceInstance sliceProfileinstance) {
186         Customer customer = getCustomer(execution);
187         AAIResourceUri updateSliceURI =
188                 AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(customer.getGlobalCustomerId())
189                         .serviceSubscription(
190                                 customer.getServiceSubscriptions().getServiceSubscription().get(0).getServiceType())
191                         .serviceInstance(sliceProfileinstance.getServiceInstanceId()));
192         try {
193             injectionHelper.getAaiClient().update(updateSliceURI, sliceProfileinstance);
194         } catch (Exception e) {
195             LOGGER.info("Error in updating Slice Profile instance {}", e);
196         }
197     }
198
199     public void deleteSliceProfileFromAAI(String serviceInstanceID, int size, BuildingBlockExecution execution,
200             String NssiId) {
201         Customer customer = getCustomer(execution);
202
203         AAIResourceUri deleteInstanceURI =
204                 AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(customer.getGlobalCustomerId())
205                         .serviceSubscription(
206                                 customer.getServiceSubscriptions().getServiceSubscription().get(0).getServiceType())
207                         .serviceInstance(serviceInstanceID));
208         try {
209             injectionHelper.getAaiClient().delete(deleteInstanceURI);
210             LOGGER.info("Slice Profile Instance with ID {} deleted", serviceInstanceID);
211         } catch (Exception e) {
212             LOGGER.info("Error in deleting Slice Profile instace {}", e);
213         }
214         LOGGER.info(">>>> Size : {}", size);
215         if (size == 1) {
216             AAIResourceUri serviceInstanceURI = AAIUriFactory
217                     .createResourceUri(AAIFluentTypeBuilder.business().customer(customer.getGlobalCustomerId())
218                             .serviceSubscription(
219                                     customer.getServiceSubscriptions().getServiceSubscription().get(0).getServiceType())
220                             .serviceInstance(NssiId));
221             // Delete NSSI
222             try {
223                 injectionHelper.getAaiClient().delete(serviceInstanceURI);
224                 LOGGER.info("deleted Slice Prfile as well ass NSSI {}", NssiId);
225             } catch (Exception e) {
226                 LOGGER.info("Error in deleting NSSI {}", e);
227             }
228
229         }
230
231     }
232
233     private Customer getCustomer(BuildingBlockExecution execution) {
234
235         GeneralBuildingBlock gBB = execution.getGeneralBuildingBlock();
236
237         String serviceType = gBB.getCustomer().getServiceSubscription().getServiceType();
238
239         String globalCustomerId = gBB.getCustomer().getGlobalCustomerId();
240
241         ServiceSubscription serviceSubscription = new ServiceSubscription();
242         serviceSubscription.setServiceType(serviceType);
243
244         ServiceSubscriptions serviceSubscriptions = new ServiceSubscriptions();
245         serviceSubscriptions.getServiceSubscription().add(serviceSubscription);
246
247         Customer customer = new Customer();
248         customer.setGlobalCustomerId(globalCustomerId);
249         customer.setServiceSubscriptions(serviceSubscriptions);
250
251         return customer;
252
253     }
254
255     private ServiceInstance mapUserParamsToServiceInstance(ServiceInstance sliceProfileServiceInstanceObj,
256             List<Map<String, Object>> sliceProfilesData) {
257         Map<String, Object> mapParam = (Map<String, Object>) sliceProfilesData.get(0).get("nssi");
258         LOGGER.info(">>> mapParam: {}", mapParam);
259
260         // update administrative State
261         String administrativeState = (String) mapParam.get("administrativeState");
262         if (administrativeState != null) {
263             LOGGER.info(">>> administrativeState: {}", administrativeState);
264             sliceProfileServiceInstanceObj.setOperationalStatus(administrativeState);
265         }
266
267         String operationalState = (String) mapParam.get("operationalState");
268         if (operationalState != null) {
269             LOGGER.info(">>> operationalState: {}", operationalState);
270             sliceProfileServiceInstanceObj.setOrchestrationStatus(operationalState);
271         }
272         List<Object> list = (ArrayList<Object>) mapParam.get("sliceProfileList");
273         LOGGER.info(">>> sliceProfile List: {}", list);
274         Map<String, Object> idMap = (Map<String, Object>) list.get(0);
275         LOGGER.info("Keys of Id Map {} ", idMap.keySet());
276
277         return sliceProfileServiceInstanceObj;
278     }
279 }