9ee8ff8b6786c91091dfb7e6dd5812014154c24f
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoCreateVfModule.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.bpmn.infrastructure.scripts
24
25 import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
26 import org.onap.so.client.HttpClientFactory
27
28 import javax.ws.rs.core.MediaType
29 import javax.ws.rs.core.Response
30 import javax.xml.parsers.DocumentBuilder
31 import javax.xml.parsers.DocumentBuilderFactory
32
33 import org.camunda.bpm.engine.delegate.BpmnError
34 import org.camunda.bpm.engine.delegate.DelegateExecution
35 import org.json.JSONArray
36 import org.json.JSONObject
37 import org.onap.aai.domain.yang.GenericVnf
38 import org.onap.aai.domain.yang.NetworkPolicy
39 import org.onap.so.bpmn.common.scripts.AaiUtil
40 import org.onap.so.bpmn.common.scripts.CatalogDbUtils
41 import org.onap.so.bpmn.common.scripts.ExceptionUtil
42 import org.onap.so.bpmn.common.scripts.MsoUtils
43 import org.onap.so.bpmn.common.scripts.NetworkUtils
44 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
45 import org.onap.so.bpmn.common.scripts.VfModuleBase
46 import org.onap.so.bpmn.common.util.OofInfraUtils
47 import org.onap.so.bpmn.core.RollbackData
48 import org.onap.so.bpmn.core.UrnPropertiesReader
49 import org.onap.so.bpmn.core.WorkflowException
50 import org.onap.so.bpmn.core.domain.VnfResource
51 import org.onap.so.bpmn.core.json.DecomposeJsonUtil
52 import org.onap.so.bpmn.core.json.JsonUtils
53 import org.onap.so.client.HttpClient
54 import org.onap.so.client.aai.AAIObjectPlurals
55 import org.onap.so.client.aai.AAIObjectType;
56 import org.onap.so.client.aai.AAIResourcesClient
57 import org.onap.so.client.aai.entities.AAIResultWrapper
58 import org.onap.so.client.aai.entities.uri.AAIResourceUri
59 import org.onap.so.client.aai.entities.uri.AAIUri
60 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
61 import org.onap.so.client.graphinventory.entities.uri.Depth
62 import org.onap.so.constants.Defaults
63 import org.onap.so.db.catalog.beans.HomingInstance
64 import org.onap.so.logger.MessageEnum
65 import org.onap.so.logger.MsoLogger
66 import org.slf4j.Logger
67 import org.slf4j.LoggerFactory
68
69 import org.onap.so.utils.TargetEntity
70 import org.w3c.dom.Document
71 import org.w3c.dom.Element
72 import org.w3c.dom.NamedNodeMap
73 import org.w3c.dom.Node
74 import org.w3c.dom.NodeList
75 import org.xml.sax.InputSource
76
77 import com.fasterxml.jackson.databind.ObjectMapper
78
79
80
81 public class DoCreateVfModule extends VfModuleBase {
82     private static final Logger logger = LoggerFactory.getLogger( DoCreateVfModule.class);
83
84         String Prefix="DCVFM_"
85         ExceptionUtil exceptionUtil = new ExceptionUtil()
86         JsonUtils jsonUtil = new JsonUtils()
87         SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
88         OofInfraUtils oofInfraUtils = new OofInfraUtils()
89         CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
90         DecomposeJsonUtil decomposeJsonUtils = new DecomposeJsonUtil()
91         private final HttpClientFactory httpClientFactory = new HttpClientFactory()
92
93         /**
94          * Validates the request message and sets up the workflow.
95          * @param execution the execution
96          */
97         public void preProcessRequest(DelegateExecution execution) {
98                 def method = getClass().getSimpleName() + '.preProcessRequest(' +
99                         'execution=' + execution.getId() +
100                         ')'
101
102                 logger.trace('Entered ' + method)
103
104                 execution.setVariable('prefix', Prefix)
105                 try{
106                         def rollbackData = execution.getVariable("rollbackData")
107                         if (rollbackData == null) {
108                                 rollbackData = new RollbackData()
109                         }
110
111                         execution.setVariable("DCVFM_vnfParamsExistFlag", false)
112                         execution.setVariable("DCVFM_oamManagementV4Address", "")
113                         execution.setVariable("DCVFM_oamManagementV6Address", "")
114
115                         String request = execution.getVariable("DoCreateVfModuleRequest")
116
117                         if (request == null || request.isEmpty()) {
118                                 // Building Block-type request
119
120                                 String vfModuleModelInfo = execution.getVariable("vfModuleModelInfo")
121
122                                 def serviceModelInfo = execution.getVariable("serviceModelInfo")
123                                 logger.debug("serviceModelInfo: " + serviceModelInfo)
124                                 String modelInvariantUuid = jsonUtil.getJsonValue(serviceModelInfo, "modelInvariantUuid")
125                                 logger.debug("modelInvariantUuid: " + modelInvariantUuid)
126
127                                 def vnfModelInfo = execution.getVariable("vnfModelInfo")
128
129                                 //tenantId
130                                 def tenantId = execution.getVariable("tenantId")
131                                 execution.setVariable("DCVFM_tenantId", tenantId)
132                                 rollbackData.put("VFMODULE", "tenantid", tenantId)
133                                 //volumeGroupId
134                                 def volumeGroupId = execution.getVariable("volumeGroupId")
135                                 execution.setVariable("DCVFM_volumeGroupId", volumeGroupId)
136                                 //volumeGroupName
137                                 def volumeGroupName = execution.getVariable("volumeGroupName")
138                                 execution.setVariable("DCVFM_volumeGroupName", volumeGroupName)
139                                 //cloudSiteId
140                                 def cloudSiteId = execution.getVariable("lcpCloudRegionId")
141                                 execution.setVariable("DCVFM_cloudSiteId", cloudSiteId)
142                                 rollbackData.put("VFMODULE", "aiccloudregion", cloudSiteId)
143                                 logger.debug("cloudSiteId: " + cloudSiteId)
144                                 //cloudOwner
145                                 def cloudOwner = execution.getVariable("cloudOwner")
146                                 execution.setVariable("DCVFM_cloudOwner", cloudOwner)
147                                 rollbackData.put("VFMODULE", "cloudOwner", cloudOwner)
148                                 logger.debug("cloudOwner: " + cloudOwner)
149                                 //vnfType
150                                 def vnfType = execution.getVariable("vnfType")
151                                 execution.setVariable("DCVFM_vnfType", vnfType)
152                                 rollbackData.put("VFMODULE", "vnftype", vnfType)
153                                 logger.debug("vnfType: " + vnfType)
154                                 //vnfName
155                                 def vnfName = execution.getVariable("vnfName")
156                                 execution.setVariable("DCVFM_vnfName", vnfName)
157                                 rollbackData.put("VFMODULE", "vnfname", vnfName)
158                                 logger.debug("vnfName: " + vnfName)
159                                 //vnfId
160                                 def vnfId = execution.getVariable("vnfId")
161                                 execution.setVariable("DCVFM_vnfId", vnfId)
162                                 rollbackData.put("VFMODULE", "vnfid", vnfId)
163                                 logger.debug("vnfId: " + vnfId)
164                                 //vfModuleName
165                                 def vfModuleName = execution.getVariable("vfModuleName")
166                                 execution.setVariable("DCVFM_vfModuleName", vfModuleName)
167                                 rollbackData.put("VFMODULE", "vfmodulename", vfModuleName)
168                                 logger.debug("vfModuleName: " + vfModuleName)
169                                 //vfModuleModelName
170                                 def vfModuleModelName = jsonUtil.getJsonValue(vfModuleModelInfo, "modelName")
171                                 execution.setVariable("DCVFM_vfModuleModelName", vfModuleModelName)
172                                 rollbackData.put("VFMODULE", "vfmodulemodelname", vfModuleModelName)
173                                 logger.debug("vfModuleModelName: " + vfModuleModelName)
174                                 //modelCustomizationUuid
175                                 def modelCustomizationUuid = jsonUtil.getJsonValue(vfModuleModelInfo, "modelCustomizationUuid")
176                                 execution.setVariable("DCVFM_modelCustomizationUuid", modelCustomizationUuid)
177                                 rollbackData.put("VFMODULE", "modelcustomizationuuid", modelCustomizationUuid)
178                                 logger.debug("modelCustomizationUuid: " + modelCustomizationUuid)
179                                 //vfModuleId
180                                 def vfModuleId = execution.getVariable("vfModuleId")
181                                 execution.setVariable("DCVFM_vfModuleId", vfModuleId)
182                                 logger.debug("vfModuleId: " + vfModuleId)
183                                 def requestId = execution.getVariable("msoRequestId")
184                                 execution.setVariable("DCVFM_requestId", requestId)
185                                 logger.debug("requestId: " + requestId)
186                                 rollbackData.put("VFMODULE", "msorequestid", requestId)
187                                 // Set mso-request-id to request-id for VNF Adapter interface
188                                 execution.setVariable("mso-request-id", requestId)
189                                 //serviceId
190                                 def serviceId = execution.getVariable("serviceId")
191                                 execution.setVariable("DCVFM_serviceId", serviceId)
192                                 logger.debug("serviceId: " + serviceId)
193                                 //serviceInstanceId
194                                 def serviceInstanceId = execution.getVariable("serviceInstanceId")
195                                 execution.setVariable("DCVFM_serviceInstanceId", serviceInstanceId)
196                                 rollbackData.put("VFMODULE", "serviceInstanceId", serviceInstanceId)
197                                 logger.debug("serviceInstanceId: " + serviceInstanceId)
198                                 //source - HARDCODED
199                                 def source = "VID"
200                                 execution.setVariable("DCVFM_source", source)
201                                 rollbackData.put("VFMODULE", "source", source)
202                                 logger.debug("source: " + source)
203                                 //backoutOnFailure
204                                 def disableRollback = execution.getVariable("disableRollback")
205                                 def backoutOnFailure = true
206                                 if (disableRollback != null && disableRollback == true) {
207                                         backoutOnFailure = false
208                                 }
209                                 execution.setVariable("DCVFM_backoutOnFailure", backoutOnFailure)
210                                 logger.debug("backoutOnFailure: " + backoutOnFailure)
211                                 //isBaseVfModule
212                                 def isBaseVfModule = execution.getVariable("isBaseVfModule")
213                                 execution.setVariable("DCVFM_isBaseVfModule", isBaseVfModule)
214                                 logger.debug("isBaseVfModule: " + isBaseVfModule)
215                                 //asdcServiceModelVersion
216                                 def asdcServiceModelVersion = execution.getVariable("asdcServiceModelVersion")
217                                 execution.setVariable("DCVFM_asdcServiceModelVersion", asdcServiceModelVersion)
218                                 logger.debug("asdcServiceModelVersion: " + asdcServiceModelVersion)
219                                 //personaModelId
220                                 execution.setVariable("DCVFM_personaModelId", jsonUtil.getJsonValue(vfModuleModelInfo, "modelInvariantUuid"))
221                                 //personaModelVersion
222                                 execution.setVariable("DCVFM_personaModelVersion", jsonUtil.getJsonValue(vfModuleModelInfo, "modelUuid"))
223                                 //vfModuleLabel
224                                 def vfModuleLabel = execution.getVariable("vfModuleLabel")
225                                 if (vfModuleLabel != null) {
226                                         execution.setVariable("DCVFM_vfModuleLabel", vfModuleLabel)
227                                         logger.debug("vfModuleLabel: " + vfModuleLabel)
228                                 }
229                                 //Get or Generate UUID
230                                 String uuid = execution.getVariable("DCVFM_uuid")
231                                 if(uuid == null){
232                                         uuid = UUID.randomUUID()
233                                         logger.debug("Generated messageId (UUID) is: " + uuid)
234                                 }else{
235                                         logger.debug("Found messageId (UUID) is: " + uuid)
236                                 }
237                                 //isVidRequest
238                                 String isVidRequest = execution.getVariable("isVidRequest")
239                                 // default to true
240                                 if (isVidRequest == null || isVidRequest.isEmpty()) {
241                                         execution.setVariable("isVidRequest", "true")
242                                 }
243                                 //globalSubscriberId
244                                 String globalSubscriberId = execution.getVariable("globalSubscriberId")
245                                 execution.setVariable("DCVFM_globalSubscriberId", globalSubscriberId)
246                                 logger.debug("globalSubsrciberId: " + globalSubscriberId)
247
248                                 // Set Homing Info
249                                 String oofDirectives = null
250                                 try {
251                                         HomingInstance homingInstance = oofInfraUtils.getHomingInstance(serviceInstanceId, execution)
252                                         if (homingInstance != null) {
253                                                 execution.setVariable("DCVFM_cloudSiteId", homingInstance.getCloudRegionId())
254                                                 rollbackData.put("VFMODULE", "aiccloudregion", homingInstance.getCloudRegionId())
255                                                 logger.debug("Overwriting cloudSiteId with homing cloudSiteId: " +
256                                                                 homingInstance.getCloudRegionId())
257                                                 execution.setVariable("DCVFM_cloudOwner", homingInstance.getCloudOwner())
258                                                 rollbackData.put("VFMODULE", "cloudOwner", homingInstance.getCloudOwner())
259                                                 logger.debug("Overwriting cloudOwner with homing cloudOwner: " +
260                                                                 homingInstance.getCloudOwner())
261                                                 oofDirectives = homingInstance.getOofDirectives()
262                                                 execution.setVariable("DCVFM_oofDirectives", oofDirectives)
263                                         }
264                                 } catch (Exception exception) {
265                                         logger.debug("Could not find homing information for service instance: " + serviceInstanceId +
266                                                         "... continuing")
267                                         logger.debug("Could not find homing information for service instance error: " + exception)
268                                 }
269                                 //OofDirectives to Input Params
270                                 Map<String,String> vfModuleInputParams = execution.getVariable("vfModuleInputParams")
271                                 if (oofDirectives != null && vfModuleInputParams != null) {
272                                         vfModuleInputParams.put("oof_directives", oofDirectives)
273                                         vfModuleInputParams.put("sdnc_directives", "{}")
274                                         logger.debug("OofDirectives are: " + oofDirectives)
275                                 } else if (vfModuleInputParams != null) {
276                                         vfModuleInputParams.put("oof_directives", "{}")
277                                         vfModuleInputParams.put("sdnc_directives", "{}")
278                                 }
279                                 if (vfModuleInputParams != null) {
280                                         execution.setVariable("DCVFM_vnfParamsMap", vfModuleInputParams)
281                                         execution.setVariable("DCVFM_vnfParamsExistFlag", true)
282                                 }
283                                 //usePreload
284                                 def usePreload = execution.getVariable("usePreload")
285                                 execution.setVariable("DCVFM_usePreload", usePreload)
286                                 logger.debug("usePreload: " + usePreload)
287                                 //aLaCarte
288                                 def aLaCarte = execution.getVariable("aLaCarte")
289                                 execution.setVariable("DCVFM_aLaCarte", aLaCarte)
290                                 logger.debug("aLaCarte: " + aLaCarte)
291
292                                 //get workload and environment context from parent SI
293                                 String environmentContext = ""
294                                 String workloadContext =""
295                                 String serviceType =""
296
297                                 try{
298                                         String json = catalogDbUtils.getServiceResourcesByServiceModelInvariantUuidString(execution,modelInvariantUuid )
299                                         serviceType = jsonUtil.getJsonValue(json, "serviceResources.serviceType")
300                                 }catch(BpmnError e){
301                                         throw e
302                                 } catch (Exception ex){
303                                         String msg = "Exception in preProcessRequest " + ex.getMessage()
304                                         logger.debug(msg)
305                                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
306                                 }
307
308                                 try{
309                                         AAIUri serviceInstanceURI = AAIUriFactory.create(AAIObjectType.SERVICE_INSTANCE, globalSubscriberId,serviceType,serviceInstanceId)
310                                         AAIResourcesClient aaiRC = new AAIResourcesClient()
311                                         AAIResultWrapper aaiRW = aaiRC.get(serviceInstanceURI)
312                                         Map<String, Object> aaiJson = aaiRW.asMap()
313                                         environmentContext = aaiJson.getOrDefault("environment-context","")
314                                         workloadContext = aaiJson.getOrDefault("workload-context","")
315
316                                 }catch (Exception ex) {
317                                         logger.debug("Error retreiving parent service instance information")
318                                 }
319
320                                 execution.setVariable("DCVFM_environmentContext",environmentContext)
321                                 execution.setVariable("DCVFM_workloadContext",workloadContext)
322
323                         }
324                         else {
325                                 // The info is inside the request - DEAD CODE
326                                 logger.debug("DoCreateVfModule request: " + request)
327
328                                 //tenantId
329                                 def tenantId = ""
330                                 if (utils.nodeExists(request, "tenant-id")) {
331                                         tenantId = utils.getNodeText(request, "tenant-id")
332                                 }
333                                 execution.setVariable("DCVFM_tenantId", tenantId)
334                                 rollbackData.put("VFMODULE", "tenantid", tenantId)
335                                 //volumeGroupId
336                                 def volumeGroupId = ""
337                                 if (utils.nodeExists(request, "volume-group-id")) {
338                                         volumeGroupId = utils.getNodeText(request, "volume-group-id")
339                                 }
340                                 execution.setVariable("DCVFM_volumeGroupId", volumeGroupId)
341                                 //volumeGroupId
342                                 def volumeGroupName = ""
343                                 if (utils.nodeExists(request, "volume-group-name")) {
344                                         volumeGroupName = utils.getNodeText(request, "volume-group-name")
345                                 }
346                                 execution.setVariable("DCVFM_volumeGroupName", volumeGroupName)
347                                 //cloudSiteId
348                                 def cloudSiteId = ""
349                                 if (utils.nodeExists(request, "aic-cloud-region")) {
350                                         cloudSiteId = utils.getNodeText(request, "aic-cloud-region")
351                                 }
352                                 execution.setVariable("DCVFM_cloudSiteId", cloudSiteId)
353                                 rollbackData.put("VFMODULE", "aiccloudregion", cloudSiteId)
354                                 logger.debug("cloudSiteId: " + cloudSiteId)
355                                 //vnfType
356                                 def vnfType = ""
357                                 if (utils.nodeExists(request, "vnf-type")) {
358                                         vnfType = utils.getNodeText(request, "vnf-type")
359                                 }
360                                 execution.setVariable("DCVFM_vnfType", vnfType)
361                                 rollbackData.put("VFMODULE", "vnftype", vnfType)
362                                 logger.debug("vnfType: " + vnfType)
363                                 //vnfName
364                                 def vnfName = ""
365                                 if (utils.nodeExists(request, "vnf-name")) {
366                                         vnfName = utils.getNodeText(request, "vnf-name")
367                                 }
368                                 execution.setVariable("DCVFM_vnfName", vnfName)
369                                 rollbackData.put("VFMODULE", "vnfname", vnfName)
370                                 logger.debug("vnfName: " + vnfName)
371                                 //vnfId
372                                 def vnfId = ""
373                                 if (utils.nodeExists(request, "vnf-id")) {
374                                         vnfId = utils.getNodeText(request, "vnf-id")
375                                 }
376                                 execution.setVariable("DCVFM_vnfId", vnfId)
377                                 rollbackData.put("VFMODULE", "vnfid", vnfId)
378                                 logger.debug("vnfId: " + vnfId)
379                                 //vfModuleName
380                                 def vfModuleName = ""
381                                 if (utils.nodeExists(request, "vf-module-name")) {
382                                         vfModuleName = utils.getNodeText(request, "vf-module-name")
383                                 }
384                                 execution.setVariable("DCVFM_vfModuleName", vfModuleName)
385                                 rollbackData.put("VFMODULE", "vfmodulename", vfModuleName)
386                                 logger.debug("vfModuleName: " + vfModuleName)
387                                 //vfModuleModelName
388                                 def vfModuleModelName = ""
389                                 if (utils.nodeExists(request, "vf-module-model-name")) {
390                                         vfModuleModelName = utils.getNodeText(request, "vf-module-model-name")
391                                 }
392                                 execution.setVariable("DCVFM_vfModuleModelName", vfModuleModelName)
393                                 rollbackData.put("VFMODULE", "vfmodulemodelname", vfModuleModelName)
394                                 logger.debug("vfModuleModelName: " + vfModuleModelName)
395                                 //modelCustomizationUuid
396                                 def modelCustomizationUuid = ""
397                                 if (utils.nodeExists(request, "model-customization-id")) {
398                                         modelCustomizationUuid = utils.getNodeText(request, "model-customization-id")
399                                 }
400                                 execution.setVariable("DCVFM_modelCustomizationUuid", modelCustomizationUuid)
401                                 rollbackData.put("VFMODULE", "modelcustomizationuuid", modelCustomizationUuid)
402                                 logger.debug("modelCustomizationUuid: " + modelCustomizationUuid)
403                                 //vfModuleId
404                                 def vfModuleId = ""
405                                 if (utils.nodeExists(request, "vf-module-id")) {
406                                         vfModuleId = utils.getNodeText(request, "vf-module-id")
407                                 }
408                                 execution.setVariable("DCVFM_vfModuleId", vfModuleId)
409                                 logger.debug("vfModuleId: " + vfModuleId)
410                                 def requestId = ""
411                                 if (utils.nodeExists(request, "request-id")) {
412                                         requestId = utils.getNodeText(request, "request-id")
413                                 }
414                                 execution.setVariable("DCVFM_requestId", requestId)
415                                 logger.debug("requestId: " + requestId)
416                                 //serviceId
417                                 def serviceId = ""
418                                 if (utils.nodeExists(request, "service-id")) {
419                                         serviceId = utils.getNodeText(request, "service-id")
420                                 }
421                                 execution.setVariable("DCVFM_serviceId", serviceId)
422                                 logger.debug("serviceId: " + serviceId)
423                                 //serviceInstanceId
424                                 def serviceInstanceId = ""
425                                 if (utils.nodeExists(request, "service-instance-id")) {
426                                         serviceInstanceId = utils.getNodeText(request, "service-instance-id")
427                                 }
428                                 execution.setVariable("DCVFM_serviceInstanceId", serviceInstanceId)
429                                 rollbackData.put("VFMODULE", "serviceInstanceId", serviceInstanceId)
430                                 logger.debug("serviceInstanceId: " + serviceInstanceId)
431                                 //source
432                                 def source = ""
433                                 if (utils.nodeExists(request, "source")) {
434                                         source = utils.getNodeText(request, "source")
435                                 }
436                                 execution.setVariable("DCVFM_source", source)
437                                 rollbackData.put("VFMODULE", "source", source)
438                                 logger.debug("source: " + source)
439                                 //backoutOnFailure
440                                 NetworkUtils networkUtils = new NetworkUtils()
441                                 def backoutOnFailure = networkUtils.isRollbackEnabled(execution,request)
442                                 execution.setVariable("DCVFM_backoutOnFailure", backoutOnFailure)
443                                 logger.debug("backoutOnFailure: " + backoutOnFailure)
444                                 //isBaseVfModule
445                                 def isBaseVfModule = "false"
446                                 if (utils.nodeExists(request, "is-base-vf-module")) {
447                                         isBaseVfModule = utils.getNodeText(request, "is-base-vf-module")
448                                 }
449                                 execution.setVariable("DCVFM_isBaseVfModule", isBaseVfModule)
450                                 logger.debug("isBaseVfModule: " + isBaseVfModule)
451                                 //asdcServiceModelVersion
452                                 def asdcServiceModelVersion = ""
453                                 if (utils.nodeExists(request, "asdc-service-model-version")) {
454                                         asdcServiceModelVersion = utils.getNodeText(request, "asdc-service-model-version")
455                                 }
456                                 execution.setVariable("DCVFM_asdcServiceModelVersion", asdcServiceModelVersion)
457                                 logger.debug("asdcServiceModelVersion: " + asdcServiceModelVersion)
458
459                                 //personaModelId
460                                 def personaModelId = ""
461                                 if (utils.nodeExists(request, "persona-model-id")) {
462                                         personaModelId = utils.getNodeText(request, "persona-model-id")
463                                 }
464                                 execution.setVariable("DCVFM_personaModelId", personaModelId)
465                                 logger.debug("personaModelId: " + personaModelId)
466
467                                 //personaModelVersion
468                                 def personaModelVersion = ""
469                                 if (utils.nodeExists(request, "persona-model-version")) {
470                                         personaModelVersion = utils.getNodeText(request, "persona-model-version")
471                                 }
472                                 execution.setVariable("DCVFM_personaModelVersion", personaModelVersion)
473                                 logger.debug("personaModelVersion: " + personaModelVersion)
474
475                                 // Process the parameters
476
477                                                 String vnfParamsChildNodes = utils.getChildNodes(request, "vnf-params")
478                                                 if(vnfParamsChildNodes == null || vnfParamsChildNodes.length() < 1){
479                                                                 logger.debug("Request contains NO VNF Params")
480                                                 }else{
481                                                                 logger.debug("Request does contain VNF Params")
482                                                                 execution.setVariable("DCVFM_vnfParamsExistFlag", true)
483
484                                                                 InputSource xmlSource = new InputSource(new StringReader(request));
485                                                                 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
486                                                                 docFactory.setNamespaceAware(true)
487                                                                 DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
488                                                                 Document xml = docBuilder.parse(xmlSource)
489                                                                 //Get params, build map
490                                                                 Map<String, String> paramsMap = new HashMap<String, String>()
491                                                                 NodeList paramsList = xml.getElementsByTagNameNS("*", "param")
492
493                                                                 for (int z = 0; z < paramsList.getLength(); z++) {
494                                                                         Node node = paramsList.item(z)
495                                                                         String paramValue = node.getTextContent()
496                                                                         NamedNodeMap e = node.getAttributes()
497                                                                         String paramName = e.getNamedItem("name").getTextContent()
498                                                                         paramsMap.put(paramName, paramValue)
499                                                                 }
500                                                                 execution.setVariable("DCVFM_vnfParamsMap", paramsMap)
501                                                         }
502
503                                 //OofDirectives
504                                 String oofDirectives = null
505                                 try {
506                                         HomingInstance homingInstance = oofInfraUtils.getHomingInstance(serviceInstanceId, execution)
507                                         if (homingInstance != null) {
508                                                 execution.setVariable("DCVFM_cloudSiteId", homingInstance.getCloudRegionId())
509                                                 rollbackData.put("VFMODULE", "aiccloudregion", homingInstance.getCloudRegionId())
510                                                 logger.debug("Overwriting cloudSiteId with homing cloudSiteId: " +
511                                                                 homingInstance.getCloudRegionId())
512                                                 execution.setVariable("DCVFM_cloudOwner", homingInstance.getCloudOwner())
513                                                 rollbackData.put("VFMODULE", "cloudOwner", homingInstance.getCloudOwner())
514                                                 logger.debug("Overwriting cloudOwner with homing cloudOwner: " +
515                                                                 homingInstance.getCloudOwner())
516                                                 oofDirectives = homingInstance.getOofDirectives()
517                                                 execution.setVariable("DCVFM_oofDirectives", oofDirectives)
518                                         }
519                                 } catch (Exception exception) {
520                                         logger.debug("Could not find homing information for service instance: " + serviceInstanceId +
521                                                         "... continuing")
522                                         logger.debug("Could not find homing information for service instance error: " + exception)
523                                 }
524                                 if (oofDirectives != null) {
525                                         Map<String, String> paramsMap = execution.getVariable("DCVFM_vnfParamsMap")
526                                         paramsMap.put("oofDirectives", oofDirectives)
527                                         logger.debug("OofDirectives are: " + oofDirectives)
528                                         execution.setVariable("DCVFM_vnfParamsMap", paramsMap)
529                                 }
530                         }
531
532
533                         //Get or Generate UUID
534                         String uuid = execution.getVariable("DCVFM_uuid")
535                         if(uuid == null){
536                                 uuid = UUID.randomUUID()
537                                 logger.debug("Generated messageId (UUID) is: " + uuid)
538                         }else{
539                                 logger.debug("Found messageId (UUID) is: " + uuid)
540                         }
541                         // Get sdncVersion, default to empty
542                         String sdncVersion = execution.getVariable("sdncVersion")
543                         if (sdncVersion == null) {
544                                 sdncVersion = ""
545                         }
546                         logger.debug("sdncVersion: " + sdncVersion)
547                         execution.setVariable("DCVFM_sdncVersion", sdncVersion)
548
549                         execution.setVariable("DCVFM_uuid", uuid)
550                         execution.setVariable("DCVFM_baseVfModuleId", "")
551                         execution.setVariable("DCVFM_baseVfModuleHeatStackId", "")
552                         execution.setVariable("DCVFM_heatStackId", "")
553                         execution.setVariable("DCVFM_contrailServiceInstanceFqdn", "")
554                         execution.setVariable("DCVFM_volumeGroupStackId", "")
555                         execution.setVariable("DCVFM_cloudRegionForVolume", "")
556                         execution.setVariable("DCVFM_contrailNetworkPolicyFqdnList", "")
557                         execution.setVariable("DCVFM_vnfTypeToQuery", "generic-vnf")
558                         rollbackData.put("VFMODULE", "rollbackPrepareUpdateVfModule", "false")
559                         rollbackData.put("VFMODULE", "rollbackUpdateAAIVfModule", "false")
560                         rollbackData.put("VFMODULE", "rollbackVnfAdapterCreate", "false")
561                         rollbackData.put("VFMODULE", "rollbackSDNCRequestActivate", "false")
562                         rollbackData.put("VFMODULE", "rollbackSDNCRequestAssign", "false")
563                         rollbackData.put("VFMODULE", "rollbackCreateAAIVfModule", "false")
564                         rollbackData.put("VFMODULE", "rollbackCreateNetworkPoliciesAAI", "false")
565                         rollbackData.put("VFMODULE", "rollbackUpdateVnfAAI", "false")
566                         rollbackData.put("VFMODULE", "heatstackid", "")
567
568                         String sdncCallbackUrl = (String) UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution)
569                                 if (sdncCallbackUrl == null || sdncCallbackUrl.trim().isEmpty()) {
570                                         def msg = 'Required variable \'mso.workflow.sdncadapter.callback\' is missing'
571                                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
572                                                         MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError.getValue(), msg);
573
574                                         exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
575                                 }
576                                 execution.setVariable("DCVFM_sdncCallbackUrl", sdncCallbackUrl)
577                             logger.debug("SDNC Callback URL is: " + sdncCallbackUrl)
578
579
580                         execution.setVariable("rollbackData", rollbackData)
581                 }catch(BpmnError b){
582             logger.error(b);
583                         throw b
584                 }catch(Exception e){
585             logger.error(e);
586                         exceptionUtil.buildAndThrowWorkflowException(execution, 2000, "Internal Error encountered in PreProcess method!")
587                 }
588
589                 logger.trace('Exited ' + method)
590         }
591
592         /**
593          * Validates a workflow response.
594          * @param execution the execution
595          * @param responseVar the execution variable in which the response is stored
596          * @param responseCodeVar the execution variable in which the response code is stored
597          * @param errorResponseVar the execution variable in which the error response is stored
598          */
599         public void validateWorkflowResponse(DelegateExecution execution, String responseVar,
600                         String responseCodeVar, String errorResponseVar) {
601                 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
602                 sdncAdapterUtils.validateSDNCResponse(execution, responseVar, responseCodeVar, errorResponseVar)
603         }
604
605
606         /**
607          * Sends the empty, synchronous response back to the API Handler.
608          * @param execution the execution
609          */
610         public void sendResponse(DelegateExecution execution) {
611                 def method = getClass().getSimpleName() + '.sendResponse(' +
612                         'execution=' + execution.getId() +
613                         ')'
614
615                 logger.trace('Entered ' + method)
616
617                 try {
618                         sendWorkflowResponse(execution, 200, "")
619                         logger.trace('Exited ' + method)
620                 } catch (BpmnError e) {
621                         throw e;
622                 } catch (Exception e) {
623                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
624                                         'Caught exception in ' + method, "BPMN", MsoLogger.getServiceName(),
625                                         MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
626
627                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Internal Error')
628                 }
629         }
630
631         /**
632          * Using the received vnfId and vfModuleId, query AAI to get the corresponding VNF info.
633          * A 200 response is expected with the VNF info in the response body. Will find out the base module info
634          * and existing VNF's name for add-on modules
635          *
636          * @param execution The flow's execution instance.
637          */
638         public void postProcessCreateAAIVfModule(DelegateExecution execution) {
639                 def method = getClass().getSimpleName() + '.getVfModule(' +
640                         'execution=' + execution.getId() +
641                         ')'
642
643                 logger.trace('Entered ' + method)
644
645                 try {
646                         def createResponse = execution.getVariable('DCVFM_createVfModuleResponse')
647                         logger.debug("createVfModule Response: " + createResponse)
648
649                         def rollbackData = execution.getVariable("rollbackData")
650                         String vnfName = utils.getNodeText(createResponse, 'vnf-name')
651                         if (vnfName != null) {
652                                 execution.setVariable('DCVFM_vnfName', vnfName)
653                                 logger.debug("vnfName retrieved from AAI is: " + vnfName)
654                                 rollbackData.put("VFMODULE", "vnfname", vnfName)
655                         }
656                         String vnfId = utils.getNodeText(createResponse, 'vnf-id')
657                         execution.setVariable('DCVFM_vnfId', vnfId)
658                         logger.debug("vnfId is: " + vnfId)
659                         String vfModuleId = utils.getNodeText(createResponse, 'vf-module-id')
660                         execution.setVariable('DCVFM_vfModuleId', vfModuleId)
661                         logger.debug("vfModuleId is: " + vfModuleId)
662                         String vfModuleIndex= utils.getNodeText(createResponse, 'vf-module-index')
663                         execution.setVariable('DCVFM_vfModuleIndex', vfModuleIndex)
664                         logger.debug("vfModuleIndex is: " + vfModuleIndex)
665                         rollbackData.put("VFMODULE", "vnfid", vnfId)
666                         rollbackData.put("VFMODULE", "vfmoduleid", vfModuleId)
667                         rollbackData.put("VFMODULE", "rollbackCreateAAIVfModule", "true")
668                         rollbackData.put("VFMODULE", "rollbackPrepareUpdateVfModule", "true")
669                         execution.setVariable("rollbackData", rollbackData)
670                 } catch (Exception ex) {
671                                 ex.printStackTrace()
672                                 logger.debug('Exception occurred while postProcessing CreateAAIVfModule request:' + ex.getMessage())
673                                 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Bad response from CreateAAIVfModule' + ex.getMessage())
674                 }
675                 logger.trace('Exited ' + method)
676         }
677
678
679         /**
680          * Using the received vnfId and vfModuleId, query AAI to get the corresponding VNF info.
681          * A 200 response is expected with the VNF info in the response body. Will find out the base module info.
682          *
683          * @param execution The flow's execution instance.
684          */
685         public void queryAAIVfModule(DelegateExecution execution) {
686
687                 def method = getClass().getSimpleName() + '.getVfModule(' +
688                         'execution=' + execution.getId() +
689                         ')'
690                 logger.trace('Entered ' + method)
691
692                 try {
693                         def vnfId = execution.getVariable('DCVFM_vnfId')
694                         def vfModuleId = execution.getVariable('DCVFM_vfModuleId')
695
696                         AaiUtil aaiUriUtil = new AaiUtil(this)
697                         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId).depth(Depth.ONE)
698                         String endPoint = aaiUriUtil.createAaiUri(uri)
699
700                         try {
701                                 HttpClient client = httpClientFactory.newXmlClient(new URL(endPoint), TargetEntity.AAI)
702                                 client.addAdditionalHeader('X-TransactionId', UUID.randomUUID().toString())
703                                 client.addAdditionalHeader('X-FromAppId', 'MSO')
704                                 client.addAdditionalHeader('Content-Type', MediaType.APPLICATION_XML)
705                                 client.addAdditionalHeader('Accept', MediaType.APPLICATION_XML)
706
707                                 logger.debug('sending GET to AAI endpoint \'' + endPoint + '\'')
708                                 Response response = client.get()
709
710                                 String responseData = response.readEntity(String.class)
711                                 if (responseData != null) {
712                                         logger.debug("Received generic VNF data: " + responseData)
713
714                                 }
715
716                                 execution.setVariable('DCVFM_queryAAIVfModuleResponseCode', response.getStatus())
717                                 execution.setVariable('DCVFM_queryAAIVfModuleResponse', responseData)
718                                 logger.debug('Response code:' + response.getStatus())
719                                 logger.debug('Response:' + System.lineSeparator() + responseData)
720                                 if (response.getStatus() == 200) {
721                                         // Parse the VNF record from A&AI to find base module info
722                                         logger.debug('Parsing the VNF data to find base module info')
723                                         if (responseData != null) {
724                                                 def vfModulesText = utils.getNodeXml(responseData, "vf-modules")
725                                                 def xmlVfModules= new XmlSlurper().parseText(vfModulesText)
726                                                 def vfModules = xmlVfModules.'**'.findAll {it.name() == "vf-module"}
727                                                 int vfModulesSize = 0
728                                                 for (i in 0..vfModules.size()-1) {
729                                                         def vfModuleXml = groovy.xml.XmlUtil.serialize(vfModules[i])
730                                                         def isBaseVfModule = utils.getNodeText(vfModuleXml, "is-base-vf-module")
731
732                                                         if (isBaseVfModule == "true") {
733                                                             String baseModuleId = utils.getNodeText(vfModuleXml, "vf-module-id")
734                                                             execution.setVariable("DCVFM_baseVfModuleId", baseModuleId)
735                                                             logger.debug('Received baseVfModuleId: ' + baseModuleId)
736                                                             String baseModuleHeatStackId = utils.getNodeText(vfModuleXml, "heat-stack-id")
737                                                             execution.setVariable("DCVFM_baseVfModuleHeatStackId", baseModuleHeatStackId)
738                                                             logger.debug('Received baseVfModuleHeatStackId: ' + baseModuleHeatStackId)
739                                                         }
740                                                 }
741                                         }
742                                 }
743                         } catch (Exception ex) {
744                                 ex.printStackTrace()
745                                 logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
746                                 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
747                         }
748                         logger.trace('Exited ' + method)
749                 } catch (BpmnError e) {
750                         throw e;
751                 } catch (Exception e) {
752                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
753                                         'Caught exception in ' + method, "BPMN", MsoLogger.getServiceName(),
754                                         MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
755                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in queryAAIVfModule(): ' + e.getMessage())
756                 }
757         }
758
759         /**
760          * Using the vnfId and vfModuleName provided in the inputs,
761          * query AAI to get the corresponding VF Module info.
762          * A 200 response is expected with the VF Module info in the response body,
763          * or a 404 response if the module does not exist yet. Will determine VF Module's
764          * orchestration status if one exists
765          *
766          * @param execution The flow's execution instance.
767          */
768         public void queryAAIVfModuleForStatus(DelegateExecution execution) {
769
770                 def method = getClass().getSimpleName() + '.queryAAIVfModuleForStatus(' +
771                         'execution=' + execution.getId() +
772                         ')'
773                 logger.trace('Entered ' + method)
774
775                 execution.setVariable('DCVFM_orchestrationStatus', '')
776
777                 try {
778                         def vnfId = execution.getVariable('DCVFM_vnfId')
779                         def vfModuleName = execution.getVariable('DCVFM_vfModuleName')
780
781                         AaiUtil aaiUriUtil = new AaiUtil(this)
782                         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.VF_MODULE, vnfId).queryParam("vf-module-name",vfModuleName)
783                         String endPoint = aaiUriUtil.createAaiUri(uri)
784
785                         HttpClient client = httpClientFactory.newXmlClient(new URL(endPoint), TargetEntity.AAI)
786                         client.addAdditionalHeader('X-TransactionId', UUID.randomUUID().toString())
787                         client.addAdditionalHeader('X-FromAppId', 'MSO')
788                         client.addAdditionalHeader('Content-Type', MediaType.APPLICATION_XML)
789                         client.addAdditionalHeader('Accept', MediaType.APPLICATION_XML)
790
791                         try {
792                                 def responseData = ''
793
794                                 logger.debug('sending GET to AAI endpoint \'' + endPoint + '\'')
795                                 Response response = client.get()
796                                 logger.debug("createVfModule - invoking httpGet() to AAI")
797
798                                 responseData = response.readEntity(String.class)
799                                 if (responseData != null) {
800                                         logger.debug("Received generic VNF data: " + responseData)
801
802                                 }
803
804                                 execution.setVariable('DCVFM_queryAAIVfModuleForStatusResponseCode', response.getStatus())
805                                 execution.setVariable('DCVFM_queryAAIVfModuleForStatusResponse', responseData)
806                                 logger.debug('Response code:' + response.getStatus())
807                                 logger.debug('Response:' + System.lineSeparator() + responseData)
808                                 // Retrieve VF Module info and its orchestration status; if not found, do nothing
809                                 if (response.getStatus() == 200) {
810                                         // Parse the VNF record from A&AI to find base module info
811                                         logger.debug('Parsing the VNF data to find orchestration status')
812                                         if (responseData != null) {
813                                                 def vfModuleText = utils.getNodeXml(responseData, "vf-module")
814                                                 //def xmlVfModule= new XmlSlurper().parseText(vfModuleText)
815                                                 def orchestrationStatus = utils.getNodeText(vfModuleText, "orchestration-status")
816                                                 execution.setVariable("DCVFM_orchestrationStatus", orchestrationStatus)
817                                                 // Also retrieve vfModuleId
818                                                 def vfModuleId = utils.getNodeText(vfModuleText, "vf-module-id")
819                                                 execution.setVariable("DCVFM_vfModuleId", vfModuleId)
820                                                 logger.debug("Received orchestration status from A&AI: " + orchestrationStatus)
821
822                                         }
823                                 }
824                         } catch (Exception ex) {
825                                 ex.printStackTrace()
826                                 logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
827                                 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
828                         }
829                         logger.trace('Exited ' + method)
830                 } catch (BpmnError e) {
831                         throw e;
832                 } catch (Exception e) {
833                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
834                                         'Caught exception in ' + method, "BPMN", MsoLogger.getServiceName(),
835                                         MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
836                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in queryAAIVfModuleForStatus(): ' + e.getMessage())
837                 }
838         }
839
840
841         public void preProcessSDNCAssignRequest(DelegateExecution execution){
842
843                 execution.setVariable("prefix", Prefix)
844                 logger.trace("STARTED preProcessSDNCAssignRequest")
845                 def vnfId = execution.getVariable("DCVFM_vnfId")
846                 def vfModuleId = execution.getVariable("DCVFM_vfModuleId")
847                 def serviceInstanceId = execution.getVariable("DCVFM_serviceInstanceId")
848                 logger.debug("NEW VNF ID: " + vnfId)
849
850                 try{
851
852                         //Build SDNC Request
853
854                         def svcInstId = ""
855                         if (serviceInstanceId == null || serviceInstanceId.isEmpty()) {
856                                 svcInstId = vfModuleId
857                         }
858                         else {
859                                 svcInstId = serviceInstanceId
860                         }
861
862                         String assignSDNCRequest = buildSDNCRequest(execution, svcInstId, "assign")
863
864                         assignSDNCRequest = utils.formatXml(assignSDNCRequest)
865                         execution.setVariable("DCVFM_assignSDNCRequest", assignSDNCRequest)
866                         logger.debug("Outgoing AssignSDNCRequest is: \n" + assignSDNCRequest)
867
868                 }catch(Exception e){
869                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
870                                         "Exception Occurred Processing preProcessSDNCAssignRequest", "BPMN", MsoLogger.getServiceName(),
871                                         MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
872                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occurred during prepareProvision Method:\n" + e.getMessage())
873                 }
874                 logger.trace("COMPLETED preProcessSDNCAssignRequest")
875         }
876
877         public void preProcessSDNCGetRequest(DelegateExecution execution, String element){
878
879                 String sdncVersion = execution.getVariable("DCVFM_sdncVersion")
880                 execution.setVariable("prefix", Prefix)
881                 logger.trace("STARTED preProcessSDNCGetRequest Process")
882                 try{
883                         def serviceInstanceId = execution.getVariable('DCVFM_serviceInstanceId')
884
885                         String uuid = execution.getVariable('testReqId') // for junits
886                         if(uuid==null){
887                                 uuid = execution.getVariable("mso-request-id") + "-" +  System.currentTimeMillis()
888                         }
889
890                         def callbackUrl = execution.getVariable("DCVFM_sdncCallbackUrl")
891                         logger.debug("callbackUrl:" + callbackUrl)
892
893                         def vfModuleId = execution.getVariable('DCVFM_vfModuleId')
894
895                         def svcInstId = ""
896                         if (serviceInstanceId == null || serviceInstanceId.isEmpty()) {
897                                 svcInstId = vfModuleId
898                         }
899                         else {
900                                 svcInstId = serviceInstanceId
901                         }
902
903                         def msoAction = ""
904                         if (!sdncVersion.equals("1707")) {
905                                 msoAction = "mobility"
906                         }
907                         else {
908                                 msoAction = "vfmodule"
909                         }
910                         // For VNF, serviceOperation (URI for topology GET) will be retrieved from "selflink" element
911                         // For VF Module, in 1707 serviceOperation will be retrieved from "object-path" element
912                         // in SDNC Assign Response
913                         // For VF Module for older versions, serviceOperation is constructed using vfModuleId
914
915                         String serviceOperation = ""
916                         if (element.equals("vnf")) {
917                                 AAIResourcesClient resourceClient = new AAIResourcesClient()
918                                 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, execution.getVariable('DCVFM_vnfId'))
919                                 AAIResultWrapper wrapper = resourceClient.get(uri)
920
921                                 Optional<GenericVnf> vnf = wrapper.asBean(GenericVnf.class)
922                                 serviceOperation = vnf.get().getSelflink()
923                                 logger.debug("VNF - service operation: " + serviceOperation)
924                         }
925                         else if (element.equals("vfmodule")) {
926                                 String response = execution.getVariable("DCVFM_assignSDNCAdapterResponse")
927                                 logger.debug("DCVFM_assignSDNCAdapterResponse is: \n" + response)
928
929                                 if (!sdncVersion.equals("1707")) {
930                                         serviceOperation = "/VNF-API:vnfs/vnf-list/" + vfModuleId
931                                         logger.debug("VF Module with sdncVersion before 1707 - service operation: " + serviceOperation)
932                                 }
933                                 else {
934                                         String data = utils.getNodeXml(response, "response-data")
935                                         logger.debug("responseData: " + data)
936                                         serviceOperation = utils.getNodeText(data, "object-path")
937                                         logger.debug("VF Module with sdncVersion of 1707 - service operation: " + serviceOperation)
938                                 }
939                         }
940
941                         //!!!! TEMPORARY WORKAROUND FOR SDNC REPLICATION ISSUE
942                         sleep(5000)
943
944                         String SDNCGetRequest =
945                                         """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.onap/so/request/types/v1"
946                                                                                         xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
947                                                                                         xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
948                                         <sdncadapter:RequestHeader>
949                                         <sdncadapter:RequestId>${MsoUtils.xmlEscape(uuid)}</sdncadapter:RequestId>
950                                         <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(svcInstId)}</sdncadapter:SvcInstanceId>
951                                         <sdncadapter:SvcAction>query</sdncadapter:SvcAction>
952                                         <sdncadapter:SvcOperation>${MsoUtils.xmlEscape(serviceOperation)}</sdncadapter:SvcOperation>
953                                         <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackUrl)}</sdncadapter:CallbackUrl>
954                                         <sdncadapter:MsoAction>${MsoUtils.xmlEscape(msoAction)}</sdncadapter:MsoAction>
955                                 </sdncadapter:RequestHeader>
956                                         <sdncadapterworkflow:SDNCRequestData></sdncadapterworkflow:SDNCRequestData>
957                                 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
958
959                         execution.setVariable("DCVFM_getSDNCRequest", SDNCGetRequest)
960                         logger.debug("Outgoing GetSDNCRequest is: \n" + SDNCGetRequest)
961
962                 }catch(Exception e){
963                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
964                                         "Exception Occurred Processing preProcessSDNCGetRequest", "BPMN", MsoLogger.getServiceName(),
965                                         MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
966                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during prepareProvision Method:\n" + e.getMessage())
967                 }
968                 logger.trace("COMPLETED preProcessSDNCGetRequest Process")
969         }
970
971
972         public void preProcessVNFAdapterRequest(DelegateExecution execution) {
973                 def method = getClass().getSimpleName() + '.VNFAdapterCreateVfModule(' +
974                         'execution=' + execution.getId() +
975                         ')'
976
977                 logger.trace('Entered ' + method)
978
979                 //def xml = execution.getVariable("DoCreateVfModuleRequest")
980                 //logger.debug('VNF REQUEST is: ' + xml)
981
982                 //Get variables
983                 //cloudSiteId
984                 def cloudSiteId = execution.getVariable("DCVFM_cloudSiteId")
985                 //tenantId
986                 def tenantId = execution.getVariable("DCVFM_tenantId")
987                 //vnfType
988                 def vnfType = execution.getVariable("DCVFM_vnfType")
989                 //vnfName
990                 def vnfName = execution.getVariable("DCVFM_vnfName")
991                 //vnfId
992                 def vnfId = execution.getVariable("DCVFM_vnfId")
993                 //vfModuleName
994                 def vfModuleName = execution.getVariable("DCVFM_vfModuleName")
995                 //vfModuleModelName
996                 def vfModuleModelName = execution.getVariable("DCVFM_vfModuleModelName")
997                 //vfModuleId
998                 def vfModuleId = execution.getVariable("DCVFM_vfModuleId")
999                 //vfModuleIndex
1000                 def vfModuleIndex = execution.getVariable("DCVFM_vfModuleIndex")
1001                 //requestId
1002                 def requestId = execution.getVariable("DCVFM_requestId")
1003                 //serviceId
1004                 def serviceId = execution.getVariable("DCVFM_serviceId")
1005                 //serviceInstanceId
1006                 def serviceInstanceId = execution.getVariable("DCVFM_serviceInstanceId")
1007                 //backoutOnFailure
1008                 def backoutOnFailure = execution.getVariable("DCVFM_backoutOnFailure")
1009                 //volumeGroupId
1010                 def volumeGroupId = execution.getVariable("DCVFM_volumeGroupId")
1011                 // baseVfModuleId
1012                 def baseVfModuleId = execution.getVariable("DCVFM_baseVfModuleId")
1013                 // baseVfModuleStackId
1014                 def baseVfModuleStackId = execution.getVariable("DCVFM_baseVfModuleHeatStackId")
1015                 // asdcServiceModelVersion
1016                 def asdcServiceModelVersion = execution.getVariable("DCVFM_asdcServiceModelVersion")
1017                 //volumeGroupStackId
1018                 def volumeGroupStackId = execution.getVariable("DCVFM_volumeGroupStackId")
1019                 //modelCustomizationUuid
1020                 def modelCustomizationUuid = execution.getVariable("DCVFM_modelCustomizationUuid")
1021                 //environmentContext
1022                 String environmentContext = execution.getVariable("DCVFM_environmentContext")
1023                 //workloadContext
1024                 String workloadContext = execution.getVariable("DCVFM_workloadContext")
1025                 logger.debug("workloadContext: " + workloadContext)
1026                 logger.debug("environmentContext: " + environmentContext)
1027
1028                 def messageId = execution.getVariable('mso-request-id') + '-' +
1029                                 System.currentTimeMillis()
1030
1031                 def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId)
1032                 def useQualifiedHostName = UrnPropertiesReader.getVariable("mso.use.qualified.host",execution)
1033
1034                 logger.debug("notificationUrl: " + notificationUrl)
1035                 logger.debug("QualifiedHostName: " + useQualifiedHostName)
1036
1037                 if ('true'.equals(useQualifiedHostName)) {
1038                         notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)
1039                 }
1040
1041                 Map<String, String> vnfParamsMap = execution.getVariable("DCVFM_vnfParamsMap")
1042                 String vfModuleParams = ""
1043                 //Get SDNC Response Data for VF Module Topology
1044                 String vfModuleSdncGetResponse = execution.getVariable('DCVFM_getSDNCAdapterResponse')
1045                 logger.debug("sdncGetResponse: " + vfModuleSdncGetResponse)
1046                 def sdncVersion = execution.getVariable("sdncVersion")
1047
1048                 if (!sdncVersion.equals("1707")) {
1049
1050                         vfModuleParams = buildVfModuleParams(vnfParamsMap, vfModuleSdncGetResponse, vnfId, vnfName,
1051                                 vfModuleId, vfModuleName, vfModuleIndex, environmentContext, workloadContext)
1052                 }
1053                 else {
1054                         //Get SDNC Response Data for Vnf Topology
1055                         String vnfSdncGetResponse = execution.getVariable('DCVFM_getVnfSDNCAdapterResponse')
1056                         logger.debug("vnfSdncGetResponse: " + vnfSdncGetResponse)
1057
1058                         vfModuleParams = buildVfModuleParamsFromCombinedTopologies(vnfParamsMap, vnfSdncGetResponse, vfModuleSdncGetResponse, vnfId, vnfName,
1059                                 vfModuleId, vfModuleName, vfModuleIndex, environmentContext, workloadContext)
1060                 }
1061
1062                 def svcInstId = ""
1063                 if (serviceInstanceId == null || serviceInstanceId.isEmpty()) {
1064                                 svcInstId = serviceId
1065                 }
1066                 else {
1067                         svcInstId = serviceInstanceId
1068                 }
1069
1070                 String createVnfARequest = """
1071                 <createVfModuleRequest>
1072                 <cloudSiteId>${MsoUtils.xmlEscape(cloudSiteId)}</cloudSiteId>
1073                 <tenantId>${MsoUtils.xmlEscape(tenantId)}</tenantId>
1074                 <vnfId>${MsoUtils.xmlEscape(vnfId)}</vnfId>
1075                 <vnfName>${MsoUtils.xmlEscape(vnfName)}</vnfName>
1076                 <vfModuleName>${MsoUtils.xmlEscape(vfModuleName)}</vfModuleName>
1077                 <vfModuleId>${MsoUtils.xmlEscape(vfModuleId)}</vfModuleId>
1078                 <vnfType>${MsoUtils.xmlEscape(vnfType)}</vnfType>
1079                 <vfModuleType>${MsoUtils.xmlEscape(vfModuleModelName)}</vfModuleType>
1080                 <vnfVersion>${MsoUtils.xmlEscape(asdcServiceModelVersion)}</vnfVersion>
1081                 <modelCustomizationUuid>${MsoUtils.xmlEscape(modelCustomizationUuid)}</modelCustomizationUuid>
1082                 <requestType></requestType>
1083                 <volumeGroupId>${MsoUtils.xmlEscape(volumeGroupId)}</volumeGroupId>
1084         <volumeGroupStackId>${MsoUtils.xmlEscape(volumeGroupStackId)}</volumeGroupStackId>
1085         <baseVfModuleId>${MsoUtils.xmlEscape(baseVfModuleId)}</baseVfModuleId>
1086         <baseVfModuleStackId>${MsoUtils.xmlEscape(baseVfModuleStackId)}</baseVfModuleStackId>
1087         <skipAAI>true</skipAAI>
1088         <backout>${MsoUtils.xmlEscape(backoutOnFailure)}</backout>
1089         <failIfExists>true</failIfExists>
1090                 <vfModuleParams>
1091                 ${vfModuleParams}
1092                 </vfModuleParams>
1093                 <msoRequest>
1094                         <requestId>${MsoUtils.xmlEscape(requestId)}</requestId>
1095                         <serviceInstanceId>${MsoUtils.xmlEscape(svcInstId)}</serviceInstanceId>
1096                 </msoRequest>
1097                 <messageId>${MsoUtils.xmlEscape(messageId)}</messageId>
1098                 <notificationUrl>${MsoUtils.xmlEscape(notificationUrl)}</notificationUrl>
1099                 </createVfModuleRequest>"""
1100
1101                 logger.debug("Create VfModule Request to VNF Adapter: " + createVnfARequest)
1102                 execution.setVariable("DCVFM_createVnfARequest", createVnfARequest)
1103         }
1104
1105         /**
1106          * Validates the request, request id and service instance id.  If a problem is found,
1107          * a WorkflowException is generated and an MSOWorkflowException event is thrown. This
1108          * method also sets up the log context for the workflow.
1109          * @param execution the execution
1110          * @return the validated request
1111          */
1112         public String validateInfraRequest(DelegateExecution execution) {
1113                 def method = getClass().getSimpleName() + '.validateInfraRequest(' +
1114                         'execution=' + execution.getId() +
1115                         ')'
1116
1117                 logger.trace('Entered ' + method)
1118
1119                 String processKey = getProcessKey(execution);
1120                 def prefix = execution.getVariable("prefix")
1121
1122                 if (prefix == null) {
1123                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, processKey + " prefix is null")
1124                 }
1125
1126                 try {
1127                         def request = execution.getVariable(prefix + 'Request')
1128
1129                         if (request == null) {
1130                                 request = execution.getVariable(processKey + 'Request')
1131
1132                                 if (request == null) {
1133                                         request = execution.getVariable('bpmnRequest')
1134                                 }
1135
1136                                 setVariable(execution, processKey + 'Request', null);
1137                                 setVariable(execution, 'bpmnRequest', null);
1138                                 setVariable(execution, prefix + 'Request', request);
1139                         }
1140
1141                         if (request == null) {
1142                                 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, processKey + " request is null")
1143                         }
1144                         logger.debug("DoCreateVfModule Request: " + request)
1145
1146                         /*
1147
1148                         def requestId = execution.getVariable("mso-request-id")
1149
1150                         if (requestId == null) {
1151                                 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, processKey + " request has no mso-request-id")
1152                         }
1153
1154                         def serviceInstanceId = execution.getVariable("mso-service-instance-id")
1155
1156                         if (serviceInstanceId == null) {
1157                                 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, processKey + " request message has no mso-service-instance-id")
1158                         }
1159
1160                         utils.logContext(requestId, serviceInstanceId)
1161                         */
1162                         logger.debug('Incoming message: ' + System.lineSeparator() + request)
1163                         logger.trace('Exited ' + method)
1164                         return request
1165                 } catch (BpmnError e) {
1166                         throw e;
1167                 } catch (Exception e) {
1168                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
1169                                         'Caught exception in ' + method, "BPMN", MsoLogger.getServiceName(),
1170                                         MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
1171                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Invalid Message")
1172                 }
1173         }
1174
1175         public boolean isVolumeGroupIdPresent(DelegateExecution execution) {
1176
1177                 def method = getClass().getSimpleName() + '.isVolumeGroupIdPresent(' +
1178                         'execution=' + execution.getId() +
1179                         ')'
1180
1181                 logger.trace('Entered ' + method)
1182
1183                 def request = execution.getVariable('DoCreateVfModuleRequest')
1184                 String volumeGroupId = utils.getNodeText(request, "volume-group-id")
1185                 if (volumeGroupId == null || volumeGroupId.isEmpty()) {
1186                         logger.debug('No volume group id is present')
1187                         return false
1188                 }
1189                 else {
1190                         logger.debug('Volume group id is present')
1191                         return true
1192                 }
1193
1194         }
1195
1196         public boolean isVolumeGroupNamePresent(DelegateExecution execution) {
1197
1198                 def method = getClass().getSimpleName() + '.isVolumeGroupNamePresent(' +
1199                         'execution=' + execution.getId() +
1200                         ')'
1201
1202                 logger.trace('Entered ' + method)
1203
1204                 def request = execution.getVariable('DoCreateVfModuleRequest')
1205                 String volumeGroupName = utils.getNodeText(request, "volume-group-name")
1206                 if (volumeGroupName == null || volumeGroupName.isEmpty()) {
1207                         logger.debug('No volume group name is present')
1208                         return false
1209                 }
1210                 else {
1211                         logger.debug('Volume group name is present')
1212                         return true
1213                 }
1214
1215         }
1216
1217         public String buildSDNCRequest(DelegateExecution execution, String svcInstId, String action){
1218
1219                 String uuid = execution.getVariable('testReqId') // for junits
1220                 if(uuid==null){
1221                         uuid = execution.getVariable("mso-request-id") + "-" +          System.currentTimeMillis()
1222                 }
1223                 def callbackURL = execution.getVariable("DCVFM_sdncCallbackUrl")
1224                 def requestId = execution.getVariable("DCVFM_requestId")
1225                 def serviceId = execution.getVariable("DCVFM_serviceId")
1226                 def vnfType = execution.getVariable("DCVFM_vnfType")
1227                 def vnfName = execution.getVariable("DCVFM_vnfName")
1228                 def tenantId = execution.getVariable("DCVFM_tenantId")
1229                 def source = execution.getVariable("DCVFM_source")
1230                 def backoutOnFailure = execution.getVariable("DCVFM_backoutOnFailure")
1231                 def vfModuleId = execution.getVariable("DCVFM_vfModuleId")
1232                 def vfModuleName = execution.getVariable("DCVFM_vfModuleName")
1233                 def vfModuleModelName = execution.getVariable("DCVFM_vfModuleModelName")
1234                 def vnfId = execution.getVariable("DCVFM_vnfId")
1235                 def cloudSiteId = execution.getVariable("DCVFM_cloudSiteId")
1236                 def sdncVersion = execution.getVariable("DCVFM_sdncVersion")
1237                 def serviceModelInfo = execution.getVariable("serviceModelInfo")
1238                 def vnfModelInfo = execution.getVariable("vnfModelInfo")
1239                 def vfModuleModelInfo = execution.getVariable("vfModuleModelInfo")
1240                 String serviceEcompModelInformation = sdncAdapterUtils.modelInfoToEcompModelInformation(serviceModelInfo)
1241                 String vnfEcompModelInformation = sdncAdapterUtils.modelInfoToEcompModelInformation(vnfModelInfo)
1242                 String vfModuleEcompModelInformation = sdncAdapterUtils.modelInfoToEcompModelInformation(vfModuleModelInfo)
1243                 def globalSubscriberId = execution.getVariable("DCVFM_globalSubscriberId")
1244                 boolean usePreload = execution.getVariable("DCVFM_usePreload")
1245                 String usePreloadToSDNC = usePreload ? "Y" : "N"
1246                 def modelCustomizationUuid = execution.getVariable("DCVFM_modelCustomizationUuid")
1247                 def modelCustomizationUuidString = ""
1248                 if (!usePreload) {
1249                         modelCustomizationUuidString = "<model-customization-uuid>" + modelCustomizationUuid + "</model-customization-uuid>"
1250                 }
1251
1252                 String sdncVNFParamsXml = ""
1253
1254                 if(execution.getVariable("DCVFM_vnfParamsExistFlag") == true){
1255                         if (!sdncVersion.equals("1707")) {
1256                                 sdncVNFParamsXml = buildSDNCParamsXml(execution)
1257                         }
1258                         else {
1259                                 sdncVNFParamsXml = buildCompleteSDNCParamsXml(execution)
1260                         }
1261                 }else{
1262                         sdncVNFParamsXml = ""
1263                 }
1264
1265                 String sdncRequest = ""
1266
1267                 if (!sdncVersion.equals("1707")) {
1268
1269                         sdncRequest =
1270                 """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.onap/so/request/types/v1"
1271                                                                                                         xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
1272                                                                                                         xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
1273            <sdncadapter:RequestHeader>
1274                                 <sdncadapter:RequestId>${MsoUtils.xmlEscape(uuid)}</sdncadapter:RequestId>
1275                                 <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(svcInstId)}</sdncadapter:SvcInstanceId>
1276                                 <sdncadapter:SvcAction>${MsoUtils.xmlEscape(action)}</sdncadapter:SvcAction>
1277                                 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
1278                                 <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackURL)}</sdncadapter:CallbackUrl>
1279                 </sdncadapter:RequestHeader>
1280         <sdncadapterworkflow:SDNCRequestData>
1281                 <request-information>
1282                         <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
1283                         <request-action>VNFActivateRequest</request-action>
1284                         <source>${MsoUtils.xmlEscape(source)}</source>
1285                         <notification-url/>
1286                 </request-information>
1287                 <service-information>
1288                         <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
1289                         <service-type>${MsoUtils.xmlEscape(serviceId)}</service-type>
1290                         <service-instance-id>${MsoUtils.xmlEscape(svcInstId)}</service-instance-id>
1291                         <subscriber-name>notsurewecare</subscriber-name>
1292                 </service-information>
1293                 <vnf-request-information>
1294                         <vnf-id>${MsoUtils.xmlEscape(vfModuleId)}</vnf-id>
1295                         <vnf-type>${MsoUtils.xmlEscape(vfModuleModelName)}</vnf-type>
1296                         <vnf-name>${MsoUtils.xmlEscape(vfModuleName)}</vnf-name>
1297                         <generic-vnf-id>${MsoUtils.xmlEscape(vnfId)}</generic-vnf-id>
1298                         <generic-vnf-name>${MsoUtils.xmlEscape(vnfName)}</generic-vnf-name>
1299                         <generic-vnf-type>${MsoUtils.xmlEscape(vnfType)}</generic-vnf-type>
1300                         <aic-cloud-region>${MsoUtils.xmlEscape(cloudSiteId)}</aic-cloud-region>
1301                         <tenant>${MsoUtils.xmlEscape(tenantId)}</tenant>
1302                         ${modelCustomizationUuidString}
1303                         <use-preload>${MsoUtils.xmlEscape(usePreloadToSDNC)}</use-preload>
1304                 ${sdncVNFParamsXml}
1305                 </vnf-request-information>
1306         </sdncadapterworkflow:SDNCRequestData>
1307         </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
1308
1309                 }
1310                 else {
1311
1312                         sdncRequest =
1313                         """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.onap/so/request/types/v1"
1314                                                                                                         xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
1315                                                                                                         xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
1316            <sdncadapter:RequestHeader>
1317                                 <sdncadapter:RequestId>${MsoUtils.xmlEscape(uuid)}</sdncadapter:RequestId>
1318                                 <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(svcInstId)}</sdncadapter:SvcInstanceId>
1319                                 <sdncadapter:SvcAction>${MsoUtils.xmlEscape(action)}</sdncadapter:SvcAction>
1320                                 <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
1321                                 <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackURL)}</sdncadapter:CallbackUrl>
1322                                 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
1323                 </sdncadapter:RequestHeader>
1324         <sdncadapterworkflow:SDNCRequestData>
1325                 <request-information>
1326                         <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
1327                         <request-action>CreateVfModuleInstance</request-action>
1328                         <source>${MsoUtils.xmlEscape(source)}</source>
1329                         <notification-url/>
1330                 </request-information>
1331                 <service-information>
1332                         <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
1333                         <subscription-service-type>${MsoUtils.xmlEscape(serviceId)}</subscription-service-type>
1334                         ${serviceEcompModelInformation}
1335                         <service-instance-id>${MsoUtils.xmlEscape(svcInstId)}</service-instance-id>
1336                         <global-customer-id>${MsoUtils.xmlEscape(globalSubscriberId)}</global-customer-id>
1337                 </service-information>
1338                 <vnf-information>
1339                         <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
1340                         <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
1341                         ${vnfEcompModelInformation}
1342                 </vnf-information>
1343                 <vf-module-information>
1344                         <vf-module-id>${MsoUtils.xmlEscape(vfModuleId)}</vf-module-id>
1345                         <vf-module-type>${MsoUtils.xmlEscape(vfModuleModelName)}</vf-module-type>
1346                         ${vfModuleEcompModelInformation}
1347                 </vf-module-information>
1348                 <vf-module-request-input>
1349                         <vf-module-name>${MsoUtils.xmlEscape(vfModuleName)}</vf-module-name>
1350                         <tenant>${MsoUtils.xmlEscape(tenantId)}</tenant>
1351                         <aic-cloud-region>${MsoUtils.xmlEscape(cloudSiteId)}</aic-cloud-region>
1352                 ${sdncVNFParamsXml}
1353                 </vf-module-request-input>
1354           </sdncadapterworkflow:SDNCRequestData>
1355         </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
1356
1357
1358                         /*
1359                         sdncRequest =
1360                         """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.onap/so/request/types/v1"
1361                                                                                                         xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
1362                                                                                                         xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
1363            <sdncadapter:RequestHeader>
1364                                 <sdncadapter:RequestId>${MsoUtils.xmlEscape(requestId)}</sdncadapter:RequestId>
1365                                 <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(svcInstId)}</sdncadapter:SvcInstanceId>
1366                                 <sdncadapter:SvcAction>${MsoUtils.xmlEscape(action)}</sdncadapter:SvcAction>
1367                                 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
1368                                 <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackURL)}</sdncadapter:CallbackUrl>
1369                 </sdncadapter:RequestHeader>
1370         <sdncadapterworkflow:SDNCRequestData>
1371                 <request-information>
1372                         <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
1373                         <request-action>CreateVfModuleInstance</request-action>
1374                         <source>${MsoUtils.xmlEscape(source)}</source>
1375                         <notification-url/>
1376                 </request-information>
1377                 <service-information>
1378                         <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
1379                         <service-type>${MsoUtils.xmlEscape(serviceId)}</service-type>
1380                         ${serviceEcompModelInformation}
1381                         <service-instance-id>${MsoUtils.xmlEscape(svcInstId)}</service-instance-id>
1382                         <global-customer-id>${MsoUtils.xmlEscape(globalSubscriberId)}</global-customer-id>
1383                 </service-information>
1384                 <vnf-information>
1385                         <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
1386                         <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
1387                         ${vnfEcompModelInformation}
1388                 </vnf-information>
1389                 <vf-module-information>
1390                         <vf-module-id>${MsoUtils.xmlEscape(vfModuleId)}</vf-module-id>
1391                         <vf-module-type>${MsoUtils.xmlEscape(vfModuleModelName)}</vf-module-type>
1392                         ${vfModuleEcompModelInformation}
1393                 </vf-module-information>
1394                 <vf-module-request-input>
1395                         <vf-module-name>${MsoUtils.xmlEscape(vfModuleName)}</vf-module-name>
1396                         <tenant>${MsoUtils.xmlEscape(tenantId)}</tenant>
1397                         <aic-cloud-region>${MsoUtils.xmlEscape(cloudSiteId)}</aic-cloud-region>
1398                 ${sdncVNFParamsXml}
1399                 </vf-module-request-input>
1400         </sdncadapterworkflow:SDNCRequestData>
1401         </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
1402                         */
1403
1404                 }
1405
1406         logger.debug("sdncRequest:  " + sdncRequest)
1407         return sdncRequest
1408
1409         }
1410
1411         public void preProcessSDNCActivateRequest(DelegateExecution execution) {
1412                 def method = getClass().getSimpleName() + '.preProcessSDNCActivateRequest(' +
1413                         'execution=' + execution.getId() +
1414                         ')'
1415
1416                 logger.trace('Entered ' + method)
1417                 execution.setVariable("prefix", Prefix)
1418                 logger.trace("STARTED preProcessSDNCActivateRequest Process")
1419                 try{
1420                         String vnfId = execution.getVariable("DCVFM_vnfId")
1421                         String vfModuleId = execution.getVariable("DCVFM_vfModuleId")
1422                         String serviceInstanceId = execution.getVariable("DCVFM_serviceInstanceId")
1423
1424                         def svcInstId = ""
1425                         if (serviceInstanceId == null || serviceInstanceId.isEmpty()) {
1426                                 svcInstId = vfModuleId
1427                         }
1428                         else {
1429                                 svcInstId = serviceInstanceId
1430                         }
1431                         String activateSDNCRequest = buildSDNCRequest(execution, svcInstId, "activate")
1432
1433                         execution.setVariable("DCVFM_activateSDNCRequest", activateSDNCRequest)
1434                         logger.debug("Outgoing CommitSDNCRequest is: \n" + activateSDNCRequest)
1435
1436                 }catch(Exception e){
1437                         logger.debug("Exception Occured Processing preProcessSDNCActivateRequest. Exception is:\n" + e)
1438                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during  preProcessSDNCActivateRequest Method:\n" + e.getMessage())
1439                 }
1440                 logger.trace("COMPLETED  preProcessSDNCActivateRequest Process")
1441         }
1442
1443         public void postProcessVNFAdapterRequest(DelegateExecution execution) {
1444                 def method = getClass().getSimpleName() + '.postProcessVNFAdapterRequest(' +
1445                         'execution=' + execution.getId() +
1446                         ')'
1447
1448                 logger.trace('Entered ' + method)
1449                 execution.setVariable("prefix",Prefix)
1450                 try{
1451                 logger.debug("STARTED postProcessVNFAdapterRequest Process")
1452
1453                 String vnfResponse = execution.getVariable("DCVFM_createVnfAResponse")
1454                 logger.debug("VNF Adapter Response is: " + vnfResponse)
1455
1456                 RollbackData rollbackData = execution.getVariable("rollbackData")
1457                 if(vnfResponse != null){
1458
1459                         if(vnfResponse.contains("createVfModuleResponse")){
1460                                 logger.debug("Received a Good Response from VNF Adapter for CREATE_VF_MODULE Call.")
1461                                 execution.setVariable("DCVFM_vnfVfModuleCreateCompleted", true)
1462                                 String heatStackId = utils.getNodeText(vnfResponse, "vfModuleStackId")
1463                                 execution.setVariable("DCVFM_heatStackId", heatStackId)
1464                                 logger.debug("Received heat stack id from VNF Adapter: " + heatStackId)
1465                                 rollbackData.put("VFMODULE", "heatstackid", heatStackId)
1466                                 // Parse vnfOutputs for network_fqdn
1467                                 if (vnfResponse.contains("vfModuleOutputs")) {
1468                                         def vfModuleOutputsXml = utils.getNodeXml(vnfResponse, "vfModuleOutputs")
1469                                         InputSource source = new InputSource(new StringReader(vfModuleOutputsXml));
1470                         DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
1471                         docFactory.setNamespaceAware(true)
1472                         DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
1473                         Document outputsXml = docBuilder.parse(source)
1474
1475                                         NodeList entries = outputsXml.getElementsByTagNameNS("*", "entry")
1476                                         List contrailNetworkPolicyFqdnList = []
1477                                         for (int i = 0; i< entries.getLength(); i++) {
1478                                                 Node node = entries.item(i)
1479                                                 if (node.getNodeType() == Node.ELEMENT_NODE) {
1480                                                         Element element = (Element) node
1481                                                         String key = element.getElementsByTagNameNS("*", "key").item(0).getTextContent()
1482                                                         if (key.equals("contrail-service-instance-fqdn")) {
1483                                                                 String contrailServiceInstanceFqdn = element.getElementsByTagNameNS("*", "value").item(0).getTextContent()
1484                                                                 logger.debug("Obtained contrailServiceInstanceFqdn: " + contrailServiceInstanceFqdn)
1485                                                                 execution.setVariable("DCVFM_contrailServiceInstanceFqdn", contrailServiceInstanceFqdn)
1486                                                         }
1487                                                         else if (key.endsWith("contrail_network_policy_fqdn")) {
1488                                                                 String contrailNetworkPolicyFqdn = element.getElementsByTagNameNS("*", "value").item(0).getTextContent()
1489                                                                 logger.debug("Obtained contrailNetworkPolicyFqdn: " + contrailNetworkPolicyFqdn)
1490                                                                 contrailNetworkPolicyFqdnList.add(contrailNetworkPolicyFqdn)
1491                                                         }
1492                                                         else if (key.equals("oam_management_v4_address")) {
1493                                                                 String oamManagementV4Address = element.getElementsByTagNameNS("*", "value").item(0).getTextContent()
1494                                                                 logger.debug("Obtained oamManagementV4Address: " + oamManagementV4Address)
1495                                                                 execution.setVariable("DCVFM_oamManagementV4Address", oamManagementV4Address)
1496                                                         }
1497                                                         else if (key.equals("oam_management_v6_address")) {
1498                                                                 String oamManagementV6Address = element.getElementsByTagNameNS("*", "value").item(0).getTextContent()
1499                                                                 logger.debug("Obtained oamManagementV6Address: " + oamManagementV6Address)
1500                                                                 execution.setVariable("DCVFM_oamManagementV6Address", oamManagementV6Address)
1501                                                         }
1502
1503                                                 }
1504                                         }
1505                                         if (!contrailNetworkPolicyFqdnList.isEmpty()) {
1506                                                 execution.setVariable("DCVFM_contrailNetworkPolicyFqdnList", contrailNetworkPolicyFqdnList)
1507                                         }
1508                                 }
1509                         }else{
1510                                 logger.debug("Received a BAD Response from VNF Adapter for CREATE_VF_MODULE Call.")
1511                                 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "VNF Adapter Error")
1512                         }
1513                 }else{
1514                         logger.debug("Response from VNF Adapter is Null for CREATE_VF_MODULE Call.")
1515                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Empty response from VNF Adapter")
1516                 }
1517
1518                 rollbackData.put("VFMODULE", "rollbackVnfAdapterCreate", "true")
1519                 execution.setVariable("rollbackData", rollbackData)
1520
1521                 }catch(BpmnError b){
1522                         throw b
1523                 }catch(Exception e){
1524                         logger.debug("Internal Error Occured in PostProcess Method")
1525                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Internal Error Occured in PostProcess Method")
1526                 }
1527                 logger.trace("COMPLETED postProcessVnfAdapterResponse Process")
1528         }
1529
1530
1531         public void preProcessUpdateAAIVfModuleRequestOrch(DelegateExecution execution) {
1532                 def method = getClass().getSimpleName() + '.preProcessUpdateAAIVfModuleRequestOrch(' +
1533                         'execution=' + execution.getId() +
1534                         ')'
1535
1536                 logger.trace('Entered ' + method)
1537                 execution.setVariable("prefix", Prefix)
1538                 logger.trace("STARTED preProcessUpdateAAIVfModuleRequestOrch")
1539
1540                 try{
1541
1542                         //Build UpdateAAIVfModule Request
1543                         boolean setContrailServiceInstanceFqdn = false
1544                         def contrailServiceInstanceFqdn = execution.getVariable("DCVFM_contrailServiceInstanceFqdn")
1545                         if (!contrailServiceInstanceFqdn.equals("")) {
1546                                 setContrailServiceInstanceFqdn = true
1547                         }
1548
1549                         execution.setVariable("DCVFM_orchestrationStatus", "Created")
1550
1551                         String updateAAIVfModuleRequest = buildUpdateAAIVfModuleRequest(execution, false, true, true, setContrailServiceInstanceFqdn)
1552
1553                         updateAAIVfModuleRequest = utils.formatXml(updateAAIVfModuleRequest)
1554                         execution.setVariable("DCVFM_updateAAIVfModuleRequest", updateAAIVfModuleRequest)
1555                         logger.debug("Outgoing UpdateAAIVfModuleRequest is: \n" + updateAAIVfModuleRequest)
1556
1557                 }catch(Exception e){
1558                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
1559                                         "Exception Occured Processing preProcessUpdateAAIVfModuleRequestOrch", "BPMN",
1560                                         MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
1561                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during preProcessUpdateAAIVfModuleRequestOrch Method:\n" + e.getMessage())
1562                 }
1563                 logger.trace("COMPLETED preProcessUpdateAAIVfModuleRequestOrch")
1564
1565         }
1566
1567         public void preProcessUpdateAAIVfModuleRequestStatus(DelegateExecution execution, String status) {
1568                 def method = getClass().getSimpleName() + '.preProcessUpdateAAIVfModuleStatus(' +
1569                         'execution=' + execution.getId() +
1570                         ')'
1571
1572                 logger.trace('Entered ' + method)
1573                 execution.setVariable("prefix", Prefix)
1574                 logger.trace("STARTED preProcessUpdateAAIVfModuleStatus")
1575
1576                 try{
1577
1578                         //Build UpdateAAIVfModule Request
1579                         execution.setVariable("DCVFM_orchestrationStatus", status)
1580
1581                         String updateAAIVfModuleRequest = buildUpdateAAIVfModuleRequest(execution, false, true, false, false)
1582
1583                         updateAAIVfModuleRequest = utils.formatXml(updateAAIVfModuleRequest)
1584                         execution.setVariable("DCVFM_updateAAIVfModuleRequest", updateAAIVfModuleRequest)
1585                         logger.debug("Outgoing UpdateAAIVfModuleRequest is: \n" + updateAAIVfModuleRequest)
1586
1587                 }catch(Exception e){
1588                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
1589                                         "Exception Occured Processing preProcessUpdateAAIVfModuleStatus", "BPMN",
1590                                         MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
1591                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during preProcessUpdateAAIVfModuleStatus Method:\n" + e.getMessage())
1592                 }
1593                 logger.trace("COMPLETED preProcessUpdateAAIVfModuleStatus")
1594
1595         }
1596
1597
1598         public void preProcessUpdateAAIVfModuleRequestGroup(DelegateExecution execution) {
1599                 def method = getClass().getSimpleName() + '.preProcessUpdateAAIVfModuleRequestGroup(' +
1600                         'execution=' + execution.getId() +
1601                         ')'
1602
1603                 logger.trace('Entered ' + method)
1604                 execution.setVariable("prefix", Prefix)
1605                 logger.trace("STARTED preProcessUpdateAAIVfModuleRequestGroup")
1606
1607                 try{
1608
1609                         //Build UpdateAAIVfModule Request
1610
1611                         String updateAAIVfModuleRequest = buildUpdateAAIVfModuleRequest(execution, true, false, false, false)
1612
1613                         updateAAIVfModuleRequest = utils.formatXml(updateAAIVfModuleRequest)
1614                         execution.setVariable("DCVFM_updateAAIVfModuleRequest", updateAAIVfModuleRequest)
1615                         logger.debug("Outgoing UpdateAAIVfModuleRequest is: \n" + updateAAIVfModuleRequest)
1616
1617                 }catch(Exception e){
1618                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
1619                                         "Exception Occured Processing preProcessUpdateAAIVfModuleRequestGroup", "BPMN",
1620                                         MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
1621                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during preProcessUpdateAAIVfModuleRequestGroup Method:\n" + e.getMessage())
1622                 }
1623                 logger.trace("COMPLETED  preProcessUpdateAAIVfModuleRequestGroup")
1624
1625         }
1626
1627         public void validateSDNCResponse(DelegateExecution execution, String response, String method){
1628
1629                 execution.setVariable("prefix",Prefix)
1630                 logger.debug("STARTED ValidateSDNCResponse Process")
1631
1632                 WorkflowException workflowException = execution.getVariable("WorkflowException")
1633                 boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
1634
1635                 logger.debug("workflowException: " + workflowException)
1636
1637                 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
1638                 sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
1639
1640                 String sdncResponse = response
1641                 if(execution.getVariable(Prefix + 'sdncResponseSuccess') == true){
1642                         logger.debug("Received a Good Response from SDNC Adapter for " + method + " SDNC Call.  Response is: \n" + sdncResponse)
1643                         RollbackData rollbackData = execution.getVariable("rollbackData")
1644
1645                         if(method.equals("assign")){
1646                                 rollbackData.put("VFMODULE", "rollbackSDNCRequestAssign", "true")
1647                                 execution.setVariable("CRTGVNF_sdncAssignCompleted", true)
1648                         }
1649                         else if (method.equals("activate")) {
1650                                 rollbackData.put("VFMODULE", "rollbackSDNCRequestActivate", "true")
1651                         }
1652                         execution.setVariable("rollbackData", rollbackData)
1653                 }else{
1654                         logger.debug("Received a BAD Response from SDNC Adapter for " + method + " SDNC Call.")
1655                         throw new BpmnError("MSOWorkflowException")
1656                 }
1657                 logger.trace("COMPLETED ValidateSDNCResponse Process")
1658         }
1659
1660         public void preProcessUpdateAfterCreateRequest(DelegateExecution execution){
1661
1662                 execution.setVariable("prefix", Prefix)
1663                 logger.trace("STARTED preProcessRequest Process")
1664                 try{
1665                         String response = execution.getVariable("DCVFM_assignSDNCAdapterResponse")
1666                         logger.debug("DCVFM_assignSDNCAdapterResponse: " + response)
1667
1668                         String data = utils.getNodeXml(response, "response-data")
1669                         String vnfId = utils.getNodeText(data, "vnf-id")
1670
1671                         String uuid = execution.getVariable('testReqId') // for junits
1672                         if(uuid==null){
1673                                 uuid = execution.getVariable("mso-request-id") + "-" +          System.currentTimeMillis()
1674                         }
1675
1676                         String serviceOperation = "/VNF-API:vnfs/vnf-list/" + vnfId
1677                         def callbackUrl = execution.getVariable("DCVFM_sdncCallbackUrl")
1678                         logger.debug("callbackUrl: " + callbackUrl)
1679
1680                         String SDNCGetRequest =
1681                                         """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.onap/so/request/types/v1"
1682                                                                                         xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
1683                                                                                         xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
1684                                         <sdncadapter:RequestHeader>
1685                                         <sdncadapter:RequestId>${MsoUtils.xmlEscape(uuid)}</sdncadapter:RequestId>
1686                                         <sdncadapter:SvcAction>query</sdncadapter:SvcAction>
1687                                         <sdncadapter:SvcOperation>${MsoUtils.xmlEscape(serviceOperation)}</sdncadapter:SvcOperation>
1688                                         <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackUrl)}</sdncadapter:CallbackUrl>
1689                                         <sdncadapter:MsoAction>mobility</sdncadapter:MsoAction>
1690                                 </sdncadapter:RequestHeader>
1691                                         <sdncadapterworkflow:SDNCRequestData></sdncadapterworkflow:SDNCRequestData>
1692                                 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
1693
1694                         execution.setVariable("DCVFM_getSDNCRequest", SDNCGetRequest)
1695                         logger.debug("Outgoing GetSDNCRequest is: \n" + SDNCGetRequest)
1696
1697                 }catch(Exception e){
1698                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
1699                                         "Exception Occured Processing preProcessSDNCGetRequest", "BPMN", MsoLogger.getServiceName(),
1700                                         MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
1701                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during prepareProvision Method:\n" + e.getMessage())
1702                 }
1703                 logger.trace("COMPLETED preProcessSDNCGetRequest Process")
1704         }
1705
1706         public String buildUpdateAAIVfModuleRequest(DelegateExecution execution, boolean updateVolumeGroupId,
1707                 boolean updateOrchestrationStatus, boolean updateHeatStackId, boolean updateContrailFqdn){
1708
1709                 def vnfId = execution.getVariable("DCVFM_vnfId")
1710                 def vfModuleId = execution.getVariable("DCVFM_vfModuleId")
1711                 def volumeGroupIdString = ""
1712                 if (updateVolumeGroupId) {
1713                         volumeGroupIdString = "<volume-group-id>" + execution.getVariable("DCVFM_volumeGroupId") +
1714                                         "</volume-group-id>"
1715                 }
1716                 def orchestrationStatusString = ""
1717                 if (updateOrchestrationStatus) {
1718                         orchestrationStatusString = "<orchestration-status>" + execution.getVariable("DCVFM_orchestrationStatus") + "</orchestration-status>"
1719                 }
1720                 def heatStackIdString = ""
1721                 if (updateHeatStackId) {
1722                         heatStackIdString = "<heat-stack-id>" + execution.getVariable("DCVFM_heatStackId") + "</heat-stack-id>"
1723                 }
1724                 def contrailFqdnString = ""
1725                 if (updateContrailFqdn) {
1726                         contrailFqdnString = "<contrail-service-instance-fqdn>" + execution.getVariable("DCVFM_contrailServiceInstanceFqdn") +
1727                                 "</contrail-service-instance-fqdn>"
1728                 }
1729
1730                 String updateAAIVfModuleRequest =
1731                         """<UpdateAAIVfModuleRequest>
1732                                 <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
1733                                 <vf-module-id>${MsoUtils.xmlEscape(vfModuleId)}</vf-module-id>
1734                                 ${heatStackIdString}
1735                                 ${orchestrationStatusString}
1736                                 ${volumeGroupIdString}
1737                                 ${contrailFqdnString}
1738                         </UpdateAAIVfModuleRequest>"""
1739
1740         logger.trace("updateAAIVfModule Request: " + updateAAIVfModuleRequest)
1741         return updateAAIVfModuleRequest
1742
1743         }
1744
1745         public String buildSDNCParamsXml(DelegateExecution execution){
1746
1747                 String params = ""
1748                 StringBuilder sb = new StringBuilder()
1749                 Map<String, String> paramsMap = execution.getVariable("DCVFM_vnfParamsMap")
1750
1751                 for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
1752                         String paramsXml
1753                         String key = entry.getKey();
1754                         if(key.endsWith("_network")){
1755                                 String requestKey = key.substring(0, key.indexOf("_network"))
1756                                 String requestValue = entry.getValue()
1757                                 paramsXml =
1758 """<vnf-networks>
1759         <network-role>{ functx:substring-before-match(data($param/@name), '_network') }</network-role>
1760         <network-name>{ $param/text() }</network-name>
1761 </vnf-networks>"""
1762                         }else{
1763                         paramsXml = ""
1764                         }
1765                         params = sb.append(paramsXml)
1766                 }
1767                 return params
1768         }
1769
1770         public String buildCompleteSDNCParamsXml(DelegateExecution execution){
1771
1772                 String params = ""
1773                 StringBuilder sb = new StringBuilder()
1774                 Map<String, String> paramsMap = execution.getVariable("DCVFM_vnfParamsMap")
1775
1776                 for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
1777                         String paramsXml
1778                         String key = entry.getKey();
1779                         String value = entry.getValue()
1780                         paramsXml =     """<${key}>$value</$key>"""
1781                         params = sb.append(paramsXml)
1782                 }
1783                 return params
1784         }
1785
1786    public void queryCloudRegion (DelegateExecution execution) {
1787
1788                 execution.setVariable("prefix", Prefix)
1789                 logger.trace("STARTED queryCloudRegion")
1790
1791                 try {
1792                         String cloudRegion = execution.getVariable("DCVFM_cloudSiteId")
1793
1794                         // Prepare AA&I url
1795                         AaiUtil aaiUtil = new AaiUtil(this)
1796
1797                         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, Defaults.CLOUD_OWNER.toString(), cloudRegion)
1798                         def queryCloudRegionRequest = aaiUtil.createAaiUri(uri)
1799
1800                         execution.setVariable("DCVFM_queryCloudRegionRequest", queryCloudRegionRequest)
1801
1802                         cloudRegion = aaiUtil.getAAICloudReqion(execution, queryCloudRegionRequest, "PO", cloudRegion)
1803
1804                         if ((cloudRegion != "ERROR")) {
1805                                 if(execution.getVariable("DCVFM_queryCloudRegionReturnCode") == "404"){
1806                                         execution.setVariable("DCVFM_cloudRegionForVolume", "AAIAIC25")
1807                                 }else{
1808                                 execution.setVariable("DCVFM_cloudRegionForVolume", cloudRegion)
1809                                 }
1810                                 execution.setVariable("DCVFM_isCloudRegionGood", true)
1811                         } else {
1812                                 String errorMessage = "AAI Query Cloud Region Unsuccessful. AAI Response Code: " + execution.getVariable("DCVFM_queryCloudRegionReturnCode")
1813                                 logger.debug(errorMessage)
1814                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
1815                                 execution.setVariable("DCVFM_isCloudRegionGood", false)
1816                         }
1817                         logger.debug(" is Cloud Region Good: " + execution.getVariable("DCVFM_isCloudRegionGood"))
1818
1819                 } catch(BpmnError b){
1820                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
1821                                         "Rethrowing MSOWorkflowException", "BPMN", MsoLogger.getServiceName(),
1822                                         MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + b.getMessage());
1823                         throw b
1824                 }catch (Exception ex) {
1825                         // try error
1826                         String errorMessage = "Bpmn error encountered in CreateVfModule flow. Unexpected Response from AAI - " + ex.getMessage()
1827                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
1828                                         "AAI Query Cloud Region Failed " + errorMessage, "BPMN", MsoLogger.getServiceName(),
1829                                         MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + ex);
1830                         exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Exception occured during queryCloudRegion method")
1831                 }
1832         }
1833
1834    /**
1835     *
1836     *This method occurs when an MSOWorkflowException is caught.  It logs the
1837     *variables and ensures that the "WorkflowException" Variable is set.
1838     *
1839     */
1840    public void processBPMNException(DelegateExecution execution){
1841
1842            execution.setVariable("prefix",Prefix)
1843            try{
1844                    logger.debug("Caught a BPMN Exception")
1845                    logger.debug("Started processBPMNException Method")
1846                    logger.debug("Variables List: " + execution.getVariables())
1847                    if(execution.getVariable("WorkflowException") == null){
1848                            exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Exception occured during DoCreateVfModule Sub Process")
1849                    }
1850
1851            }catch(Exception e){
1852                    logger.debug("Caught Exception during processBPMNException Method: " + e)
1853            }
1854            logger.debug("Completed processBPMNException Method")
1855    }
1856
1857    public void prepareCreateAAIVfModuleVolumeGroupRequest(DelegateExecution execution) {
1858                 def method = getClass().getSimpleName() + '.prepareCreateAAIVfModuleVolumeGroupRequest(' +
1859                         'execution=' + execution.getId() +
1860                         ')'
1861
1862                 logger.trace('Entered ' + method)
1863                 execution.setVariable("prefix", Prefix)
1864                 logger.trace("STARTED prepareCreateAAIVfModuleVolumeGroupRequest")
1865
1866                 try{
1867
1868                         //Build CreateAAIVfModuleVolumeGroup Request
1869
1870                         def vnfId = execution.getVariable("DCVFM_vnfId")
1871                         def vfModuleId = execution.getVariable("DCVFM_vfModuleId")
1872                         def volumeGroupId = execution.getVariable("DCVFM_volumeGroupId")
1873                         //def aicCloudRegion = execution.getVariable("DCVFM_cloudSiteId")
1874                         def aicCloudRegion = execution.getVariable("DCVFM_cloudRegionForVolume")
1875                         def cloudOwner = execution.getVariable("DCVFM_cloudOwner")
1876                         String createAAIVfModuleVolumeGroupRequest =
1877                         """<CreateAAIVfModuleVolumeGroupRequest>
1878                                 <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
1879                                 <vf-module-id>${MsoUtils.xmlEscape(vfModuleId)}</vf-module-id>
1880                                 <volume-group-id>${MsoUtils.xmlEscape(volumeGroupId)}</volume-group-id>
1881                                 <aic-cloud-region>${MsoUtils.xmlEscape(aicCloudRegion)}</aic-cloud-region>
1882                                 <cloud-owner>${MsoUtils.xmlEscape(cloudOwner)}</cloud-owner>
1883                         </CreateAAIVfModuleVolumeGroupRequest>"""
1884
1885                         createAAIVfModuleVolumeGroupRequest = utils.formatXml(createAAIVfModuleVolumeGroupRequest)
1886                         execution.setVariable("DCVFM_createAAIVfModuleVolumeGroupRequest", createAAIVfModuleVolumeGroupRequest)
1887                         logger.debug("Outgoing CreateAAIVfModuleVolumeGroupRequest is: \n" + createAAIVfModuleVolumeGroupRequest)
1888
1889                 }catch(Exception e){
1890                         logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
1891                                         'Exception Occured Processing prepareCreateAAIVfModuleVolumeGroupRequest', "BPMN",
1892                                         MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
1893                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during prepareCreateAAIVfModuleVolumeGroupRequest Method:\n" + e.getMessage())
1894                 }
1895                 logger.trace("COMPLETED  prepareCreateAAIVfModuleVolumeGroupRequest")
1896
1897         }
1898
1899    public void createNetworkPoliciesInAAI(DelegateExecution execution) {
1900            def method = getClass().getSimpleName() + '.createNetworkPoliciesInAAI(' +
1901            'execution=' + execution.getId() +
1902            ')'
1903
1904            logger.trace('Entered ' + method)
1905            execution.setVariable("prefix", Prefix)
1906            logger.trace("STARTED createNetworkPoliciesInAAI")
1907
1908            try {
1909                    // get variables
1910                    List fqdnList = execution.getVariable("DCVFM_contrailNetworkPolicyFqdnList")
1911                    int fqdnCount = fqdnList.size()
1912                    def rollbackData = execution.getVariable("rollbackData")
1913
1914                    execution.setVariable("DCVFM_networkPolicyFqdnCount", fqdnCount)
1915                    logger.debug("DCVFM_networkPolicyFqdnCount - " + fqdnCount)
1916
1917                    AaiUtil aaiUriUtil = new AaiUtil(this)
1918
1919                         if (fqdnCount > 0) {
1920
1921                                 // AII loop call over contrail network policy fqdn list
1922                                 for (i in 0..fqdnCount-1) {
1923
1924                                         int counting = i+1
1925                                         String fqdn = fqdnList[i]
1926
1927                                         // Query AAI for this network policy FQDN
1928                                         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.NETWORK_POLICY)
1929                                         uri.queryParam("network-policy-fqdn", fqdn)
1930
1931                                         AAIResourcesClient resourceClient = new AAIResourcesClient()
1932
1933
1934                                         if (resourceClient.exists(uri)) {
1935
1936                                                 logger.debug(" QueryAAINetworkPolicyByFQDN Success REST Response, , NetworkPolicy #" + counting)
1937
1938                                         } else {
1939                                                 // This network policy FQDN is not in AAI yet. Add it now
1940                                                 logger.debug("This network policy FQDN is not in AAI yet: " + fqdn)
1941                                                 // Add the network policy with this FQDN to AAI
1942                                                 def networkPolicyId = UUID.randomUUID().toString()
1943                                                 logger.debug("Adding network-policy with network-policy-id " + networkPolicyId)
1944
1945                                                 NetworkPolicy policy = new NetworkPolicy()
1946                                                 policy.setNetworkPolicyId(networkPolicyId)
1947                                                 policy.setNetworkPolicyFqdn(fqdn)
1948                                                 policy.setHeatStackId(execution.getVariable("DCVFM_heatStackId"))
1949                                                 
1950                                                 AAIResourceUri netUri = AAIUriFactory.createResourceUri(AAIObjectType.NETWORK_POLICY, networkPolicyId)
1951                                                 resourceClient.create(netUri, policy)
1952
1953                                                 rollbackData.put("VFMODULE", "rollbackCreateNetworkPoliciesAAI", "true")
1954                                                 rollbackData.put("VFMODULE", "contrailNetworkPolicyFqdn" + i, fqdn)
1955                                                 execution.setVariable("rollbackData", rollbackData)
1956                                         }
1957
1958                                 } // end loop
1959
1960
1961                    } else {
1962                            logger.debug("No contrail network policies to query/create")
1963
1964                    }
1965
1966            } catch (BpmnError e) {
1967                    throw e;
1968            } catch (Exception ex) {
1969                    String exceptionMessage = "Bpmn error encountered in DoCreateVfModule flow. createNetworkPoliciesInAAI() - " + ex.getMessage()
1970                    logger.debug(exceptionMessage)
1971                    exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
1972            }
1973
1974    }
1975
1976    /**
1977         * Prepare a Request for invoking the UpdateAAIGenericVnf subflow.
1978         *
1979         * @param execution The flow's execution instance.
1980         */
1981    public void prepUpdateAAIGenericVnf(DelegateExecution execution) {
1982            def method = getClass().getSimpleName() + '.prepUpdateAAIGenericVnf(' +
1983                    'execution=' + execution.getId() +
1984                    ')'
1985
1986            logger.trace('Entered ' + method)
1987
1988            try {
1989                    def rollbackData = execution.getVariable("rollbackData")
1990                    def vnfId = execution.getVariable('DCVFM_vnfId')
1991                    def oamManagementV4Address = execution.getVariable("DCVFM_oamManagementV4Address")
1992                    def oamManagementV6Address = execution.getVariable("DCVFM_oamManagementV6Address")
1993                    def ipv4OamAddressElement = ''
1994                    def managementV6AddressElement = ''
1995
1996                    if (oamManagementV4Address != null && !oamManagementV4Address.isEmpty()) {
1997                            ipv4OamAddressElement = '<ipv4-oam-address>' + oamManagementV4Address + '</ipv4-oam-address>'
1998                    }
1999
2000                    if (oamManagementV6Address != null && !oamManagementV6Address.isEmpty()) {
2001                            managementV6AddressElement = '<management-v6-address>' + oamManagementV6Address + '</management-v6-address>'
2002                    }
2003
2004                    rollbackData.put("VFMODULE", "oamManagementV4Address", oamManagementV4Address)
2005
2006
2007                    String updateAAIGenericVnfRequest = """
2008                                         <UpdateAAIGenericVnfRequest>
2009                                                 <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
2010                                                 ${ipv4OamAddressElement}
2011                                                 ${managementV6AddressElement}
2012                                         </UpdateAAIGenericVnfRequest>
2013                                 """
2014                            updateAAIGenericVnfRequest = utils.formatXml(updateAAIGenericVnfRequest)
2015                            execution.setVariable('DCVM_updateAAIGenericVnfRequest', updateAAIGenericVnfRequest)
2016                            logger.debug('Request for UpdateAAIGenericVnf:\n' + updateAAIGenericVnfRequest)
2017
2018
2019                    logger.trace('Exited ' + method)
2020            } catch (BpmnError e) {
2021                    throw e;
2022            } catch (Exception e) {
2023                    logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
2024                                    "Exception Encountered in " + method, "BPMN", MsoLogger.getServiceName(),
2025                                    MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
2026
2027                    exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in prepUpdateAAIGenericVnf(): ' + e.getMessage())
2028            }
2029    }
2030
2031    /**
2032         * Post process a result from invoking the UpdateAAIGenericVnf subflow.
2033         *
2034         * @param execution The flow's execution instance.
2035         */
2036    public void postProcessUpdateAAIGenericVnf(DelegateExecution execution) {
2037            def method = getClass().getSimpleName() + '.postProcessUpdateAAIGenericVnf(' +
2038                    'execution=' + execution.getId() +
2039                    ')'
2040
2041            logger.trace('Entered ' + method)
2042
2043            try {
2044                    def rollbackData = execution.getVariable("rollbackData")
2045
2046                    rollbackData.put("VFMODULE", "rollbackUpdateVnfAAI", "true")
2047
2048                    def vnfId = execution.getVariable('DCVFM_vnfId')
2049                    def oamManagementV4Address = execution.getVariable("DCVFM_oamManagementV4Address")
2050                    def oamManagementV6Address = execution.getVariable("DCVFM_oamManagementV6Address")
2051                    def ipv4OamAddressElement = ''
2052                    def managementV6AddressElement = ''
2053
2054                    if (oamManagementV4Address != null && !oamManagementV4Address.isEmpty()) {
2055                            rollbackData.put("VFMODULE", "oamManagementV4Address", oamManagementV4Address)
2056                    }
2057
2058                    if (oamManagementV6Address != null && !oamManagementV6Address.isEmpty()) {
2059                            rollbackData.put("VFMODULE", "oamManagementV6Address", oamManagementV6Address)
2060                    }
2061
2062                    execution.setVariable("rollbackData", rollbackData)
2063
2064                    logger.trace('Exited ' + method)
2065            } catch (BpmnError e) {
2066                    throw e;
2067            } catch (Exception e) {
2068                    logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
2069                                    'Caught exception in ' + method, "BPMN", MsoLogger.getServiceName(),
2070                                    MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
2071                    exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in postProcessUpdateAAIGenericVnf(): ' + e.getMessage())
2072            }
2073    }
2074
2075    public void queryCatalogDB (DelegateExecution execution) {
2076
2077            String msg = ""
2078            logger.trace("queryCatalogDB ")
2079
2080            try {
2081                    boolean twoPhaseDesign = false
2082                    // check for input
2083
2084                    String vfModuleModelName = execution.getVariable("DCVFM_vfModuleModelName")
2085                    logger.debug("vfModuleModelName: " + vfModuleModelName)
2086                    def vnfModelInfo = execution.getVariable("vnfModelInfo")
2087                    def vnfModelCustomizationUuid = jsonUtil.getJsonValue(vnfModelInfo, "modelCustomizationUuid")
2088
2089                    logger.debug("vnfModelCustomizationUuid: " + vnfModelCustomizationUuid)
2090
2091                    JSONArray vnfs = catalogDbUtils.getAllVnfsByVnfModelCustomizationUuid(execution, vnfModelCustomizationUuid, "v2")
2092
2093                    logger.debug("Incoming Query Catalog DB for Vnf Response is: " + vnfModelCustomizationUuid)
2094                    // Only one match here
2095                    if (vnfs != null) {
2096                            JSONObject vnfObject = vnfs.get(0)
2097                            if (vnfObject != null) {
2098                                    String vnfJson = vnfObject.toString()
2099                                    //
2100                                    ObjectMapper om = new ObjectMapper();
2101                                    VnfResource vnf = om.readValue(vnfJson, VnfResource.class);
2102
2103                                    // Get multiStageDesign flag
2104
2105                                    String multiStageDesignValue = vnf.getMultiStageDesign()
2106                                    logger.debug("multiStageDesign value from Catalog DB is: " + multiStageDesignValue)
2107                                    if (multiStageDesignValue != null) {
2108                                            if (multiStageDesignValue.equalsIgnoreCase("true")) {
2109                                                         twoPhaseDesign = true
2110                                            }
2111                                    }
2112                            }
2113                    }
2114
2115                    logger.debug("setting twoPhaseDesign flag to: " + twoPhaseDesign)
2116
2117                    execution.setVariable("DCVFM_twoPhaseDesign", twoPhaseDesign)
2118            } catch (BpmnError e) {
2119                    throw e;
2120            } catch (Exception e) {
2121                    logger.error("{} {} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
2122                                    'Caught exception in queryCatalogDB', "BPMN", MsoLogger.getServiceName(),
2123                                    MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
2124                    exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in queryCatalogDB(): ' + e.getMessage())
2125            }
2126    }
2127
2128
2129    public void preProcessRollback (DelegateExecution execution) {
2130
2131            logger.trace("preProcessRollback")
2132            try {
2133
2134                    Object workflowException = execution.getVariable("WorkflowException");
2135
2136                    if (workflowException instanceof WorkflowException) {
2137                            logger.debug("Prev workflowException: " + workflowException.getErrorMessage())
2138                            execution.setVariable("prevWorkflowException", workflowException);
2139                            //execution.setVariable("WorkflowException", null);
2140                    }
2141            } catch (BpmnError e) {
2142                    logger.debug("BPMN Error during preProcessRollback")
2143            } catch(Exception ex) {
2144                    String msg = "Exception in preProcessRollback. " + ex.getMessage()
2145                    logger.debug(msg)
2146            }
2147            logger.trace("Exit preProcessRollback")
2148    }
2149
2150    public void postProcessRollback (DelegateExecution execution) {
2151
2152            logger.trace("postProcessRollback")
2153            String msg = ""
2154            try {
2155                    Object workflowException = execution.getVariable("prevWorkflowException");
2156                    if (workflowException instanceof WorkflowException) {
2157                            logger.debug("Setting prevException to WorkflowException: ")
2158                            execution.setVariable("WorkflowException", workflowException);
2159                    }
2160                    execution.setVariable("rollbackData", null)
2161            } catch (BpmnError b) {
2162                    logger.debug("BPMN Error during postProcessRollback")
2163                    throw b;
2164            } catch(Exception ex) {
2165                    msg = "Exception in postProcessRollback. " + ex.getMessage()
2166                    logger.debug(msg)
2167            }
2168            logger.trace("Exit postProcessRollback")
2169    }
2170
2171 }