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