2 * ============LICENSE_START=======================================================
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
23 package org.onap.so.bpmn.infrastructure.scripts
25 import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
26 import org.onap.so.client.HttpClientFactory
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
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
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
77 import com.fasterxml.jackson.databind.ObjectMapper
81 public class DoCreateVfModule extends VfModuleBase {
82 private static final Logger logger = LoggerFactory.getLogger( DoCreateVfModule.class);
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()
94 * Validates the request message and sets up the workflow.
95 * @param execution the execution
97 public void preProcessRequest(DelegateExecution execution) {
98 def method = getClass().getSimpleName() + '.preProcessRequest(' +
99 'execution=' + execution.getId() +
102 logger.trace('Entered ' + method)
104 execution.setVariable('prefix', Prefix)
106 def rollbackData = execution.getVariable("rollbackData")
107 if (rollbackData == null) {
108 rollbackData = new RollbackData()
111 execution.setVariable("DCVFM_vnfParamsExistFlag", false)
112 execution.setVariable("DCVFM_oamManagementV4Address", "")
113 execution.setVariable("DCVFM_oamManagementV6Address", "")
115 String request = execution.getVariable("DoCreateVfModuleRequest")
117 if (request == null || request.isEmpty()) {
118 // Building Block-type request
120 String vfModuleModelInfo = execution.getVariable("vfModuleModelInfo")
122 def serviceModelInfo = execution.getVariable("serviceModelInfo")
123 logger.debug("serviceModelInfo: " + serviceModelInfo)
124 String modelInvariantUuid = jsonUtil.getJsonValue(serviceModelInfo, "modelInvariantUuid")
125 logger.debug("modelInvariantUuid: " + modelInvariantUuid)
127 def vnfModelInfo = execution.getVariable("vnfModelInfo")
130 def tenantId = execution.getVariable("tenantId")
131 execution.setVariable("DCVFM_tenantId", tenantId)
132 rollbackData.put("VFMODULE", "tenantid", tenantId)
134 def volumeGroupId = execution.getVariable("volumeGroupId")
135 execution.setVariable("DCVFM_volumeGroupId", volumeGroupId)
137 def volumeGroupName = execution.getVariable("volumeGroupName")
138 execution.setVariable("DCVFM_volumeGroupName", volumeGroupName)
140 def cloudSiteId = execution.getVariable("lcpCloudRegionId")
141 execution.setVariable("DCVFM_cloudSiteId", cloudSiteId)
142 rollbackData.put("VFMODULE", "aiccloudregion", cloudSiteId)
143 logger.debug("cloudSiteId: " + cloudSiteId)
145 def cloudOwner = execution.getVariable("cloudOwner")
146 execution.setVariable("DCVFM_cloudOwner", cloudOwner)
147 rollbackData.put("VFMODULE", "cloudOwner", cloudOwner)
148 logger.debug("cloudOwner: " + cloudOwner)
150 def vnfType = execution.getVariable("vnfType")
151 execution.setVariable("DCVFM_vnfType", vnfType)
152 rollbackData.put("VFMODULE", "vnftype", vnfType)
153 logger.debug("vnfType: " + vnfType)
155 def vnfName = execution.getVariable("vnfName")
156 execution.setVariable("DCVFM_vnfName", vnfName)
157 rollbackData.put("VFMODULE", "vnfname", vnfName)
158 logger.debug("vnfName: " + vnfName)
160 def vnfId = execution.getVariable("vnfId")
161 execution.setVariable("DCVFM_vnfId", vnfId)
162 rollbackData.put("VFMODULE", "vnfid", vnfId)
163 logger.debug("vnfId: " + vnfId)
165 def vfModuleName = execution.getVariable("vfModuleName")
166 execution.setVariable("DCVFM_vfModuleName", vfModuleName)
167 rollbackData.put("VFMODULE", "vfmodulename", vfModuleName)
168 logger.debug("vfModuleName: " + vfModuleName)
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)
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)
190 def serviceId = execution.getVariable("serviceId")
191 execution.setVariable("DCVFM_serviceId", serviceId)
192 logger.debug("serviceId: " + serviceId)
194 def serviceInstanceId = execution.getVariable("serviceInstanceId")
195 execution.setVariable("DCVFM_serviceInstanceId", serviceInstanceId)
196 rollbackData.put("VFMODULE", "serviceInstanceId", serviceInstanceId)
197 logger.debug("serviceInstanceId: " + serviceInstanceId)
200 execution.setVariable("DCVFM_source", source)
201 rollbackData.put("VFMODULE", "source", source)
202 logger.debug("source: " + source)
204 def disableRollback = execution.getVariable("disableRollback")
205 def backoutOnFailure = true
206 if (disableRollback != null && disableRollback == true) {
207 backoutOnFailure = false
209 execution.setVariable("DCVFM_backoutOnFailure", backoutOnFailure)
210 logger.debug("backoutOnFailure: " + backoutOnFailure)
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)
220 execution.setVariable("DCVFM_personaModelId", jsonUtil.getJsonValue(vfModuleModelInfo, "modelInvariantUuid"))
221 //personaModelVersion
222 execution.setVariable("DCVFM_personaModelVersion", jsonUtil.getJsonValue(vfModuleModelInfo, "modelUuid"))
224 def vfModuleLabel = execution.getVariable("vfModuleLabel")
225 if (vfModuleLabel != null) {
226 execution.setVariable("DCVFM_vfModuleLabel", vfModuleLabel)
227 logger.debug("vfModuleLabel: " + vfModuleLabel)
229 //Get or Generate UUID
230 String uuid = execution.getVariable("DCVFM_uuid")
232 uuid = UUID.randomUUID()
233 logger.debug("Generated messageId (UUID) is: " + uuid)
235 logger.debug("Found messageId (UUID) is: " + uuid)
238 String isVidRequest = execution.getVariable("isVidRequest")
240 if (isVidRequest == null || isVidRequest.isEmpty()) {
241 execution.setVariable("isVidRequest", "true")
244 String globalSubscriberId = execution.getVariable("globalSubscriberId")
245 execution.setVariable("DCVFM_globalSubscriberId", globalSubscriberId)
246 logger.debug("globalSubsrciberId: " + globalSubscriberId)
249 String oofDirectives = null
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)
264 } catch (Exception exception) {
265 logger.debug("Could not find homing information for service instance: " + serviceInstanceId +
267 logger.debug("Could not find homing information for service instance error: " + exception)
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", "{}")
279 if (vfModuleInputParams != null) {
280 execution.setVariable("DCVFM_vnfParamsMap", vfModuleInputParams)
281 execution.setVariable("DCVFM_vnfParamsExistFlag", true)
284 def usePreload = execution.getVariable("usePreload")
285 execution.setVariable("DCVFM_usePreload", usePreload)
286 logger.debug("usePreload: " + usePreload)
288 def aLaCarte = execution.getVariable("aLaCarte")
289 execution.setVariable("DCVFM_aLaCarte", aLaCarte)
290 logger.debug("aLaCarte: " + aLaCarte)
292 //get workload and environment context from parent SI
293 String environmentContext = ""
294 String workloadContext =""
295 String serviceType =""
298 String json = catalogDbUtils.getServiceResourcesByServiceModelInvariantUuidString(execution,modelInvariantUuid )
299 serviceType = jsonUtil.getJsonValue(json, "serviceResources.serviceType")
302 } catch (Exception ex){
303 String msg = "Exception in preProcessRequest " + ex.getMessage()
305 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
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","")
316 }catch (Exception ex) {
317 logger.debug("Error retreiving parent service instance information")
320 execution.setVariable("DCVFM_environmentContext",environmentContext)
321 execution.setVariable("DCVFM_workloadContext",workloadContext)
325 // The info is inside the request - DEAD CODE
326 logger.debug("DoCreateVfModule request: " + request)
330 if (utils.nodeExists(request, "tenant-id")) {
331 tenantId = utils.getNodeText(request, "tenant-id")
333 execution.setVariable("DCVFM_tenantId", tenantId)
334 rollbackData.put("VFMODULE", "tenantid", tenantId)
336 def volumeGroupId = ""
337 if (utils.nodeExists(request, "volume-group-id")) {
338 volumeGroupId = utils.getNodeText(request, "volume-group-id")
340 execution.setVariable("DCVFM_volumeGroupId", volumeGroupId)
342 def volumeGroupName = ""
343 if (utils.nodeExists(request, "volume-group-name")) {
344 volumeGroupName = utils.getNodeText(request, "volume-group-name")
346 execution.setVariable("DCVFM_volumeGroupName", volumeGroupName)
349 if (utils.nodeExists(request, "aic-cloud-region")) {
350 cloudSiteId = utils.getNodeText(request, "aic-cloud-region")
352 execution.setVariable("DCVFM_cloudSiteId", cloudSiteId)
353 rollbackData.put("VFMODULE", "aiccloudregion", cloudSiteId)
354 logger.debug("cloudSiteId: " + cloudSiteId)
357 if (utils.nodeExists(request, "vnf-type")) {
358 vnfType = utils.getNodeText(request, "vnf-type")
360 execution.setVariable("DCVFM_vnfType", vnfType)
361 rollbackData.put("VFMODULE", "vnftype", vnfType)
362 logger.debug("vnfType: " + vnfType)
365 if (utils.nodeExists(request, "vnf-name")) {
366 vnfName = utils.getNodeText(request, "vnf-name")
368 execution.setVariable("DCVFM_vnfName", vnfName)
369 rollbackData.put("VFMODULE", "vnfname", vnfName)
370 logger.debug("vnfName: " + vnfName)
373 if (utils.nodeExists(request, "vnf-id")) {
374 vnfId = utils.getNodeText(request, "vnf-id")
376 execution.setVariable("DCVFM_vnfId", vnfId)
377 rollbackData.put("VFMODULE", "vnfid", vnfId)
378 logger.debug("vnfId: " + vnfId)
380 def vfModuleName = ""
381 if (utils.nodeExists(request, "vf-module-name")) {
382 vfModuleName = utils.getNodeText(request, "vf-module-name")
384 execution.setVariable("DCVFM_vfModuleName", vfModuleName)
385 rollbackData.put("VFMODULE", "vfmodulename", vfModuleName)
386 logger.debug("vfModuleName: " + vfModuleName)
388 def vfModuleModelName = ""
389 if (utils.nodeExists(request, "vf-module-model-name")) {
390 vfModuleModelName = utils.getNodeText(request, "vf-module-model-name")
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")
400 execution.setVariable("DCVFM_modelCustomizationUuid", modelCustomizationUuid)
401 rollbackData.put("VFMODULE", "modelcustomizationuuid", modelCustomizationUuid)
402 logger.debug("modelCustomizationUuid: " + modelCustomizationUuid)
405 if (utils.nodeExists(request, "vf-module-id")) {
406 vfModuleId = utils.getNodeText(request, "vf-module-id")
408 execution.setVariable("DCVFM_vfModuleId", vfModuleId)
409 logger.debug("vfModuleId: " + vfModuleId)
411 if (utils.nodeExists(request, "request-id")) {
412 requestId = utils.getNodeText(request, "request-id")
414 execution.setVariable("DCVFM_requestId", requestId)
415 logger.debug("requestId: " + requestId)
418 if (utils.nodeExists(request, "service-id")) {
419 serviceId = utils.getNodeText(request, "service-id")
421 execution.setVariable("DCVFM_serviceId", serviceId)
422 logger.debug("serviceId: " + serviceId)
424 def serviceInstanceId = ""
425 if (utils.nodeExists(request, "service-instance-id")) {
426 serviceInstanceId = utils.getNodeText(request, "service-instance-id")
428 execution.setVariable("DCVFM_serviceInstanceId", serviceInstanceId)
429 rollbackData.put("VFMODULE", "serviceInstanceId", serviceInstanceId)
430 logger.debug("serviceInstanceId: " + serviceInstanceId)
433 if (utils.nodeExists(request, "source")) {
434 source = utils.getNodeText(request, "source")
436 execution.setVariable("DCVFM_source", source)
437 rollbackData.put("VFMODULE", "source", source)
438 logger.debug("source: " + source)
440 NetworkUtils networkUtils = new NetworkUtils()
441 def backoutOnFailure = networkUtils.isRollbackEnabled(execution,request)
442 execution.setVariable("DCVFM_backoutOnFailure", backoutOnFailure)
443 logger.debug("backoutOnFailure: " + backoutOnFailure)
445 def isBaseVfModule = "false"
446 if (utils.nodeExists(request, "is-base-vf-module")) {
447 isBaseVfModule = utils.getNodeText(request, "is-base-vf-module")
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")
456 execution.setVariable("DCVFM_asdcServiceModelVersion", asdcServiceModelVersion)
457 logger.debug("asdcServiceModelVersion: " + asdcServiceModelVersion)
460 def personaModelId = ""
461 if (utils.nodeExists(request, "persona-model-id")) {
462 personaModelId = utils.getNodeText(request, "persona-model-id")
464 execution.setVariable("DCVFM_personaModelId", personaModelId)
465 logger.debug("personaModelId: " + personaModelId)
467 //personaModelVersion
468 def personaModelVersion = ""
469 if (utils.nodeExists(request, "persona-model-version")) {
470 personaModelVersion = utils.getNodeText(request, "persona-model-version")
472 execution.setVariable("DCVFM_personaModelVersion", personaModelVersion)
473 logger.debug("personaModelVersion: " + personaModelVersion)
475 // Process the parameters
477 String vnfParamsChildNodes = utils.getChildNodes(request, "vnf-params")
478 if(vnfParamsChildNodes == null || vnfParamsChildNodes.length() < 1){
479 logger.debug("Request contains NO VNF Params")
481 logger.debug("Request does contain VNF Params")
482 execution.setVariable("DCVFM_vnfParamsExistFlag", true)
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")
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)
500 execution.setVariable("DCVFM_vnfParamsMap", paramsMap)
504 String oofDirectives = null
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)
519 } catch (Exception exception) {
520 logger.debug("Could not find homing information for service instance: " + serviceInstanceId +
522 logger.debug("Could not find homing information for service instance error: " + exception)
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)
533 //Get or Generate UUID
534 String uuid = execution.getVariable("DCVFM_uuid")
536 uuid = UUID.randomUUID()
537 logger.debug("Generated messageId (UUID) is: " + uuid)
539 logger.debug("Found messageId (UUID) is: " + uuid)
541 // Get sdncVersion, default to empty
542 String sdncVersion = execution.getVariable("sdncVersion")
543 if (sdncVersion == null) {
546 logger.debug("sdncVersion: " + sdncVersion)
547 execution.setVariable("DCVFM_sdncVersion", sdncVersion)
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", "")
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);
574 exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
576 execution.setVariable("DCVFM_sdncCallbackUrl", sdncCallbackUrl)
577 logger.debug("SDNC Callback URL is: " + sdncCallbackUrl)
580 execution.setVariable("rollbackData", rollbackData)
586 exceptionUtil.buildAndThrowWorkflowException(execution, 2000, "Internal Error encountered in PreProcess method!")
589 logger.trace('Exited ' + method)
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
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)
607 * Sends the empty, synchronous response back to the API Handler.
608 * @param execution the execution
610 public void sendResponse(DelegateExecution execution) {
611 def method = getClass().getSimpleName() + '.sendResponse(' +
612 'execution=' + execution.getId() +
615 logger.trace('Entered ' + method)
618 sendWorkflowResponse(execution, 200, "")
619 logger.trace('Exited ' + method)
620 } catch (BpmnError 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);
627 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Internal Error')
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
636 * @param execution The flow's execution instance.
638 public void postProcessCreateAAIVfModule(DelegateExecution execution) {
639 def method = getClass().getSimpleName() + '.getVfModule(' +
640 'execution=' + execution.getId() +
643 logger.trace('Entered ' + method)
646 def createResponse = execution.getVariable('DCVFM_createVfModuleResponse')
647 logger.debug("createVfModule Response: " + createResponse)
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)
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) {
672 logger.debug('Exception occurred while postProcessing CreateAAIVfModule request:' + ex.getMessage())
673 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Bad response from CreateAAIVfModule' + ex.getMessage())
675 logger.trace('Exited ' + method)
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.
683 * @param execution The flow's execution instance.
685 public void queryAAIVfModule(DelegateExecution execution) {
687 def method = getClass().getSimpleName() + '.getVfModule(' +
688 'execution=' + execution.getId() +
690 logger.trace('Entered ' + method)
693 def vnfId = execution.getVariable('DCVFM_vnfId')
694 def vfModuleId = execution.getVariable('DCVFM_vfModuleId')
696 AaiUtil aaiUriUtil = new AaiUtil(this)
697 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId).depth(Depth.ONE)
698 String endPoint = aaiUriUtil.createAaiUri(uri)
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)
707 logger.debug('sending GET to AAI endpoint \'' + endPoint + '\'')
708 Response response = client.get()
710 String responseData = response.readEntity(String.class)
711 if (responseData != null) {
712 logger.debug("Received generic VNF data: " + responseData)
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")
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)
743 } catch (Exception ex) {
745 logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
746 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
748 logger.trace('Exited ' + method)
749 } catch (BpmnError 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())
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
766 * @param execution The flow's execution instance.
768 public void queryAAIVfModuleForStatus(DelegateExecution execution) {
770 def method = getClass().getSimpleName() + '.queryAAIVfModuleForStatus(' +
771 'execution=' + execution.getId() +
773 logger.trace('Entered ' + method)
775 execution.setVariable('DCVFM_orchestrationStatus', '')
778 def vnfId = execution.getVariable('DCVFM_vnfId')
779 def vfModuleName = execution.getVariable('DCVFM_vfModuleName')
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)
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)
792 def responseData = ''
794 logger.debug('sending GET to AAI endpoint \'' + endPoint + '\'')
795 Response response = client.get()
796 logger.debug("createVfModule - invoking httpGet() to AAI")
798 responseData = response.readEntity(String.class)
799 if (responseData != null) {
800 logger.debug("Received generic VNF data: " + responseData)
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)
824 } catch (Exception ex) {
826 logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
827 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
829 logger.trace('Exited ' + method)
830 } catch (BpmnError 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())
841 public void preProcessSDNCAssignRequest(DelegateExecution execution){
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)
855 if (serviceInstanceId == null || serviceInstanceId.isEmpty()) {
856 svcInstId = vfModuleId
859 svcInstId = serviceInstanceId
862 String assignSDNCRequest = buildSDNCRequest(execution, svcInstId, "assign")
864 assignSDNCRequest = utils.formatXml(assignSDNCRequest)
865 execution.setVariable("DCVFM_assignSDNCRequest", assignSDNCRequest)
866 logger.debug("Outgoing AssignSDNCRequest is: \n" + assignSDNCRequest)
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())
874 logger.trace("COMPLETED preProcessSDNCAssignRequest")
877 public void preProcessSDNCGetRequest(DelegateExecution execution, String element){
879 String sdncVersion = execution.getVariable("DCVFM_sdncVersion")
880 execution.setVariable("prefix", Prefix)
881 logger.trace("STARTED preProcessSDNCGetRequest Process")
883 def serviceInstanceId = execution.getVariable('DCVFM_serviceInstanceId')
885 String uuid = execution.getVariable('testReqId') // for junits
887 uuid = execution.getVariable("mso-request-id") + "-" + System.currentTimeMillis()
890 def callbackUrl = execution.getVariable("DCVFM_sdncCallbackUrl")
891 logger.debug("callbackUrl:" + callbackUrl)
893 def vfModuleId = execution.getVariable('DCVFM_vfModuleId')
896 if (serviceInstanceId == null || serviceInstanceId.isEmpty()) {
897 svcInstId = vfModuleId
900 svcInstId = serviceInstanceId
904 if (!sdncVersion.equals("1707")) {
905 msoAction = "mobility"
908 msoAction = "vfmodule"
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
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)
921 Optional<GenericVnf> vnf = wrapper.asBean(GenericVnf.class)
922 serviceOperation = vnf.get().getSelflink()
923 logger.debug("VNF - service operation: " + serviceOperation)
925 else if (element.equals("vfmodule")) {
926 String response = execution.getVariable("DCVFM_assignSDNCAdapterResponse")
927 logger.debug("DCVFM_assignSDNCAdapterResponse is: \n" + response)
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)
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)
941 //!!!! TEMPORARY WORKAROUND FOR SDNC REPLICATION ISSUE
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>"""
959 execution.setVariable("DCVFM_getSDNCRequest", SDNCGetRequest)
960 logger.debug("Outgoing GetSDNCRequest is: \n" + SDNCGetRequest)
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())
968 logger.trace("COMPLETED preProcessSDNCGetRequest Process")
972 public void preProcessVNFAdapterRequest(DelegateExecution execution) {
973 def method = getClass().getSimpleName() + '.VNFAdapterCreateVfModule(' +
974 'execution=' + execution.getId() +
977 logger.trace('Entered ' + method)
979 //def xml = execution.getVariable("DoCreateVfModuleRequest")
980 //logger.debug('VNF REQUEST is: ' + xml)
984 def cloudSiteId = execution.getVariable("DCVFM_cloudSiteId")
986 def tenantId = execution.getVariable("DCVFM_tenantId")
988 def vnfType = execution.getVariable("DCVFM_vnfType")
990 def vnfName = execution.getVariable("DCVFM_vnfName")
992 def vnfId = execution.getVariable("DCVFM_vnfId")
994 def vfModuleName = execution.getVariable("DCVFM_vfModuleName")
996 def vfModuleModelName = execution.getVariable("DCVFM_vfModuleModelName")
998 def vfModuleId = execution.getVariable("DCVFM_vfModuleId")
1000 def vfModuleIndex = execution.getVariable("DCVFM_vfModuleIndex")
1002 def requestId = execution.getVariable("DCVFM_requestId")
1004 def serviceId = execution.getVariable("DCVFM_serviceId")
1006 def serviceInstanceId = execution.getVariable("DCVFM_serviceInstanceId")
1008 def backoutOnFailure = execution.getVariable("DCVFM_backoutOnFailure")
1010 def volumeGroupId = execution.getVariable("DCVFM_volumeGroupId")
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")
1024 String workloadContext = execution.getVariable("DCVFM_workloadContext")
1025 logger.debug("workloadContext: " + workloadContext)
1026 logger.debug("environmentContext: " + environmentContext)
1028 def messageId = execution.getVariable('mso-request-id') + '-' +
1029 System.currentTimeMillis()
1031 def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId)
1032 def useQualifiedHostName = UrnPropertiesReader.getVariable("mso.use.qualified.host",execution)
1034 logger.debug("notificationUrl: " + notificationUrl)
1035 logger.debug("QualifiedHostName: " + useQualifiedHostName)
1037 if ('true'.equals(useQualifiedHostName)) {
1038 notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)
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")
1048 if (!sdncVersion.equals("1707")) {
1050 vfModuleParams = buildVfModuleParams(vnfParamsMap, vfModuleSdncGetResponse, vnfId, vnfName,
1051 vfModuleId, vfModuleName, vfModuleIndex, environmentContext, workloadContext)
1054 //Get SDNC Response Data for Vnf Topology
1055 String vnfSdncGetResponse = execution.getVariable('DCVFM_getVnfSDNCAdapterResponse')
1056 logger.debug("vnfSdncGetResponse: " + vnfSdncGetResponse)
1058 vfModuleParams = buildVfModuleParamsFromCombinedTopologies(vnfParamsMap, vnfSdncGetResponse, vfModuleSdncGetResponse, vnfId, vnfName,
1059 vfModuleId, vfModuleName, vfModuleIndex, environmentContext, workloadContext)
1063 if (serviceInstanceId == null || serviceInstanceId.isEmpty()) {
1064 svcInstId = serviceId
1067 svcInstId = serviceInstanceId
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>
1094 <requestId>${MsoUtils.xmlEscape(requestId)}</requestId>
1095 <serviceInstanceId>${MsoUtils.xmlEscape(svcInstId)}</serviceInstanceId>
1097 <messageId>${MsoUtils.xmlEscape(messageId)}</messageId>
1098 <notificationUrl>${MsoUtils.xmlEscape(notificationUrl)}</notificationUrl>
1099 </createVfModuleRequest>"""
1101 logger.debug("Create VfModule Request to VNF Adapter: " + createVnfARequest)
1102 execution.setVariable("DCVFM_createVnfARequest", createVnfARequest)
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
1112 public String validateInfraRequest(DelegateExecution execution) {
1113 def method = getClass().getSimpleName() + '.validateInfraRequest(' +
1114 'execution=' + execution.getId() +
1117 logger.trace('Entered ' + method)
1119 String processKey = getProcessKey(execution);
1120 def prefix = execution.getVariable("prefix")
1122 if (prefix == null) {
1123 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, processKey + " prefix is null")
1127 def request = execution.getVariable(prefix + 'Request')
1129 if (request == null) {
1130 request = execution.getVariable(processKey + 'Request')
1132 if (request == null) {
1133 request = execution.getVariable('bpmnRequest')
1136 setVariable(execution, processKey + 'Request', null);
1137 setVariable(execution, 'bpmnRequest', null);
1138 setVariable(execution, prefix + 'Request', request);
1141 if (request == null) {
1142 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, processKey + " request is null")
1144 logger.debug("DoCreateVfModule Request: " + request)
1148 def requestId = execution.getVariable("mso-request-id")
1150 if (requestId == null) {
1151 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, processKey + " request has no mso-request-id")
1154 def serviceInstanceId = execution.getVariable("mso-service-instance-id")
1156 if (serviceInstanceId == null) {
1157 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, processKey + " request message has no mso-service-instance-id")
1160 utils.logContext(requestId, serviceInstanceId)
1162 logger.debug('Incoming message: ' + System.lineSeparator() + request)
1163 logger.trace('Exited ' + method)
1165 } catch (BpmnError 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")
1175 public boolean isVolumeGroupIdPresent(DelegateExecution execution) {
1177 def method = getClass().getSimpleName() + '.isVolumeGroupIdPresent(' +
1178 'execution=' + execution.getId() +
1181 logger.trace('Entered ' + method)
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')
1190 logger.debug('Volume group id is present')
1196 public boolean isVolumeGroupNamePresent(DelegateExecution execution) {
1198 def method = getClass().getSimpleName() + '.isVolumeGroupNamePresent(' +
1199 'execution=' + execution.getId() +
1202 logger.trace('Entered ' + method)
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')
1211 logger.debug('Volume group name is present')
1217 public String buildSDNCRequest(DelegateExecution execution, String svcInstId, String action){
1219 String uuid = execution.getVariable('testReqId') // for junits
1221 uuid = execution.getVariable("mso-request-id") + "-" + System.currentTimeMillis()
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 = ""
1249 modelCustomizationUuidString = "<model-customization-uuid>" + modelCustomizationUuid + "</model-customization-uuid>"
1252 String sdncVNFParamsXml = ""
1254 if(execution.getVariable("DCVFM_vnfParamsExistFlag") == true){
1255 if (!sdncVersion.equals("1707")) {
1256 sdncVNFParamsXml = buildSDNCParamsXml(execution)
1259 sdncVNFParamsXml = buildCompleteSDNCParamsXml(execution)
1262 sdncVNFParamsXml = ""
1265 String sdncRequest = ""
1267 if (!sdncVersion.equals("1707")) {
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>
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>
1305 </vnf-request-information>
1306 </sdncadapterworkflow:SDNCRequestData>
1307 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
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>
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>
1339 <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
1340 <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
1341 ${vnfEcompModelInformation}
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>
1353 </vf-module-request-input>
1354 </sdncadapterworkflow:SDNCRequestData>
1355 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
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>
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>
1385 <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
1386 <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
1387 ${vnfEcompModelInformation}
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>
1399 </vf-module-request-input>
1400 </sdncadapterworkflow:SDNCRequestData>
1401 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
1406 logger.debug("sdncRequest: " + sdncRequest)
1411 public void preProcessSDNCActivateRequest(DelegateExecution execution) {
1412 def method = getClass().getSimpleName() + '.preProcessSDNCActivateRequest(' +
1413 'execution=' + execution.getId() +
1416 logger.trace('Entered ' + method)
1417 execution.setVariable("prefix", Prefix)
1418 logger.trace("STARTED preProcessSDNCActivateRequest Process")
1420 String vnfId = execution.getVariable("DCVFM_vnfId")
1421 String vfModuleId = execution.getVariable("DCVFM_vfModuleId")
1422 String serviceInstanceId = execution.getVariable("DCVFM_serviceInstanceId")
1425 if (serviceInstanceId == null || serviceInstanceId.isEmpty()) {
1426 svcInstId = vfModuleId
1429 svcInstId = serviceInstanceId
1431 String activateSDNCRequest = buildSDNCRequest(execution, svcInstId, "activate")
1433 execution.setVariable("DCVFM_activateSDNCRequest", activateSDNCRequest)
1434 logger.debug("Outgoing CommitSDNCRequest is: \n" + activateSDNCRequest)
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())
1440 logger.trace("COMPLETED preProcessSDNCActivateRequest Process")
1443 public void postProcessVNFAdapterRequest(DelegateExecution execution) {
1444 def method = getClass().getSimpleName() + '.postProcessVNFAdapterRequest(' +
1445 'execution=' + execution.getId() +
1448 logger.trace('Entered ' + method)
1449 execution.setVariable("prefix",Prefix)
1451 logger.debug("STARTED postProcessVNFAdapterRequest Process")
1453 String vnfResponse = execution.getVariable("DCVFM_createVnfAResponse")
1454 logger.debug("VNF Adapter Response is: " + vnfResponse)
1456 RollbackData rollbackData = execution.getVariable("rollbackData")
1457 if(vnfResponse != null){
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)
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)
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)
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)
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)
1505 if (!contrailNetworkPolicyFqdnList.isEmpty()) {
1506 execution.setVariable("DCVFM_contrailNetworkPolicyFqdnList", contrailNetworkPolicyFqdnList)
1510 logger.debug("Received a BAD Response from VNF Adapter for CREATE_VF_MODULE Call.")
1511 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "VNF Adapter Error")
1514 logger.debug("Response from VNF Adapter is Null for CREATE_VF_MODULE Call.")
1515 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Empty response from VNF Adapter")
1518 rollbackData.put("VFMODULE", "rollbackVnfAdapterCreate", "true")
1519 execution.setVariable("rollbackData", rollbackData)
1521 }catch(BpmnError 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")
1527 logger.trace("COMPLETED postProcessVnfAdapterResponse Process")
1531 public void preProcessUpdateAAIVfModuleRequestOrch(DelegateExecution execution) {
1532 def method = getClass().getSimpleName() + '.preProcessUpdateAAIVfModuleRequestOrch(' +
1533 'execution=' + execution.getId() +
1536 logger.trace('Entered ' + method)
1537 execution.setVariable("prefix", Prefix)
1538 logger.trace("STARTED preProcessUpdateAAIVfModuleRequestOrch")
1542 //Build UpdateAAIVfModule Request
1543 boolean setContrailServiceInstanceFqdn = false
1544 def contrailServiceInstanceFqdn = execution.getVariable("DCVFM_contrailServiceInstanceFqdn")
1545 if (!contrailServiceInstanceFqdn.equals("")) {
1546 setContrailServiceInstanceFqdn = true
1549 execution.setVariable("DCVFM_orchestrationStatus", "Created")
1551 String updateAAIVfModuleRequest = buildUpdateAAIVfModuleRequest(execution, false, true, true, setContrailServiceInstanceFqdn)
1553 updateAAIVfModuleRequest = utils.formatXml(updateAAIVfModuleRequest)
1554 execution.setVariable("DCVFM_updateAAIVfModuleRequest", updateAAIVfModuleRequest)
1555 logger.debug("Outgoing UpdateAAIVfModuleRequest is: \n" + updateAAIVfModuleRequest)
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())
1563 logger.trace("COMPLETED preProcessUpdateAAIVfModuleRequestOrch")
1567 public void preProcessUpdateAAIVfModuleRequestStatus(DelegateExecution execution, String status) {
1568 def method = getClass().getSimpleName() + '.preProcessUpdateAAIVfModuleStatus(' +
1569 'execution=' + execution.getId() +
1572 logger.trace('Entered ' + method)
1573 execution.setVariable("prefix", Prefix)
1574 logger.trace("STARTED preProcessUpdateAAIVfModuleStatus")
1578 //Build UpdateAAIVfModule Request
1579 execution.setVariable("DCVFM_orchestrationStatus", status)
1581 String updateAAIVfModuleRequest = buildUpdateAAIVfModuleRequest(execution, false, true, false, false)
1583 updateAAIVfModuleRequest = utils.formatXml(updateAAIVfModuleRequest)
1584 execution.setVariable("DCVFM_updateAAIVfModuleRequest", updateAAIVfModuleRequest)
1585 logger.debug("Outgoing UpdateAAIVfModuleRequest is: \n" + updateAAIVfModuleRequest)
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())
1593 logger.trace("COMPLETED preProcessUpdateAAIVfModuleStatus")
1598 public void preProcessUpdateAAIVfModuleRequestGroup(DelegateExecution execution) {
1599 def method = getClass().getSimpleName() + '.preProcessUpdateAAIVfModuleRequestGroup(' +
1600 'execution=' + execution.getId() +
1603 logger.trace('Entered ' + method)
1604 execution.setVariable("prefix", Prefix)
1605 logger.trace("STARTED preProcessUpdateAAIVfModuleRequestGroup")
1609 //Build UpdateAAIVfModule Request
1611 String updateAAIVfModuleRequest = buildUpdateAAIVfModuleRequest(execution, true, false, false, false)
1613 updateAAIVfModuleRequest = utils.formatXml(updateAAIVfModuleRequest)
1614 execution.setVariable("DCVFM_updateAAIVfModuleRequest", updateAAIVfModuleRequest)
1615 logger.debug("Outgoing UpdateAAIVfModuleRequest is: \n" + updateAAIVfModuleRequest)
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())
1623 logger.trace("COMPLETED preProcessUpdateAAIVfModuleRequestGroup")
1627 public void validateSDNCResponse(DelegateExecution execution, String response, String method){
1629 execution.setVariable("prefix",Prefix)
1630 logger.debug("STARTED ValidateSDNCResponse Process")
1632 WorkflowException workflowException = execution.getVariable("WorkflowException")
1633 boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
1635 logger.debug("workflowException: " + workflowException)
1637 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
1638 sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
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")
1645 if(method.equals("assign")){
1646 rollbackData.put("VFMODULE", "rollbackSDNCRequestAssign", "true")
1647 execution.setVariable("CRTGVNF_sdncAssignCompleted", true)
1649 else if (method.equals("activate")) {
1650 rollbackData.put("VFMODULE", "rollbackSDNCRequestActivate", "true")
1652 execution.setVariable("rollbackData", rollbackData)
1654 logger.debug("Received a BAD Response from SDNC Adapter for " + method + " SDNC Call.")
1655 throw new BpmnError("MSOWorkflowException")
1657 logger.trace("COMPLETED ValidateSDNCResponse Process")
1660 public void preProcessUpdateAfterCreateRequest(DelegateExecution execution){
1662 execution.setVariable("prefix", Prefix)
1663 logger.trace("STARTED preProcessRequest Process")
1665 String response = execution.getVariable("DCVFM_assignSDNCAdapterResponse")
1666 logger.debug("DCVFM_assignSDNCAdapterResponse: " + response)
1668 String data = utils.getNodeXml(response, "response-data")
1669 String vnfId = utils.getNodeText(data, "vnf-id")
1671 String uuid = execution.getVariable('testReqId') // for junits
1673 uuid = execution.getVariable("mso-request-id") + "-" + System.currentTimeMillis()
1676 String serviceOperation = "/VNF-API:vnfs/vnf-list/" + vnfId
1677 def callbackUrl = execution.getVariable("DCVFM_sdncCallbackUrl")
1678 logger.debug("callbackUrl: " + callbackUrl)
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>"""
1694 execution.setVariable("DCVFM_getSDNCRequest", SDNCGetRequest)
1695 logger.debug("Outgoing GetSDNCRequest is: \n" + SDNCGetRequest)
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())
1703 logger.trace("COMPLETED preProcessSDNCGetRequest Process")
1706 public String buildUpdateAAIVfModuleRequest(DelegateExecution execution, boolean updateVolumeGroupId,
1707 boolean updateOrchestrationStatus, boolean updateHeatStackId, boolean updateContrailFqdn){
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>"
1716 def orchestrationStatusString = ""
1717 if (updateOrchestrationStatus) {
1718 orchestrationStatusString = "<orchestration-status>" + execution.getVariable("DCVFM_orchestrationStatus") + "</orchestration-status>"
1720 def heatStackIdString = ""
1721 if (updateHeatStackId) {
1722 heatStackIdString = "<heat-stack-id>" + execution.getVariable("DCVFM_heatStackId") + "</heat-stack-id>"
1724 def contrailFqdnString = ""
1725 if (updateContrailFqdn) {
1726 contrailFqdnString = "<contrail-service-instance-fqdn>" + execution.getVariable("DCVFM_contrailServiceInstanceFqdn") +
1727 "</contrail-service-instance-fqdn>"
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>"""
1740 logger.trace("updateAAIVfModule Request: " + updateAAIVfModuleRequest)
1741 return updateAAIVfModuleRequest
1745 public String buildSDNCParamsXml(DelegateExecution execution){
1748 StringBuilder sb = new StringBuilder()
1749 Map<String, String> paramsMap = execution.getVariable("DCVFM_vnfParamsMap")
1751 for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
1753 String key = entry.getKey();
1754 if(key.endsWith("_network")){
1755 String requestKey = key.substring(0, key.indexOf("_network"))
1756 String requestValue = entry.getValue()
1759 <network-role>{ functx:substring-before-match(data($param/@name), '_network') }</network-role>
1760 <network-name>{ $param/text() }</network-name>
1765 params = sb.append(paramsXml)
1770 public String buildCompleteSDNCParamsXml(DelegateExecution execution){
1773 StringBuilder sb = new StringBuilder()
1774 Map<String, String> paramsMap = execution.getVariable("DCVFM_vnfParamsMap")
1776 for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
1778 String key = entry.getKey();
1779 String value = entry.getValue()
1780 paramsXml = """<${key}>$value</$key>"""
1781 params = sb.append(paramsXml)
1786 public void queryCloudRegion (DelegateExecution execution) {
1788 execution.setVariable("prefix", Prefix)
1789 logger.trace("STARTED queryCloudRegion")
1792 String cloudRegion = execution.getVariable("DCVFM_cloudSiteId")
1795 AaiUtil aaiUtil = new AaiUtil(this)
1797 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, Defaults.CLOUD_OWNER.toString(), cloudRegion)
1798 def queryCloudRegionRequest = aaiUtil.createAaiUri(uri)
1800 execution.setVariable("DCVFM_queryCloudRegionRequest", queryCloudRegionRequest)
1802 cloudRegion = aaiUtil.getAAICloudReqion(execution, queryCloudRegionRequest, "PO", cloudRegion)
1804 if ((cloudRegion != "ERROR")) {
1805 if(execution.getVariable("DCVFM_queryCloudRegionReturnCode") == "404"){
1806 execution.setVariable("DCVFM_cloudRegionForVolume", "AAIAIC25")
1808 execution.setVariable("DCVFM_cloudRegionForVolume", cloudRegion)
1810 execution.setVariable("DCVFM_isCloudRegionGood", true)
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)
1817 logger.debug(" is Cloud Region Good: " + execution.getVariable("DCVFM_isCloudRegionGood"))
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());
1824 }catch (Exception ex) {
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")
1836 *This method occurs when an MSOWorkflowException is caught. It logs the
1837 *variables and ensures that the "WorkflowException" Variable is set.
1840 public void processBPMNException(DelegateExecution execution){
1842 execution.setVariable("prefix",Prefix)
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")
1851 }catch(Exception e){
1852 logger.debug("Caught Exception during processBPMNException Method: " + e)
1854 logger.debug("Completed processBPMNException Method")
1857 public void prepareCreateAAIVfModuleVolumeGroupRequest(DelegateExecution execution) {
1858 def method = getClass().getSimpleName() + '.prepareCreateAAIVfModuleVolumeGroupRequest(' +
1859 'execution=' + execution.getId() +
1862 logger.trace('Entered ' + method)
1863 execution.setVariable("prefix", Prefix)
1864 logger.trace("STARTED prepareCreateAAIVfModuleVolumeGroupRequest")
1868 //Build CreateAAIVfModuleVolumeGroup Request
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>"""
1885 createAAIVfModuleVolumeGroupRequest = utils.formatXml(createAAIVfModuleVolumeGroupRequest)
1886 execution.setVariable("DCVFM_createAAIVfModuleVolumeGroupRequest", createAAIVfModuleVolumeGroupRequest)
1887 logger.debug("Outgoing CreateAAIVfModuleVolumeGroupRequest is: \n" + createAAIVfModuleVolumeGroupRequest)
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())
1895 logger.trace("COMPLETED prepareCreateAAIVfModuleVolumeGroupRequest")
1899 public void createNetworkPoliciesInAAI(DelegateExecution execution) {
1900 def method = getClass().getSimpleName() + '.createNetworkPoliciesInAAI(' +
1901 'execution=' + execution.getId() +
1904 logger.trace('Entered ' + method)
1905 execution.setVariable("prefix", Prefix)
1906 logger.trace("STARTED createNetworkPoliciesInAAI")
1910 List fqdnList = execution.getVariable("DCVFM_contrailNetworkPolicyFqdnList")
1911 int fqdnCount = fqdnList.size()
1912 def rollbackData = execution.getVariable("rollbackData")
1914 execution.setVariable("DCVFM_networkPolicyFqdnCount", fqdnCount)
1915 logger.debug("DCVFM_networkPolicyFqdnCount - " + fqdnCount)
1917 AaiUtil aaiUriUtil = new AaiUtil(this)
1919 if (fqdnCount > 0) {
1921 // AII loop call over contrail network policy fqdn list
1922 for (i in 0..fqdnCount-1) {
1925 String fqdn = fqdnList[i]
1927 // Query AAI for this network policy FQDN
1928 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.NETWORK_POLICY)
1929 uri.queryParam("network-policy-fqdn", fqdn)
1931 AAIResourcesClient resourceClient = new AAIResourcesClient()
1934 if (resourceClient.exists(uri)) {
1936 logger.debug(" QueryAAINetworkPolicyByFQDN Success REST Response, , NetworkPolicy #" + counting)
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)
1945 NetworkPolicy policy = new NetworkPolicy()
1946 policy.setNetworkPolicyId(networkPolicyId)
1947 policy.setNetworkPolicyFqdn(fqdn)
1948 policy.setHeatStackId(execution.getVariable("DCVFM_heatStackId"))
1950 AAIResourceUri netUri = AAIUriFactory.createResourceUri(AAIObjectType.NETWORK_POLICY, networkPolicyId)
1951 resourceClient.create(netUri, policy)
1953 rollbackData.put("VFMODULE", "rollbackCreateNetworkPoliciesAAI", "true")
1954 rollbackData.put("VFMODULE", "contrailNetworkPolicyFqdn" + i, fqdn)
1955 execution.setVariable("rollbackData", rollbackData)
1962 logger.debug("No contrail network policies to query/create")
1966 } catch (BpmnError 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)
1977 * Prepare a Request for invoking the UpdateAAIGenericVnf subflow.
1979 * @param execution The flow's execution instance.
1981 public void prepUpdateAAIGenericVnf(DelegateExecution execution) {
1982 def method = getClass().getSimpleName() + '.prepUpdateAAIGenericVnf(' +
1983 'execution=' + execution.getId() +
1986 logger.trace('Entered ' + method)
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 = ''
1996 if (oamManagementV4Address != null && !oamManagementV4Address.isEmpty()) {
1997 ipv4OamAddressElement = '<ipv4-oam-address>' + oamManagementV4Address + '</ipv4-oam-address>'
2000 if (oamManagementV6Address != null && !oamManagementV6Address.isEmpty()) {
2001 managementV6AddressElement = '<management-v6-address>' + oamManagementV6Address + '</management-v6-address>'
2004 rollbackData.put("VFMODULE", "oamManagementV4Address", oamManagementV4Address)
2007 String updateAAIGenericVnfRequest = """
2008 <UpdateAAIGenericVnfRequest>
2009 <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
2010 ${ipv4OamAddressElement}
2011 ${managementV6AddressElement}
2012 </UpdateAAIGenericVnfRequest>
2014 updateAAIGenericVnfRequest = utils.formatXml(updateAAIGenericVnfRequest)
2015 execution.setVariable('DCVM_updateAAIGenericVnfRequest', updateAAIGenericVnfRequest)
2016 logger.debug('Request for UpdateAAIGenericVnf:\n' + updateAAIGenericVnfRequest)
2019 logger.trace('Exited ' + method)
2020 } catch (BpmnError 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);
2027 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in prepUpdateAAIGenericVnf(): ' + e.getMessage())
2032 * Post process a result from invoking the UpdateAAIGenericVnf subflow.
2034 * @param execution The flow's execution instance.
2036 public void postProcessUpdateAAIGenericVnf(DelegateExecution execution) {
2037 def method = getClass().getSimpleName() + '.postProcessUpdateAAIGenericVnf(' +
2038 'execution=' + execution.getId() +
2041 logger.trace('Entered ' + method)
2044 def rollbackData = execution.getVariable("rollbackData")
2046 rollbackData.put("VFMODULE", "rollbackUpdateVnfAAI", "true")
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 = ''
2054 if (oamManagementV4Address != null && !oamManagementV4Address.isEmpty()) {
2055 rollbackData.put("VFMODULE", "oamManagementV4Address", oamManagementV4Address)
2058 if (oamManagementV6Address != null && !oamManagementV6Address.isEmpty()) {
2059 rollbackData.put("VFMODULE", "oamManagementV6Address", oamManagementV6Address)
2062 execution.setVariable("rollbackData", rollbackData)
2064 logger.trace('Exited ' + method)
2065 } catch (BpmnError 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())
2075 public void queryCatalogDB (DelegateExecution execution) {
2078 logger.trace("queryCatalogDB ")
2081 boolean twoPhaseDesign = false
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")
2089 logger.debug("vnfModelCustomizationUuid: " + vnfModelCustomizationUuid)
2091 JSONArray vnfs = catalogDbUtils.getAllVnfsByVnfModelCustomizationUuid(execution, vnfModelCustomizationUuid, "v2")
2093 logger.debug("Incoming Query Catalog DB for Vnf Response is: " + vnfModelCustomizationUuid)
2094 // Only one match here
2096 JSONObject vnfObject = vnfs.get(0)
2097 if (vnfObject != null) {
2098 String vnfJson = vnfObject.toString()
2100 ObjectMapper om = new ObjectMapper();
2101 VnfResource vnf = om.readValue(vnfJson, VnfResource.class);
2103 // Get multiStageDesign flag
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
2115 logger.debug("setting twoPhaseDesign flag to: " + twoPhaseDesign)
2117 execution.setVariable("DCVFM_twoPhaseDesign", twoPhaseDesign)
2118 } catch (BpmnError 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())
2129 public void preProcessRollback (DelegateExecution execution) {
2131 logger.trace("preProcessRollback")
2134 Object workflowException = execution.getVariable("WorkflowException");
2136 if (workflowException instanceof WorkflowException) {
2137 logger.debug("Prev workflowException: " + workflowException.getErrorMessage())
2138 execution.setVariable("prevWorkflowException", workflowException);
2139 //execution.setVariable("WorkflowException", null);
2141 } catch (BpmnError e) {
2142 logger.debug("BPMN Error during preProcessRollback")
2143 } catch(Exception ex) {
2144 String msg = "Exception in preProcessRollback. " + ex.getMessage()
2147 logger.trace("Exit preProcessRollback")
2150 public void postProcessRollback (DelegateExecution execution) {
2152 logger.trace("postProcessRollback")
2155 Object workflowException = execution.getVariable("prevWorkflowException");
2156 if (workflowException instanceof WorkflowException) {
2157 logger.debug("Setting prevException to WorkflowException: ")
2158 execution.setVariable("WorkflowException", workflowException);
2160 execution.setVariable("rollbackData", null)
2161 } catch (BpmnError b) {
2162 logger.debug("BPMN Error during postProcessRollback")
2164 } catch(Exception ex) {
2165 msg = "Exception in postProcessRollback. " + ex.getMessage()
2168 logger.trace("Exit postProcessRollback")