Fix for executing core NSSMF activate flow
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoActivateCoreNSSI.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2020  Tech Mahindra
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 package org.onap.so.bpmn.infrastructure.scripts
22
23 import javax.ws.rs.NotFoundException
24 import javax.ws.rs.core.Response
25 import org.camunda.bpm.engine.delegate.BpmnError
26 import org.camunda.bpm.engine.delegate.DelegateExecution
27 import org.onap.aai.domain.yang.GenericVnf
28 import org.onap.aai.domain.yang.RelatedToProperty
29 import org.onap.aai.domain.yang.Relationship
30 import org.onap.aai.domain.yang.RelationshipData
31 import org.onap.aai.domain.yang.ServiceInstance
32 import org.onap.aaiclient.client.aai.AAIObjectName
33 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
34 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
35 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
36 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder
37 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder.Types
38 import org.onap.logging.filter.base.ONAPComponents
39 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
40 import org.onap.so.bpmn.common.scripts.CatalogDbUtils
41 import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
42 import org.onap.so.bpmn.common.scripts.ExceptionUtil
43 import org.onap.so.bpmn.common.scripts.RequestDBUtil
44 import org.onap.so.bpmn.core.UrnPropertiesReader
45 import org.onap.so.bpmn.core.json.JsonUtils
46 import org.onap.so.client.HttpClient
47 import org.onap.so.db.request.beans.ResourceOperationStatus
48 import org.onap.so.serviceinstancebeans.CloudConfiguration
49 import org.onap.so.serviceinstancebeans.LineOfBusiness
50 import org.onap.so.serviceinstancebeans.ModelInfo
51 import org.onap.so.serviceinstancebeans.ModelType
52 import org.onap.so.serviceinstancebeans.OwningEntity
53 import org.onap.so.serviceinstancebeans.Platform
54 import org.onap.so.serviceinstancebeans.Project
55 import org.onap.so.serviceinstancebeans.RequestDetails
56 import org.onap.so.serviceinstancebeans.RequestInfo
57 import org.onap.so.serviceinstancebeans.RequestParameters
58 import org.onap.so.serviceinstancebeans.SubscriberInfo
59 import org.slf4j.Logger
60 import org.slf4j.LoggerFactory
61 import com.fasterxml.jackson.databind.ObjectMapper
62
63 class DoActivateCoreNSSI extends AbstractServiceTaskProcessor {
64     String Prefix="DACTCNSSI_"
65     private static final Logger logger = LoggerFactory.getLogger(DoActivateCoreNSSI.class);
66     CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
67     private RequestDBUtil requestDBUtil = new RequestDBUtil()
68     ExceptionUtil exceptionUtil = new ExceptionUtil()
69     ObjectMapper mapper = new ObjectMapper();
70
71     JsonUtils jsonUtil = new JsonUtils()
72
73     private final Long TIMEOUT = 60 * 60 * 1000
74
75     @Override
76     public void preProcessRequest(DelegateExecution execution) {
77         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: preProcessRequest ****")
78
79         String operationType = execution.getVariable("operationType")
80         String oStatus= ""
81         if(operationType.equals("activateInstance")) {
82             oStatus ="activated"
83         } else {
84             oStatus ="deactivated"
85         }
86         execution.setVariable("oStatus", oStatus)
87         String sNssaiListAsString = jsonUtil.getJsonValue(execution.getVariable("sliceParams"), "snssaiList")
88         List<String> sNssaiList = jsonUtil.StringArrayToList(sNssaiListAsString)
89         String sNssai = sNssaiList.get(0)
90         execution.setVariable("sNssai", sNssai)
91         String serviceType = execution.getVariable("subscriptionServiceType")
92         execution.setVariable("serviceType", serviceType)
93                 logger.debug("operationType: {} , sNssai: {}, serviceType: {}.",operationType, sNssai, serviceType)
94         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: preProcessRequest ****")
95     }
96
97     public void getNetworkInstanceWithSPInstanceAssociatedWithNssiId(DelegateExecution execution) {
98         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: getNetworkInstanceWithSPInstanceAssociatedWithNssiId ****")
99         //NSSI Id as service Instance Id to get from Request
100         String serviceInstanceId = execution.getVariable("serviceInstanceID")
101         String errorMsg = "query Network Service Instance from AAI failed"
102         AAIResultWrapper wrapper = queryAAI(execution, Types.SERVICE_INSTANCE, serviceInstanceId, errorMsg)
103         Optional<ServiceInstance> nsi = wrapper.asBean(ServiceInstance.class)
104         String networkServiceInstanceName = ""
105         String networkServiceInstanceId =""
106         if(nsi.isPresent()) {
107             List<Relationship> relationshipList = nsi.get().getRelationshipList()?.getRelationship()
108             List spiWithsNssaiAndOrchStatusList = new ArrayList<>()
109
110             for (Relationship relationship : relationshipList) {
111                 String relatedTo = relationship.getRelatedTo()
112                 if ("service-instance".equals(relatedTo)) {
113                     List<RelationshipData> relationshipDataList = relationship.getRelationshipData()
114                     List<RelatedToProperty> relatedToPropertyList = relationship.getRelatedToProperty()
115                     for (RelationshipData relationshipData : relationshipDataList) {
116                         if ("service-instance.service-instance-id".equals(relationshipData.getRelationshipKey())) {
117                             //Query Every related Service Instance From AAI by service Instance ID
118                             AAIResultWrapper instanceWrapper = queryAAI(execution, Types.SERVICE_INSTANCE, relationshipData.getRelationshipValue(), "No Instance Present")
119                             Optional<ServiceInstance> relatedServiceInstance = instanceWrapper.asBean(ServiceInstance.class)
120                             if (relatedServiceInstance.isPresent()) {
121                                 ServiceInstance relatedServiceInstanceObj = relatedServiceInstance.get()
122                                 String role = relatedServiceInstanceObj.getServiceRole();
123
124                                 if(role == null || role.isEmpty()) {
125                                     networkServiceInstanceId = relatedServiceInstanceObj.getServiceInstanceId()
126                                     networkServiceInstanceName = relatedServiceInstanceObj.getServiceInstanceName()
127                                     logger.debug("networkServiceInstanceId: {} networkServiceInstanceName: {} ",networkServiceInstanceId, networkServiceInstanceName)
128                                     execution.setVariable("networkServiceInstanceId", networkServiceInstanceId)
129                                     execution.setVariable("networkServiceInstanceName", networkServiceInstanceName)
130                                 } else if("slice-profile".equals(role)) {
131                                     String orchestrationStatus= relatedServiceInstanceObj.getOrchestrationStatus()
132                                     String sNssai = relatedServiceInstanceObj.getEnvironmentContext()
133                                     if(sNssai.equals(execution.getVariable("sNssai"))) {
134                                         orchestrationStatus = execution.getVariable("oStatus")
135                                         //Slice Profile Service Instance to be updated in AAI
136                                         execution.setVariable("sliceProfileServiceInstance", relatedServiceInstanceObj)
137                                     }
138                                     Map<String, Object> spiWithsNssaiAndOrchStatus = new LinkedHashMap<>()
139                                     spiWithsNssaiAndOrchStatus.put("snssai", sNssai)
140                                     spiWithsNssaiAndOrchStatus.put("status", orchestrationStatus)
141                                     spiWithsNssaiAndOrchStatusList.add(spiWithsNssaiAndOrchStatus)
142                                     logger.debug("service Profile's NSSAI And Orchestration Status:  "+spiWithsNssaiAndOrchStatus)
143                                 }
144                             }
145                         }
146                     }
147                 }
148             }
149             execution.setVariable("snssaiAndOrchStatusList", spiWithsNssaiAndOrchStatusList)
150         }
151         logger.debug("NSSI Id: ${serviceInstanceId}, network Service Instance Id: ${networkServiceInstanceId}, serviceName: ${networkServiceInstanceName}")
152         //Get ServiceInstance Relationships
153         getServiceInstanceRelationships(execution)
154         //Get Vnf Relationships
155         getVnfRelationships(execution)
156         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: getNetworkInstanceWithSPInstanceAssociatedWithNssiId ****")
157     }
158
159
160     private String prepareVnfInstanceParamsJson(DelegateExecution execution) {
161         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: prepareVnfInstanceParamsJson ****")
162         List instanceParamsvalues = execution.getVariable("snssaiAndOrchStatusList")
163         Map<String, Object> nSsai= new LinkedHashMap<>()
164         nSsai.put("sNssai", instanceParamsvalues)
165         String supportedsNssaiJson = mapper.writeValueAsString(nSsai)
166         logger.debug(Prefix+" **** Exit DoActivateCoreNSSI ::: prepareVnfInstanceParamsJson ****")
167         return supportedsNssaiJson
168     }
169
170     private void getServiceInstanceRelationships(DelegateExecution execution) {
171         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: getServiceInstanceRelationships ****")
172         String serviceInstanceId = execution.getVariable("networkServiceInstanceId")
173         String errorMsg = "query Network Service Instance from AAI failed"
174         AAIResultWrapper wrapper = queryAAI(execution, Types.SERVICE_INSTANCE, serviceInstanceId, errorMsg)
175         Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
176
177         String networkServiceModelInvariantUuid = si.get().getModelInvariantId()
178         execution.setVariable("networkServiceModelInvariantUuid", networkServiceModelInvariantUuid)
179         if(si.isPresent()) {
180             List<Relationship> relationshipList = si.get().getRelationshipList()?.getRelationship()
181             for (Relationship relationship : relationshipList) {
182                 String relatedTo = relationship.getRelatedTo()
183                 if (("owning-entity").equals(relatedTo)) {
184                     List<RelationshipData> relationshipDataList = relationship.getRelationshipData()
185                     for (RelationshipData relationshipData : relationshipDataList) {
186                         if (("owning-entity.owning-entity-id").equals(relationshipData.getRelationshipKey())) {
187                             execution.setVariable("owningEntityId", relationshipData.getRelationshipValue())
188                         }
189                     }
190                 } else if (("generic-vnf").equals(relatedTo)) {
191                     List<RelationshipData> relationshipDataList = relationship.getRelationshipData()
192                     List<RelatedToProperty> relatedToPropertyList = relationship.getRelatedToProperty()
193
194                     //Get VnfId
195                     for (RelationshipData relationshipData : relationshipDataList) {
196                         if (("generic-vnf.vnf-id").equals(relationshipData.getRelationshipKey())) {
197                             execution.setVariable("vnfId", relationshipData.getRelationshipValue())
198                         }
199                     }
200                     //Get Vnf Name Check If necessary
201                     for (RelatedToProperty relatedToProperty : relatedToPropertyList) {
202                         if (("generic-vnf.vnf-name").equals(relatedToProperty.getPropertyKey())) {
203                             execution.setVariable("vnfName", relatedToProperty.getPropertyValue())
204                         }
205                     }
206                 } else if (("project").equals(relatedTo)) {
207                     List<RelationshipData> relationshipDataList = relationship.getRelationshipData()
208                     for (RelationshipData relationshipData : relationshipDataList) {
209                         if (("project.project-name").equals(relationshipData.getRelationshipKey())) {
210                             execution.setVariable("projectName", relationshipData.getRelationshipValue())
211                         }
212                     }
213                 }
214             }
215             logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: getServiceInstanceRelationships ****")
216         }
217     }
218
219     private void getVnfRelationships(DelegateExecution execution) {
220
221         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: getVnfRelationships ****")
222         String msg = "query Generic Vnf from AAI failed"
223         try {
224             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().genericVnf(execution.getVariable('vnfId')))
225             if (!getAAIClient().exists(uri)) {
226                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg)
227             }
228             AAIResultWrapper wrapper = getAAIClient().get(uri, NotFoundException.class)
229             Optional<GenericVnf> vnf = wrapper.asBean(GenericVnf.class)
230             if(vnf.isPresent()) {
231                 List<Relationship> relationshipList = vnf.get().getRelationshipList()?.getRelationship()
232                 for (Relationship relationship : relationshipList) {
233                     String relatedTo = relationship.getRelatedTo()
234                     if (("tenant").equals(relatedTo)) {
235                         List<RelationshipData> relationshipDataList = relationship.getRelationshipData()
236                         for (RelationshipData relationshipData : relationshipDataList) {
237                             if (("tenant.tenant-id").equals(relationshipData.getRelationshipKey())) {
238                                 execution.setVariable("tenantId", relationshipData.getRelationshipValue())
239                             }
240                         }
241                     } else if (("cloud-region").equals(relatedTo)) {
242                         List<RelationshipData> relationshipDataList = relationship.getRelationshipData()
243
244                         for (RelationshipData relationshipData : relationshipDataList) {
245                             if (("cloud-region.cloud-owner").equals(relationshipData.getRelationshipKey())) {
246                                 execution.setVariable("cloudOwner", relationshipData.getRelationshipValue())
247                             } else if (("cloud-region.cloud-region-id").equals(relationshipData.getRelationshipKey())) {
248                                 execution.setVariable("lcpCloudRegionId", relationshipData.getRelationshipValue())
249                             }
250                         }
251                     } else if (("platform").equals(relatedTo)) {
252                         List<RelationshipData> relationshipDataList = relationship.getRelationshipData()
253                         for (RelationshipData relationshipData : relationshipDataList) {
254                             if (("platform.platform-name").equals(relationshipData.getRelationshipKey())) {
255                                 execution.setVariable("platformName", relationshipData.getRelationshipValue())
256                             }
257                         }
258                     } else if (("line-of-business").equals(relatedTo)) {
259                         List<RelationshipData> relationshipDataList = relationship.getRelationshipData()
260                         for (RelationshipData relationshipData : relationshipDataList) {
261                             if (("line-of-business.line-of-business-name").equals(relationshipData.getRelationshipKey())) {
262                                 execution.setVariable("lineOfBusinessName", relationshipData.getRelationshipValue())
263                             }
264                         }
265                     }
266                 }
267             }
268         } catch(BpmnError e){
269             throw e
270         } catch (Exception ex){
271             msg = "Exception in getVnfRelationships " + ex.getMessage()
272             logger.debug(msg)
273             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
274         }
275         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: getVnfRelationships ****")
276     }
277
278
279     /**
280      * query AAI
281      * @param execution
282      * @param aaiObjectType
283      * @param instanceId
284      * @return AAIResultWrapper
285      */
286     private AAIResultWrapper queryAAI(DelegateExecution execution, AAIObjectName aaiObjectName, String instanceId, String errorMsg) {
287         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: queryAAI ****")
288
289         String globalSubscriberId = execution.getVariable("globalSubscriberId")
290         String serviceType = execution.getVariable("serviceType")
291
292         AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(globalSubscriberId).serviceSubscription(serviceType).serviceInstance(instanceId))
293         if (!getAAIClient().exists(resourceUri)) {
294             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMsg)
295         }
296         AAIResultWrapper wrapper = getAAIClient().get(resourceUri, NotFoundException.class)
297
298         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: queryAAI ****")
299         return wrapper
300     }
301
302     public void getServiceVNFAndVFsFromCatalogDB(DelegateExecution execution) {
303         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: getServiceVNFAndVFsFromCatalogDB ****")
304
305         String modelInvariantUuid = execution.getVariable("networkServiceModelInvariantUuid")
306
307         try{
308             CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
309             String json = catalogDbUtils.getServiceResourcesByServiceModelInvariantUuidString(execution, modelInvariantUuid)
310             logger.debug("***** JSON IS: "+json)
311
312             String serviceVnfs = jsonUtil.getJsonValue(json, "serviceResources.serviceVnfs") ?: ""
313             String serviceModelInfo = jsonUtil.getJsonValue(json, "serviceResources.modelInfo") ?: ""
314             execution.setVariable("serviceVnfs",serviceVnfs)
315             execution.setVariable("serviceModelInfo", serviceModelInfo)
316             logger.debug(Prefix +" ***** serviceVnfs : "+ serviceVnfs)
317         }catch(BpmnError e){
318             throw e
319         } catch (Exception ex){
320             String msg = "Exception in getServiceVNFAndVFsFromCatalogDB " + ex.getMessage()
321             logger.debug(msg)
322             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
323         }
324         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: getServiceVNFAndVFsFromCatalogDB ****")
325     }
326
327     public void prepareSOMacroRequestPayLoad(DelegateExecution execution) {
328         logger.debug("**** Enter DoActivateCoreNSSI ::: prepareSOMacroRequestPayLoad ****")
329         String json = execution.getVariable("serviceVnfs")
330         List<Object> vnfList = mapper.readValue(json, List.class);
331         Map<String,Object> serviceMap = mapper.readValue(execution.getVariable("serviceModelInfo"), Map.class);
332         ModelInfo serviceModelInfo = new ModelInfo()
333         serviceModelInfo.setModelType(ModelType.service)
334         serviceModelInfo.setModelInvariantId(serviceMap.get("modelInvariantUuid"))
335         serviceModelInfo.setModelVersionId(serviceMap.get("modelUuid"))
336         serviceModelInfo.setModelName(serviceMap.get("modelName"))
337         serviceModelInfo.setModelVersion(serviceMap.get("modelVersion"))
338         //List of Vnfs
339         List<Object> vnfModelInfoList = new ArrayList<>()
340
341         Map vnfMap = vnfList.get(0)
342         //List of VFModules
343         List<Map<String, Object>> vfModuleList = vnfMap.get("vfModules")
344
345         //List of VfModules
346         List<ModelInfo> vfModelInfoList = new ArrayList<>()
347
348         //Traverse VFModules List and add in vfModelInfoList
349         for (vfModule in vfModuleList) {
350             ModelInfo vfModelInfo = vfModule.get("modelInfo")
351             vfModelInfo.setModelCustomizationId(vfModelInfo.getModelCustomizationUuid())
352             vfModelInfo.setModelVersionId(vfModelInfo.getModelId())
353             vfModelInfoList.add(vfModelInfo)
354         }
355
356         String networkServiceInstanceName = execution.getVariable("networkServiceInstanceName")
357         //RequestInfo
358         RequestInfo requestInfo = new RequestInfo()
359
360         //Dummy Product FamilyId
361         requestInfo.setProductFamilyId("test1234")
362         requestInfo.setSource("VID")
363         requestInfo.setInstanceName(networkServiceInstanceName)
364         requestInfo.setSuppressRollback(false)
365         requestInfo.setRequestorId("NBI")
366
367         //Service Level InstanceParams
368         List<Map<String, Object>> serviceParams = new ArrayList<>()
369         Map<String, Object> serviceParamsValues = new LinkedHashMap<>()
370         serviceParams.add(serviceParamsValues)
371
372         //Cloud Configuration
373         String lcpCloudRegionId = execution.getVariable("lcpCloudRegionId")
374         String tenantId = execution.getVariable("tenantId")
375         String cloudOwner = execution.getVariable("cloudOwner")
376         CloudConfiguration cloudConfiguration = new CloudConfiguration()
377         cloudConfiguration.setLcpCloudRegionId(lcpCloudRegionId)
378         cloudConfiguration.setTenantId(tenantId)
379         cloudConfiguration.setCloudOwner(cloudOwner)
380
381         //VFModules List
382         List<Map<String, Object>> vfModules = new ArrayList<>()
383         for (ModelInfo vfModuleModelInfo : vfModelInfoList) {
384             //Individual VFModule List
385             Map<String, Object> vfModuleValues = new LinkedHashMap<>()
386             vfModuleValues.put("modelInfo", vfModuleModelInfo)
387             vfModuleValues.put("instanceName", vfModuleModelInfo.getModelName())
388
389             //VFModule InstanceParams should be empty or this field should not be there?
390             List<Map<String, Object>> vfModuleInstanceParams = new ArrayList<>()
391             vfModuleValues.put("instanceParams", vfModuleInstanceParams)
392             vfModules.add(vfModuleValues)
393         }
394
395         //Vnf intsanceParams
396         List<Map<String, Object>> vnfInstanceParamsList = new ArrayList<>()
397         String supportedsNssaiJson= prepareVnfInstanceParamsJson(execution)
398
399         Map<String, Object> supportedNssai= new LinkedHashMap<>()
400         supportedNssai.put("supportedsNssai", supportedsNssaiJson)
401         vnfInstanceParamsList.add(supportedNssai)
402
403         Platform platform = new Platform()
404         String platformName = execution.getVariable("platformName")
405         platform.setPlatformName(platformName)
406
407         LineOfBusiness lineOfbusiness = new LineOfBusiness()
408         String lineOfBusinessName = execution.getVariable("lineOfBusinessName")
409         lineOfbusiness.setLineOfBusinessName(lineOfBusinessName)
410
411         ModelInfo vnfModelInfo = vnfMap.get("modelInfo")
412         vnfModelInfo.setModelCustomizationId(vnfModelInfo.getModelCustomizationUuid())
413         vnfModelInfo.setModelVersionId(vnfModelInfo.getModelId())
414
415         //Vnf Values
416         Map<String, Object> vnfValues = new LinkedHashMap<>()
417         vnfValues.put("lineOfBusiness", lineOfbusiness)
418         vnfValues.put("platform", platform)
419         vnfValues.put("productFamilyId", "test1234")
420         vnfValues.put("cloudConfiguration", cloudConfiguration)
421         vnfValues.put("vfModules", vfModules)
422         vnfValues.put("modelInfo", vnfModelInfo)
423         vnfValues.put("instanceName", vnfModelInfo.getModelInstanceName())
424         vnfValues.put("instanceParams",vnfInstanceParamsList)
425
426         vnfModelInfoList.add(vnfValues)
427         //Service Level Resources
428         Map<String, Object> serviceResources = new LinkedHashMap<>()
429         serviceResources.put("vnfs", vnfModelInfoList)
430
431         //Service Values
432         String serviceInstanceName = execution.getVariable("networkServiceInstanceName")
433         Map<String, Object> serviceValues = new LinkedHashMap<>()
434         serviceValues.put("modelInfo", serviceModelInfo)
435         serviceValues.put("instanceName", serviceInstanceName)
436         serviceValues.put("resources", serviceResources)
437         serviceValues.put("instanceParams", serviceParams)
438
439         //UserParams Values
440         Map<String, Object> userParamsValues = new LinkedHashMap<>()
441
442         Map<String, Object> homingSolution = new LinkedHashMap<>()
443         homingSolution.put("Homing_Solution", "none")
444
445         userParamsValues.put("service", serviceValues)
446
447         //UserParams
448         List<Map<String, Object>> userParams = new ArrayList<>()
449         userParams.add(homingSolution)
450         userParams.add(userParamsValues)
451
452         //Request Parameters
453         String serviceType = execution.getVariable("serviceType")
454         RequestParameters requestParameters = new RequestParameters()
455         requestParameters.setaLaCarte(false)
456         requestParameters.setSubscriptionServiceType(serviceType)
457         requestParameters.setUserParams(userParams)
458
459         //SubscriberInfo
460         String globalSubscriberId = execution.getVariable("globalSubscriberId")
461         SubscriberInfo subscriberInfo = new SubscriberInfo()
462         subscriberInfo.setGlobalSubscriberId(globalSubscriberId)
463
464         //Owning Entity
465         String owningEntityId = execution.getVariable("owningEntityId")
466         OwningEntity owningEntity = new OwningEntity()
467         owningEntity.setOwningEntityId(owningEntityId)
468
469         //Project
470         String projectName = execution.getVariable("projectName")
471         Project project = new Project()
472         project.setProjectName(projectName)
473
474         RequestDetails requestDetails = new RequestDetails()
475         requestDetails.setModelInfo(serviceModelInfo)
476         requestDetails.setSubscriberInfo(subscriberInfo)
477         requestDetails.setRequestInfo(requestInfo)
478         requestDetails.setRequestParameters(requestParameters)
479         requestDetails.setCloudConfiguration(cloudConfiguration)
480         requestDetails.setOwningEntity(owningEntity)
481         requestDetails.setProject(project)
482
483         Map<String, Object> requestDetailsMap = new LinkedHashMap<>()
484         requestDetailsMap.put("requestDetails", requestDetails)
485         String requestPayload = mapper.writeValueAsString(requestDetailsMap)
486         logger.debug("requestDetails "+requestPayload)
487         execution.setVariable("requestPayload", requestPayload)
488
489         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: prepareSOMacroRequestPayLoad ****")
490     }
491
492     public void sendPutRequestToSOMacro(DelegateExecution execution) {
493
494         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: sendPutRequestToSOMacro ****")
495         try {
496             String msoEndpoint = UrnPropertiesReader.getVariable("mso.infra.endpoint.url", execution)
497             String networkServiceInstanceId = execution.getVariable("networkServiceInstanceId")
498             String vnfId = execution.getVariable("vnfId")
499             String url = msoEndpoint+"/serviceInstantiation/v7/serviceInstances/"+networkServiceInstanceId+"/vnfs/"+vnfId
500             String requestBody = execution.getVariable("requestPayload")
501             String msoKey = UrnPropertiesReader.getVariable("mso.msoKey", execution)
502             String basicAuth =  UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution)
503             String encodeString = utils.getBasicAuth(basicAuth, msoKey)
504             logger.debug("msoEndpoint: "+msoEndpoint +"  "+ "url: "+url  +" requestBody: "+requestBody +"  "+ "encodeString: "+encodeString)
505             HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO)
506             httpClient.addAdditionalHeader("Authorization", encodeString)
507             httpClient.addAdditionalHeader("Accept", "application/json")
508             Response httpResponse = httpClient.put(requestBody)
509             handleSOResponse(httpResponse, execution)
510         } catch (BpmnError e) {
511             throw e
512         } catch (any) {
513             String msg = Prefix+" Exception in DoActivateCoreNSSI " + any.getCause()
514             logger.error(msg)
515             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
516         }
517         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: sendPostRequestToSOMacro ****")
518     }
519
520     /**
521      * Handle SO Response for PUT and prepare update operation status
522      * @param execution
523      */
524     private void handleSOResponse(Response httpResponse, DelegateExecution execution){
525         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: handleSOResponse ****")
526
527         int soResponseCode = httpResponse.getStatus()
528         logger.debug("soResponseCode : "+soResponseCode)
529
530         if (soResponseCode >= 200 && soResponseCode < 204 && httpResponse.hasEntity()) {
531             String soResponse = httpResponse.readEntity(String.class)
532             logger.debug("soResponse: "+soResponse)
533             String macroOperationId = jsonUtil.getJsonValue(soResponse, "requestReferences.requestId")
534             String requestSelfLink = jsonUtil.getJsonValue(soResponse, "requestReferences.requestSelfLink")
535             execution.setVariable("macroOperationId", macroOperationId)
536             execution.setVariable("requestSelfLink", requestSelfLink)
537             execution.setVariable("isSOTimeOut", "no")
538             execution.setVariable("isSOResponseSucceed","yes")
539         }
540         else {
541             execution.setVariable("isSOResponseSucceed","no")
542             prepareFailedOperationStatusUpdate(execution)
543         }
544
545         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: handleSOResponse ****")
546     }
547
548     public void getSOPUTProgress(DelegateExecution execution) {
549         logger.debug(Prefix+ " **** Enter DoActivateCoreNSSI ::: getSOPUTProgress ****")
550         String url= execution.getVariable("requestSelfLink")
551         HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO)
552         String msoKey = UrnPropertiesReader.getVariable("mso.msoKey", execution)
553         String basicAuth =  UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution)
554         String encodeString = utils.getBasicAuth(basicAuth, msoKey)
555         httpClient.addAdditionalHeader("Authorization", encodeString)
556         httpClient.addAdditionalHeader("Accept", "application/json")
557         Response httpResponse = httpClient.get()
558         logger.debug("httpResponse "+httpResponse)
559         int soResponseCode = httpResponse.getStatus()
560         logger.debug("soResponseCode : "+soResponseCode)
561         if (soResponseCode >= 200 && soResponseCode < 204 && httpResponse.hasEntity()) {
562             String soResponse = httpResponse.readEntity(String.class)
563             logger.debug("soResponse: "+soResponse)
564             String requestState= jsonUtil.getJsonValue(soResponse, "request.requestStatus.requestState")
565             logger.debug("requestState: "+requestState)
566             execution.setVariable("requestState", requestState)
567         } else {
568             execution.setVariable("isSOResponseSucceed","no")
569             prepareFailedOperationStatusUpdate(execution)
570         }
571         logger.debug(Prefix+ " **** Exit DoActivateCoreNSSI ::: getSOPUTProgress ****")
572     }
573
574         public void timeDelay() {
575                 try {
576                         logger.debug(Prefix+ " **** DoActivateCoreNSSI ::: timeDelay going to sleep for 5 sec")
577                         Thread.sleep(5000)
578                         logger.debug("**** DoActivateCoreNSSI ::: timeDelay wakeup after 5 sec")
579                 } catch(InterruptedException e) {
580                         logger.error(Prefix+ " **** DoActivateCoreNSSI ::: timeDelay exception" + e)
581                 }
582         }
583
584     void prepareUpdateResourceOperationStatus(DelegateExecution execution) {
585
586         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: prepareUpdateResourceOperationStatus ****")
587
588         String soRequestState = execution.getVariable("requestState")
589         //Prepare Update Status for PUT failure and success
590         if("COMPLETE".equalsIgnoreCase(soRequestState)) {
591             execution.setVariable("progress", "100")
592             execution.setVariable("status", "finished")
593             execution.setVariable("operationContent", "AllocteCoreNSSI successful.")
594             logger.debug("Success ,result:${execution.getVariable("result")}, reason: ${execution.getVariable("reason")}")
595         } else {
596             logger.debug("SO PUT Failure with State: "+soRequestState)
597             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "SO PUT Failure")
598         }
599         setResourceOperationStatus(execution)
600         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: prepareUpdateResourceOperationStatus ****")
601     }
602
603     void updateSliceProfileOrchestrationStatus(DelegateExecution execution) {
604
605         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: updateSliceProfileOrchestrationStatus ****")
606
607         String globalCustId = execution.getVariable("globalSubscriberId")
608         String serviceType = execution.getVariable("serviceType")
609         String oStatus = execution.getVariable("oStatus")
610
611         ServiceInstance si = execution.getVariable("sliceProfileServiceInstance")
612         String sliceProfileInstanceId = si.getServiceInstanceId()
613
614         if(sliceProfileInstanceId==null) {
615               exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Slice Profile Instance Update failed")
616         }
617         si.setOrchestrationStatus(oStatus)
618
619         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(globalCustId).serviceSubscription(serviceType).serviceInstance(sliceProfileInstanceId))
620         try {
621             getAAIClient().update(uri, si)
622             setResourceOperationStatus(execution)
623         } catch (Exception e) {
624             logger.info("Update OrchestrationStatus in AAI failed")
625             String msg = "Update OrchestrationStatus in AAI failed, " + e.getMessage()
626             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
627         }
628
629         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: updateSliceProfileOrchestrationStatus ****")
630     }
631
632     /**
633      * prepare ResourceOperation status
634      * @param execution
635      * @param operationType
636      */
637     private void setResourceOperationStatus(DelegateExecution execution) {
638
639         logger.debug(Prefix +" **** Enter DoActivateCoreNSSI ::: setResourceOperationStatus ****")
640
641         String serviceId = execution.getVariable("nsiId")
642         String jobId = execution.getVariable("jobId")
643         String nssiId = execution.getVariable("serviceInstanceID")
644         String modelUuid= execution.getVariable("modelUuid")
645         String operationType = execution.getVariable("operationType")
646         ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus()
647         resourceOperationStatus.setServiceId(serviceId)
648         resourceOperationStatus.setJobId(jobId)
649         resourceOperationStatus.setOperationId(jobId)
650         resourceOperationStatus.setResourceTemplateUUID(modelUuid)
651         resourceOperationStatus.setResourceInstanceID(nssiId)
652         resourceOperationStatus.setOperType(operationType)
653         resourceOperationStatus.setStatus("finished")
654         resourceOperationStatus.setProgress("100")
655         resourceOperationStatus.setStatusDescription("Core Activation Successful")
656         requestDBUtil.prepareUpdateResourceOperationStatus(execution, resourceOperationStatus)
657
658         logger.debug(Prefix +" **** Exit DoActivateCoreNSSI ::: setResourceOperationStatus ****")
659     }
660
661     void prepareFailedOperationStatusUpdate(DelegateExecution execution){
662         logger.debug(Prefix + " **** Enter DoActivateCoreNSSI ::: prepareFailedOperationStatusUpdate ****")
663
664         String serviceId = execution.getVariable("nsiId")
665         String jobId = execution.getVariable("jobId")
666         String nssiId = execution.getVariable("serviceInstanceID")
667         String operationType = execution.getVariable("operationType")
668         String modelUuid= execution.getVariable("modelUuid")
669
670         ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus()
671         resourceOperationStatus.setServiceId(serviceId)
672         resourceOperationStatus.setJobId(jobId)
673         resourceOperationStatus.setOperationId(jobId)
674         resourceOperationStatus.setResourceInstanceID(nssiId)
675         resourceOperationStatus.setResourceTemplateUUID(modelUuid)
676         resourceOperationStatus.setOperType(operationType)
677         resourceOperationStatus.setProgress("0")
678         resourceOperationStatus.setStatus("failed")
679         resourceOperationStatus.setStatusDescription("Core NSSI Activation Failed")
680         requestDBUtil.prepareUpdateResourceOperationStatus(execution, resourceOperationStatus)
681
682         logger.debug(Prefix + " **** Exit DoActivateCoreNSSI ::: prepareFailedOperationStatusUpdate ****")
683     }
684
685 }