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