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