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.aai.domain.yang.GenericVnf
26 import org.onap.aai.domain.yang.VfModule
27 import org.camunda.bpm.engine.delegate.BpmnError
28 import org.camunda.bpm.engine.delegate.DelegateExecution;
29 import org.json.JSONArray;
30 import org.json.JSONObject
31 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
32 import org.onap.so.bpmn.common.scripts.ExceptionUtil
33 import org.onap.so.bpmn.common.scripts.MsoUtils
34 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
35 import org.onap.so.bpmn.common.scripts.VidUtils
36 import org.onap.so.bpmn.core.UrnPropertiesReader
37 import org.onap.so.bpmn.core.WorkflowException
38 import org.onap.so.bpmn.core.domain.ModelInfo
39 import org.onap.so.bpmn.core.domain.ModuleResource
40 import org.onap.so.bpmn.core.domain.ServiceDecomposition
41 import org.onap.so.bpmn.core.domain.VnfResource
42 import org.onap.so.bpmn.core.json.JsonUtils
43 import org.onap.so.client.graphinventory.entities.uri.Depth
44 import org.onap.so.client.aai.entities.uri.AAIResourceUri
45 import org.onap.so.client.aai.entities.uri.AAIUriFactory
46 import org.onap.so.client.aai.AAIObjectType
47 import org.onap.so.logger.MessageEnum
48 import org.onap.so.logger.MsoLogger
49 import org.slf4j.Logger
50 import org.slf4j.LoggerFactory
53 * This class supports the macro VID Flow
54 * with the deletion of a generic vnf and related VF modules.
56 class DoDeleteVnfAndModules extends AbstractServiceTaskProcessor {
57 private static final Logger logger = LoggerFactory.getLogger( DoDeleteVnfAndModules.class);
59 String Prefix="DDVAM_"
60 ExceptionUtil exceptionUtil = new ExceptionUtil()
61 JsonUtils jsonUtil = new JsonUtils()
62 VidUtils vidUtils = new VidUtils(this)
63 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
66 * This method gets and validates the incoming
72 public void preProcessRequest(DelegateExecution execution) {
74 execution.setVariable("prefix",Prefix)
75 logger.trace("STARTED DoDeleteVnfAndModules PreProcessRequest Process")
80 String cloudConfiguration = execution.getVariable("cloudConfiguration")
81 logger.debug("Cloud Configuration: " + cloudConfiguration)
83 String requestId = execution.getVariable("msoRequestId")
84 execution.setVariable("requestId", requestId)
85 execution.setVariable("mso-request-id", requestId)
86 logger.debug("Incoming Request Id is: " + requestId)
88 String serviceInstanceId = execution.getVariable("serviceInstanceId")
89 logger.debug("Incoming Service Instance Id is: " + serviceInstanceId)
91 String vnfId = execution.getVariable("vnfId")
92 logger.debug("Incoming Vnf Id is: " + vnfId)
95 execution.setVariable("DDVAM_source", source)
96 logger.debug("Incoming Source is: " + source)
98 execution.setVariable("DDVAM_isVidRequest", "true")
100 String sdncVersion = execution.getVariable("sdncVersion")
101 if (sdncVersion == null) {
104 execution.setVariable("DDVAM_sdncVersion", sdncVersion)
105 logger.debug("Incoming Sdnc Version is: " + sdncVersion)
107 // Set aLaCarte flag to false
108 execution.setVariable("aLaCarte", false)
110 String sdncCallbackUrl = (String) UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback", execution)
111 if (sdncCallbackUrl == null || sdncCallbackUrl.trim().isEmpty()) {
112 def msg = 'Required variable \'mso.workflow.sdncadapter.callback\' is missing'
113 logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN",
114 MsoLogger.ErrorCode.UnknownError.getValue(), "Exception");
115 exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
117 execution.setVariable("sdncCallbackUrl", sdncCallbackUrl)
118 logger.debug("SDNC Callback URL: " + sdncCallbackUrl)
119 logger.debug("SDNC Callback URL is: " + sdncCallbackUrl)
122 if (!sdncVersion.equals("1702")) {
123 //String vnfModelInfo = execution.getVariable("vnfModelInfo")
124 //String serviceModelInfo = execution.getVariable("serviceModelInfo")
126 String serviceId = execution.getVariable("productFamilyId")
127 execution.setVariable("DDVAM_serviceId", serviceId)
128 logger.debug("Incoming Service Id is: " + serviceId)
131 //String modelInvariantId = jsonUtil.getJsonValue(vnfModelInfo, "modelInvariantId")
132 //execution.setVariable("DDVAM_modelInvariantId", modelInvariantId)
133 //logger.debug("Incoming Invariant Id is: " + modelInvariantId)
135 //String modelVersionId = jsonUtil.getJsonValue(vnfModelInfo, "modelVersionId")
136 //if (modelVersionId == null) {
137 // modelVersionId = ""
139 //execution.setVariable("DDVAM_modelVersionId", modelVersionId)
140 //logger.debug("Incoming Version Id is: " + modelVersionId)
142 //String modelVersion = jsonUtil.getJsonValue(vnfModelInfo, "modelVersion")
143 //execution.setVariable("DDVAM_modelVersion", modelVersion)
144 //logger.debug("Incoming Model Version is: " + modelVersion)
146 //String modelName = jsonUtil.getJsonValue(vnfModelInfo, "modelName")
147 //execution.setVariable("DDVAM_modelName", modelName)
148 //logger.debug("Incoming Model Name is: " + modelName)
150 //String modelCustomizationId = jsonUtil.getJsonValue(vnfModelInfo, "modelCustomizationId")
151 //if (modelCustomizationId == null) {
152 // modelCustomizationId = ""
154 //execution.setVariable("DDVAM_modelCustomizationId", modelCustomizationId)
155 //logger.debug("Incoming Model Customization Id is: " + modelCustomizationId)
157 String cloudSiteId = execution.getVariable("lcpCloudRegionId")
158 execution.setVariable("DDVAM_cloudSiteId", cloudSiteId)
159 logger.debug("Incoming Cloud Site Id is: " + cloudSiteId)
161 String tenantId = execution.getVariable("tenantId")
162 execution.setVariable("DDVAM_tenantId", tenantId)
163 logger.debug("Incoming Tenant Id is: " + tenantId)
165 String globalSubscriberId = execution.getVariable("globalSubscriberId")
166 if (globalSubscriberId == null) {
167 globalSubscriberId = ""
169 execution.setVariable("DDVAM_globalSubscriberId", globalSubscriberId)
170 logger.debug("Incoming Global Subscriber Id is: " + globalSubscriberId)
173 execution.setVariable("DDVAM_vfModulesFromDecomposition", null)
174 // Retrieve serviceDecomposition if present
175 ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
176 if (serviceDecomposition != null) {
177 logger.debug("Getting Catalog DB data from ServiceDecomposition object: " + serviceDecomposition.toJsonString())
178 List<VnfResource> vnfs = serviceDecomposition.getVnfResources()
179 logger.debug("Read vnfs")
181 logger.debug("Error - vnfs are empty in serviceDecomposition object")
182 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in preProcessRequest - vnfs are empty")
184 VnfResource vnf = vnfs[0]
187 logger.debug("Error - vnf is empty in serviceDecomposition object")
188 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in preProcessRequest - vnf is empty")
191 List<ModuleResource> vfModules = vnf.getAllVfModuleObjects()
193 execution.setVariable("DDVAM_vfModulesFromDecomposition", vfModules)
196 execution.setVariable("DDVAM_moduleCount", 0)
197 execution.setVariable("DDVAM_nextModule", 0)
201 logger.debug("Rethrowing MSOWorkflowException")
204 logger.debug(" Error Occured in DoCreateVnfAndModules PreProcessRequest method!" + e.getMessage())
205 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in DoCreateVnf PreProcessRequest")
208 logger.trace("COMPLETED DoDeleteVnfAndModules PreProcessRequest Process ")
213 public void preProcessAddOnModule(DelegateExecution execution){
215 execution.setVariable("prefix", Prefix)
216 logger.trace("STARTED preProcessAddOnModule ")
219 JSONArray addOnModules = (JSONArray) execution.getVariable("addOnModules")
220 int addOnIndex = (int) execution.getVariable("addOnModulesDeployed")
222 JSONObject addOnModule = addOnModules[addOnIndex]
224 def newVfModuleId = UUID.randomUUID().toString()
225 execution.setVariable("addOnVfModuleId", newVfModuleId)
227 execution.setVariable("instancesOfThisModelDeployed", 0)
229 JSONObject addOnVfModuleModelInfoObject = jsonUtil.getJsonValueForKey(addOnModule, "modelInfo")
230 String addOnVfModuleModelInfo = addOnVfModuleModelInfoObject.toString()
231 execution.setVariable("addOnVfModuleModelInfo", addOnVfModuleModelInfo)
232 String addOnVfModuleLabel = jsonUtil.getJsonValueForKey(addOnModule, "vfModuleLabel")
233 execution.setVariable("addOnVfModuleLabel", addOnVfModuleLabel)
234 String addOnPersonaModelId = jsonUtil.getJsonValueForKey(addOnVfModuleModelInfoObject, "modelInvariantUuid")
235 execution.setVariable("addOnPersonaModelId", addOnPersonaModelId)
236 String addOnInitialCount = jsonUtil.getJsonValueForKey(addOnModule, "initialCount")
237 execution.setVariable("initialCount", addOnInitialCount)
241 logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
242 "Exception Occured Processing preProcessAddOnModule." + e, "BPMN",
243 MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
244 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occurred during preProcessAddOnModule Method:\n" + e.getMessage())
246 logger.trace("COMPLETED preProcessSDNCAssignRequest ")
250 * Using the received vnfId and vfModuleId, query AAI to get the corresponding VNF info.
251 * A 200 response is expected with the VNF info in the response body. Will find out the base module info.
253 * @param execution The flow's execution instance.
255 public void queryAAIVfModule(DelegateExecution execution) {
257 def method = getClass().getSimpleName() + '.queryAAIVfModule(' +
258 'execution=' + execution.getId() +
260 logger.trace('Entered ' + method)
263 def vnfId = execution.getVariable('vnfId')
265 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId).depth(Depth.ONE)
268 Optional<GenericVnf> genericVnfOp = getAAIClient().get(GenericVnf.class,uri)
269 //Map<String, String>[] vfModules = new HashMap<String,String>[]
270 List<ModuleResource> vfModulesFromDecomposition = execution.getVariable("DDVAM_vfModulesFromDecomposition")
271 def vfModulesList = new ArrayList<Map<String,String>>()
272 def vfModuleBaseEntry = null
273 if (genericVnfOp.isPresent()) {
274 execution.setVariable('DCVFM_queryAAIVfModuleResponseCode', 200)
275 execution.setVariable('DCVFM_queryAAIVfModuleResponse', genericVnfOp.get())
277 // Parse the VNF record from A&AI to find base module info
278 if (genericVnfOp.get().getVfModules()!= null && !genericVnfOp.get().getVfModules().getVfModule().isEmpty() ) {
279 List<VfModule> vfModules = genericVnfOp.get().getVfModules().getVfModule()
280 execution.setVariable("DDVAM_moduleCount", vfModules.size())
281 ModelInfo vfModuleModelInfo = null
282 for (VfModule vfModule : vfModules) {
283 Map<String, String> vfModuleEntry = new HashMap<String, String>()
284 vfModuleEntry.put("vfModuleId", vfModule.getVfModuleId())
285 vfModuleEntry.put("vfModuleName", vfModule.getVfModuleName())
287 // Find the model for this vf module in decomposition if specified
288 if (vfModulesFromDecomposition != null) {
289 logger.debug("vfModulesFromDecomposition is not null")
290 def vfModuleUuid = vfModule.getModelVersionId()
291 if (vfModuleUuid == null) {
292 vfModuleUuid = vfModule.getPersonaModelVersion()
294 logger.debug("vfModule UUID is: " + vfModuleUuid)
295 for (j in 0..vfModulesFromDecomposition.size()-1) {
296 ModuleResource mr = vfModulesFromDecomposition[j]
297 if (mr.getModelInfo().getModelUuid() == vfModuleUuid) {
298 logger.debug("Found modelInfo")
299 vfModuleModelInfo = mr.getModelInfo()
305 if (vfModuleModelInfo != null) {
306 String vfModuleModelInfoString = vfModuleModelInfo.toString()
307 def vfModuleModelInfoValue = jsonUtil.getJsonValue(vfModuleModelInfoString, "modelInfo")
308 vfModuleEntry.put("vfModuleModelInfo", vfModuleModelInfoValue)
311 vfModuleEntry.put("vfModuleModelInfo", null)
315 // Save base vf module for last
316 if (vfModule.isIsBaseVfModule()) {
317 vfModuleBaseEntry = vfModuleEntry
320 vfModulesList.add(vfModuleEntry)
323 if (vfModuleBaseEntry != null) {
324 vfModulesList.add(vfModuleBaseEntry)
328 execution.setVariable('DCVFM_queryAAIVfModuleResponseCode', 404)
329 execution.setVariable('DCVFM_queryAAIVfModuleResponse', "Generic Vnf not found")
332 execution.setVariable("DDVAM_vfModules", vfModulesList)
333 } catch (Exception ex) {
335 logger.debug('Exception occurred while executing AAI GET:' + ex.getMessage())
336 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'AAI GET Failed:' + ex.getMessage())
338 logger.trace('Exited ' + method)
339 } catch (BpmnError e) {
341 } catch (Exception e) {
342 logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
343 'Caught exception in ' + method, "BPMN",
344 MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
345 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in queryAAIVfModule(): ' + e.getMessage())
349 public void prepareNextModuleToDelete(DelegateExecution execution){
351 execution.setVariable("prefix", Prefix)
352 logger.trace("STARTED prepareNextModuleToDelete ")
355 int i = execution.getVariable("DDVAM_nextModule")
356 def vfModules = execution.getVariable("DDVAM_vfModules")
357 def vfModule = vfModules[i]
359 def vfModuleId = vfModule.get("vfModuleId")
360 execution.setVariable("DDVAM_vfModuleId", vfModuleId)
362 def vfModuleName = vfModule.get("vfModuleName")
363 execution.setVariable("DDVAM_vfModuleName", vfModuleName)
365 def vfModuleModelInfo = vfModule.get("vfModuleModelInfo")
366 logger.debug("vfModuleModelInfo for module delete: " + vfModuleModelInfo)
367 execution.setVariable("DDVAM_vfModuleModelInfo", vfModuleModelInfo)
370 logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
371 "Exception Occured Processing preProcessAddOnModule." + e, "BPMN",
372 MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
373 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occurred during prepareNextModuleToDelete Method:\n" + e.getMessage())
375 logger.trace("COMPLETED prepareNextModuleToDelete ")
378 public void preProcessSDNCDeactivateRequest(DelegateExecution execution){
380 execution.setVariable("prefix", Prefix)
381 logger.trace("STARTED preProcessSDNCDeactivateRequest ")
382 def vnfId = execution.getVariable("vnfId")
383 def serviceInstanceId = execution.getVariable("serviceInstanceId")
388 String deactivateSDNCRequest = buildSDNCRequest(execution, serviceInstanceId, "deactivate")
390 deactivateSDNCRequest = utils.formatXml(deactivateSDNCRequest)
391 execution.setVariable("DDVAM_deactivateSDNCRequest", deactivateSDNCRequest)
392 logger.debug("Outgoing DeactivateSDNCRequest is: \n" + deactivateSDNCRequest)
393 logger.debug("Outgoing DeactivateSDNCRequest is: \n" + deactivateSDNCRequest)
396 logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
397 "Exception Occured Processing preProcessSDNCDeactivateRequest." + e, "BPMN",
398 MsoLogger.ErrorCode.UnknownError.getValue(), "Exception is:\n" + e);
399 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occurred during preProcessSDNCDeactivateRequest Method:\n" + e.getMessage())
401 logger.trace("COMPLETED preProcessSDNCDeactivateRequest ")
404 public void preProcessSDNCUnassignRequest(DelegateExecution execution) {
405 def method = getClass().getSimpleName() + '.preProcessSDNCUnassignRequest(' +
406 'execution=' + execution.getId() +
409 logger.trace('Entered ' + method)
410 execution.setVariable("prefix", Prefix)
411 logger.trace("STARTED preProcessSDNCUnassignRequest Process ")
413 String vnfId = execution.getVariable("vnfId")
414 String serviceInstanceId = execution.getVariable("serviceInstanceId")
416 String unassignSDNCRequest = buildSDNCRequest(execution, serviceInstanceId, "unassign")
418 execution.setVariable("DDVAM_unassignSDNCRequest", unassignSDNCRequest)
419 logger.debug("Outgoing UnassignSDNCRequest is: \n" + unassignSDNCRequest)
420 logger.debug("Outgoing UnassignSDNCRequest is: \n" + unassignSDNCRequest)
423 logger.debug("Exception Occured Processing preProcessSDNCUnassignRequest. Exception is:\n" + e)
424 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during preProcessSDNCUnassignRequest Method:\n" + e.getMessage())
426 logger.trace("COMPLETED preProcessSDNCUnassignRequest Process ")
429 public String buildSDNCRequest(DelegateExecution execution, String svcInstId, String action){
431 String uuid = execution.getVariable('testReqId') // for junits
433 uuid = execution.getVariable("msoRequestId") + "-" + System.currentTimeMillis()
435 def callbackURL = execution.getVariable("sdncCallbackUrl")
436 def requestId = execution.getVariable("msoRequestId")
437 def serviceId = execution.getVariable("DDVAM_serviceId")
438 def tenantId = execution.getVariable("DDVAM_tenantId")
439 def source = execution.getVariable("DDVAM_source")
440 def vnfId = execution.getVariable("vnfId")
441 def serviceInstanceId = execution.getVariable("serviceInstanceId")
442 def cloudSiteId = execution.getVariable("DDVAM_cloudSiteId")
443 def modelCustomizationId = execution.getVariable("DDVAM_modelCustomizationId")
444 //def serviceModelInfo = execution.getVariable("serviceModelInfo")
445 //def vnfModelInfo = execution.getVariable("vnfModelInfo")
446 //String serviceEcompModelInformation = sdncAdapterUtils.modelInfoToEcompModelInformation(serviceModelInfo)
447 //String vnfEcompModelInformation = sdncAdapterUtils.modelInfoToEcompModelInformation(vnfModelInfo)
448 def globalSubscriberId = execution.getVariable("DDVAM_globalSubscriberId")
449 def sdncVersion = execution.getVariable("DDVAM_sdncVersion")
452 """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.onap/so/request/types/v1"
453 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
454 xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
455 <sdncadapter:RequestHeader>
456 <sdncadapter:RequestId>${MsoUtils.xmlEscape(uuid)}</sdncadapter:RequestId>
457 <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(svcInstId)}</sdncadapter:SvcInstanceId>
458 <sdncadapter:SvcAction>${MsoUtils.xmlEscape(action)}</sdncadapter:SvcAction>
459 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
460 <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackURL)}</sdncadapter:CallbackUrl>
461 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
462 </sdncadapter:RequestHeader>
463 <sdncadapterworkflow:SDNCRequestData>
464 <request-information>
465 <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
466 <request-action>DeleteVnfInstance</request-action>
467 <source>${MsoUtils.xmlEscape(source)}</source>
471 </request-information>
472 <service-information>
474 <subscription-service-type/>
475 <service-instance-id>${MsoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
476 <global-customer-id/>
477 </service-information>
479 <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
484 <tenant>${MsoUtils.xmlEscape(tenantId)}</tenant>
485 <aic-cloud-region>${MsoUtils.xmlEscape(cloudSiteId)}</aic-cloud-region>
487 </sdncadapterworkflow:SDNCRequestData>
488 </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
490 logger.debug("sdncRequest: " + sdncRequest)
494 public void validateSDNCResponse(DelegateExecution execution, String response, String method){
496 execution.setVariable("prefix",Prefix)
497 logger.trace("STARTED ValidateSDNCResponse Process")
499 WorkflowException workflowException = execution.getVariable("WorkflowException")
500 boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
502 logger.debug("workflowException: " + workflowException)
504 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
505 sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
507 logger.debug("SDNCResponse: " + response)
509 String sdncResponse = response
510 if(execution.getVariable(Prefix + 'sdncResponseSuccess') == true){
511 logger.debug("Received a Good Response from SDNC Adapter for " + method + " SDNC Call. Response is: \n" + sdncResponse)
513 logger.debug("Received a BAD Response from SDNC Adapter for " + method + " SDNC Call.")
514 throw new BpmnError("MSOWorkflowException")
516 logger.trace("COMPLETED ValidateSDNCResponse Process")