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