5ecfc9a872211b981054fcde5848c8e0536a1214
[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 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("serviceInstanceID")
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
308     /**
309      * query AAI
310      * @param execution
311      * @param aaiObjectName
312      * @param instanceId
313      * @return AAIResultWrapper
314      */
315     private AAIResultWrapper queryAAI(DelegateExecution execution, AAIObjectName aaiObjectName, String instanceId, String errorMsg) {
316         logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: queryAAI ****")
317         String globalSubscriberId = execution.getVariable("globalSubscriberId")
318         String serviceType = execution.getVariable("serviceType")
319         AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(globalSubscriberId).serviceSubscription(serviceType).serviceInstance(instanceId))
320         if (!getAAIClient().exists(resourceUri)) {
321             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMsg)
322         }
323         AAIResultWrapper wrapper = getAAIClient().get(resourceUri, NotFoundException.class)
324         logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: queryAAI ****")
325         return wrapper
326     }
327
328     public void getServiceVNFAndVFsFromCatalogDB(DelegateExecution execution) {
329         logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: getServiceVNFAndVFsFromCatalogDB ****")
330         String serviceVnfs="";
331         String msg=""
332         String modelInvariantUuid = execution.getVariable("networkServiceModelInvariantUuid")
333         try{
334             CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
335             String json = catalogDbUtils.getServiceResourcesByServiceModelInvariantUuidString(execution, modelInvariantUuid)
336             logger.debug("***** JSON IS: "+json)
337             serviceVnfs = jsonUtil.getJsonValue(json, "serviceResources.serviceVnfs") ?: ""
338             String serviceModelInfo = jsonUtil.getJsonValue(json, "serviceResources.modelInfo") ?: ""
339             execution.setVariable("serviceModelInfo", serviceModelInfo)
340             execution.setVariable("serviceVnfs",serviceVnfs)
341             logger.debug("***** serviceVnfs is: "+ serviceVnfs)
342         }catch(BpmnError e){
343             throw e
344         } catch (Exception ex){
345             msg = "Exception in preProcessRequest " + ex.getMessage()
346             logger.debug(msg)
347             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
348         }
349         logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: getServiceVNFAndVFsFromCatalogDB ****")
350     }
351
352     public void prepareSOMacroRequestPayload(DelegateExecution execution) {
353         logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: prepareSOMacroRequestPayLoad ****")
354         String json = execution.getVariable("serviceVnfs")
355         logger.debug(">>>> json "+json)
356         List<Object> vnfList = mapper.readValue(json, List.class);
357         logger.debug("vnfList:  "+vnfList)
358         Map<String,Object> serviceMap = mapper.readValue(execution.getVariable("serviceModelInfo"), Map.class);
359         ModelInfo serviceModelInfo = new ModelInfo()
360         serviceModelInfo.setModelType(ModelType.service)
361         serviceModelInfo.setModelInvariantId(serviceMap.get("modelInvariantUuid"))
362         serviceModelInfo.setModelVersionId(serviceMap.get("modelUuid"))
363         serviceModelInfo.setModelName(serviceMap.get("modelName"))
364         serviceModelInfo.setModelVersion(serviceMap.get("modelVersion"))
365         logger.debug("serviceModelInfo:  "+serviceModelInfo)
366         //List of Vnfs
367         List<Object> vnfModelInfoList = new ArrayList<>()
368
369         Map vnfMap = vnfList.get(0)
370         ModelInfo vnfModelInfo = vnfMap.get("modelInfo")
371         logger.debug("vnfModelInfo "+vnfModelInfo)
372
373         //List of VFModules
374         List<Map<String, Object>> vfModuleList = vnfMap.get("vfModules")
375         logger.debug("vfModuleList "+vfModuleList)
376
377         //List of VfModules
378         List<ModelInfo> vfModelInfoList = new ArrayList<>()
379
380         //Traverse VFModules List and add in vfModelInfoList
381         for (vfModule in vfModuleList) {
382             ModelInfo vfModelInfo = vfModule.get("modelInfo")
383             logger.debug("vfModelInfo "+vfModelInfo)
384             vfModelInfoList.add(vfModelInfo)
385         }
386         //RequestInfo
387         RequestInfo requestInfo = new RequestInfo()
388
389         //Dummy Product FamilyId
390         requestInfo.setProductFamilyId("test1234")
391         requestInfo.setSource("VID")
392         requestInfo.setInstanceName(execution.getVariable("networkServiceInstanceName"))
393         requestInfo.setSuppressRollback(false)
394         requestInfo.setRequestorId("NBI")
395
396         //Service Level InstanceParams
397         List<Map<String, Object>> serviceParams = new ArrayList<>()
398         Map<String, Object> serviceParamsValues = new LinkedHashMap<>()
399         serviceParams.add(serviceParamsValues)
400
401         //Cloud Configuration
402         CloudConfiguration cloudConfiguration = new CloudConfiguration()
403         cloudConfiguration.setLcpCloudRegionId(execution.getVariable("lcpCloudRegionId"))
404         cloudConfiguration.setTenantId(execution.getVariable("tenantId"))
405         cloudConfiguration.setCloudOwner(execution.getVariable("cloudOwner"))
406
407         //VFModules List
408         List<Map<String, Object>> vfModules = new ArrayList<>()
409         for (ModelInfo vfModuleModelInfo : vfModelInfoList) {
410             //Individual VFModule List
411             Map<String, Object> vfModuleValues = new LinkedHashMap<>()
412             vfModuleValues.put("modelInfo", vfModuleModelInfo)
413             vfModuleValues.put("instanceName", vfModuleModelInfo.getModelInstanceName())
414
415             //VFModule InstanceParams should be empty or this field should not be there?
416             List<Map<String, Object>> vfModuleInstanceParams = new ArrayList<>()
417             vfModuleValues.put("instanceParams", vfModuleInstanceParams)
418         }
419
420         //Vnf intsanceParams
421         Map<String, Object> sliceProfile = mapper.readValue(execution.getVariable("sliceProfile"), Map.class);
422
423         List vnfInstanceParamsList = new ArrayList<>()
424         String supportedsNssaiJson= prepareVnfInstanceParamsJson(execution)
425         vnfInstanceParamsList.add(supportedsNssaiJson)
426
427         Platform platform = new Platform()
428         platform.setPlatformName(execution.getVariable("platform"))
429
430         LineOfBusiness lineOfbusiness = new LineOfBusiness()
431         lineOfbusiness.setLineOfBusinessName(execution.getVariable("lineOfBusiness"))
432
433         //Vnf Values
434         Map<String, Object> vnfValues = new LinkedHashMap<>()
435         vnfValues.put("lineOfBusiness", lineOfbusiness)
436         vnfValues.put("platform", platform)
437         vnfValues.put("productFamilyId", "test1234")
438         vnfValues.put("cloudConfiguration", cloudConfiguration)
439         vnfValues.put("vfModules", vfModules)
440         vnfValues.put("modelInfo", vnfModelInfo)
441         vnfValues.put("instanceName", execution.getVariable("vnfInstanceName"))
442         vnfValues.put("instanceParams",vnfInstanceParamsList)
443
444         vnfModelInfoList.add(vnfValues)
445         //Service Level Resources
446         Map<String, Object> serviceResources = new LinkedHashMap<>()
447         serviceResources.put("vnfs", vnfModelInfoList)
448
449         //Service Values
450         Map<String, Object> serviceValues = new LinkedHashMap<>()
451         serviceValues.put("modelInfo", serviceModelInfo)
452         serviceValues.put("instanceName", execution.getVariable("networkServiceInstanceName"))
453         serviceValues.put("resources", serviceResources)
454         serviceValues.put("instanceParams", serviceParams)
455
456         //UserParams Values
457         Map<String, Object> userParamsValues = new LinkedHashMap<>()
458
459         Map<String, Object> homingSolution = new LinkedHashMap<>()
460         homingSolution.put("Homing_Solution", "none")
461
462         userParamsValues.put("service", serviceValues)
463
464         //UserParams
465         List<Map<String, Object>> userParams = new ArrayList<>()
466         userParams.add(homingSolution)
467         userParams.add(userParamsValues)
468
469         //Request Parameters
470         RequestParameters requestParameters = new RequestParameters()
471         requestParameters.setaLaCarte(false)
472         requestParameters.setSubscriptionServiceType(execution.getVariable("serviceType"))
473         requestParameters.setUserParams(userParams)
474
475         //SubscriberInfo
476         SubscriberInfo subscriberInfo = new SubscriberInfo()
477         subscriberInfo.setGlobalSubscriberId(execution.getVariable("globalSubscriberId"))
478
479         //Owning Entity
480         OwningEntity owningEntity = new OwningEntity()
481         owningEntity.setOwningEntityId(execution.getVariable("owningEntityId"))
482
483         //Project
484         Project project = new Project()
485         project.setProjectName(execution.getVariable("projectName"))
486
487         RequestDetails requestDetails = new RequestDetails()
488         requestDetails.setModelInfo(serviceModelInfo)
489         requestDetails.setSubscriberInfo(subscriberInfo)
490         requestDetails.setRequestInfo(requestInfo)
491         requestDetails.setRequestParameters(requestParameters)
492         requestDetails.setCloudConfiguration(cloudConfiguration)
493         requestDetails.setOwningEntity(owningEntity)
494         requestDetails.setProject(project)
495
496         Map<String, Object> requestDetailsMap = new LinkedHashMap<>()
497         requestDetailsMap.put("requestDetails", requestDetails)
498         String requestPayload = mapper.writeValueAsString(requestDetailsMap)
499
500         logger.debug("requestDetails "+requestPayload)
501         execution.setVariable("requestPayload", requestPayload)
502
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
512         String supportedsNssaiJson = mapper.writeValueAsString(nSsai)
513         //SupportedNssai
514         Map<String, Object> supportedNssai= new LinkedHashMap<>()
515         supportedNssai.put("supportedNssai", supportedsNssaiJson)
516         logger.debug("****  supportedsNssaiJson**** "+supportedNssai)
517         logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: prepareVnfInstanceParamsJson ****")
518         return supportedNssai
519     }
520
521     public void sendPutRequestToSOMacro(DelegateExecution execution) {
522         logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: sendPutRequestToSOMacro ****")
523         try {
524             String msoEndpoint = UrnPropertiesReader.getVariable("mso.infra.endpoint.url", execution)
525             String url = msoEndpoint+"/serviceInstantiation/v7/serviceInstances/"+execution.getVariable("networkServiceInstanceId")+"/vnfs/"+execution.getVariable("vnfId")
526
527             String requestBody = execution.getVariable("requestPayload")
528
529             String msoKey = UrnPropertiesReader.getVariable("mso.msoKey", execution)
530             String basicAuth =  UrnPropertiesReader.getVariable("mso.infra.endpoint.auth", execution)
531             String basicAuthValue = utils.encrypt(basicAuth, msoKey)
532             String encodeString = utils.getBasicAuth(basicAuthValue, msoKey)
533
534             HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO)
535             httpClient.addAdditionalHeader("Authorization", encodeString)
536             httpClient.addAdditionalHeader("Accept", "application/json")
537             Response httpResponse = httpClient.put(requestBody)
538             handleSOResponse(httpResponse, execution)
539         } catch (BpmnError e) {
540             throw e
541         } catch (any) {
542             String msg = Prefix+" Exception in DoAllocateCoreSharedSlice " + any.getCause()
543             logger.error(msg)
544             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
545         }
546         logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: sendPostRequestToSOMacro ****")
547     }
548
549     /**
550      * Handle SO Response for PUT and prepare update operation status
551      * @param execution
552      */
553     private void handleSOResponse(Response httpResponse, DelegateExecution execution){
554         logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: handleSOResponse ****")
555
556         int soResponseCode = httpResponse.getStatus()
557         logger.debug("soResponseCode : "+soResponseCode)
558
559         if (soResponseCode >= 200 && soResponseCode < 204 && httpResponse.hasEntity()) {
560             String soResponse = httpResponse.readEntity(String.class)
561             String operationId = execution.getVariable("operationId")
562             def macroOperationId = jsonUtil.getJsonValue(soResponse, "operationId")
563             execution.setVariable("macroOperationId", macroOperationId)
564             execution.setVariable("isSOTimeOut", "no")
565             execution.setVariable("isSOResponseSucceed","yes")
566         }
567         else {
568             String serviceName = execution.getVariable("serviceInstanceName")
569             execution.setVariable("isSOResponseSucceed","no")
570             prepareFailedOperationStatusUpdate(execution)
571         }
572         logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: handleSOResponse ****")
573     }
574
575     /**
576      * prepare to call sub process CheckProcessStatus
577      * @param execution
578      */
579     void prepareCallCheckProcessStatus(DelegateExecution execution){
580         logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: prepareCallCheckProcessStatus ****")
581         def successConditions = new ArrayList<>()
582         successConditions.add("finished")
583         execution.setVariable("successConditions", successConditions)
584         def errorConditions = new ArrayList<>()
585         errorConditions.add("error")
586         execution.setVariable("errorConditions", errorConditions)
587         execution.setVariable("processServiceType", "Network service")
588         execution.setVariable("subOperationType", "PUT")
589         execution.setVariable("initProgress", 20)
590         execution.setVariable("endProgress",90)
591         execution.setVariable("timeOut", TIMEOUT)
592         logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: prepareCallCheckProcessStatus ****")
593     }
594
595     void prepareUpdateResourceOperationStatus(DelegateExecution execution) {
596
597         logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: prepareUpdateResourceOperationStatus ****")
598         //Prepare Update Status for PUT failure and success
599         if(execution.getVariable("isTimeOut").equals("YES")) {
600             logger.debug("TIMEOUT - SO PUT Failure")
601             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "SO PUT Failure")
602         } else {
603             execution.setVariable("progress", "100")
604             execution.setVariable("status", "finished")
605             execution.setVariable("operationContent", "AllocteCoreNSSI successful.")
606             logger.debug("prepareFailureStatus,result:${execution.getVariable("result")}, reason: ${execution.getVariable("reason")}")
607         }
608         setResourceOperationStatus(execution)
609         logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: prepareUpdateResourceOperationStatus ****")
610     }
611
612     /**
613      * prepare ResourceOperation status
614      * @param execution
615      * @param operationType
616      */
617     private void setResourceOperationStatus(DelegateExecution execution) {
618         logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: setResourceOperationStatus ****")
619         String serviceId = execution.getVariable("nssiId")
620         String jobId = execution.getVariable("jobId")
621         String nsiId = execution.getVariable("nsiId")
622         String operationType = execution.getVariable("operationType")
623         ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus()
624         resourceOperationStatus.setServiceId(serviceId)
625         resourceOperationStatus.setOperationId(jobId)
626         resourceOperationStatus.setResourceTemplateUUID(nsiId)
627         resourceOperationStatus.setOperType(operationType)
628         resourceOperationStatus.setStatus("finished")
629         resourceOperationStatus.setProgress("100")
630         resourceOperationStatus.setStatusDescription("Core Allocate successful")
631         requestDBUtil.prepareUpdateResourceOperationStatus(execution, resourceOperationStatus)
632         logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: setResourceOperationStatus ****")
633     }
634
635     void prepareFailedOperationStatusUpdate(DelegateExecution execution){
636         logger.debug(Prefix + " **** Enter DoAllocateCoreSharedSlice ::: prepareFailedOperationStatusUpdate ****")
637         String serviceId = execution.getVariable("nssiId")
638         String jobId = execution.getVariable("jobId")
639         String nsiId = execution.getVariable("nsiId")
640         String operationType = execution.getVariable("operationType")
641
642         ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus()
643         resourceOperationStatus.setServiceId(serviceId)
644         resourceOperationStatus.setOperationId(jobId)
645         resourceOperationStatus.setResourceTemplateUUID(nsiId)
646         resourceOperationStatus.setOperType(operationType)
647         resourceOperationStatus.setProgress(0)
648         resourceOperationStatus.setStatus("failed")
649         resourceOperationStatus.setStatusDescription("Core NSSI Allocate Failed")
650         requestDBUtil.prepareUpdateResourceOperationStatus(execution, resourceOperationStatus)
651         logger.debug(Prefix + " **** Exit DoAllocateCoreSharedSlice ::: prepareFailedOperationStatusUpdate ****")
652     }
653 }