2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.openecomp.mso.bpmn.infrastructure.scripts
 
  22 import javax.xml.parsers.DocumentBuilder
 
  23 import javax.xml.parsers.DocumentBuilderFactory
 
  25 import org.camunda.bpm.engine.delegate.BpmnError
 
  26 import org.camunda.bpm.engine.runtime.Execution
 
  27 import org.openecomp.mso.bpmn.common.scripts.AaiUtil
 
  28 import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor
 
  29 import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
 
  30 import org.openecomp.mso.bpmn.common.scripts.SDNCAdapterUtils
 
  31 import org.openecomp.mso.bpmn.common.scripts.VfModule
 
  32 import org.openecomp.mso.bpmn.core.WorkflowException
 
  33 import org.openecomp.mso.bpmn.core.json.JsonUtils
 
  34 import org.openecomp.mso.rest.APIResponse
 
  35 import org.springframework.web.util.UriUtils
 
  36 import org.w3c.dom.Document
 
  37 import org.w3c.dom.Element
 
  38 import org.xml.sax.InputSource
 
  39 import org.w3c.dom.Node
 
  40 import org.w3c.dom.NodeList;
 
  43 /* Subflow for Delete VF Module. When no DoDeleteVfModuleRequest is specified on input,
 
  44  * functions as a building block subflow
 
  46 * Inputs for building block interface:
 
  48 * @param - isDebugLogEnabled
 
  51 * @param - serviceInstanceId
 
  52 * @param - vfModuleName O
 
  53 * @param - vfModuleModelInfo
 
  54 * @param - cloudConfiguration*
 
  55 * @param - sdncVersion ("1610")
 
  56 * @param - retainResources 
 
  59 * @param - WorkflowException
 
  62 public class DoDeleteVfModule extends AbstractServiceTaskProcessor{
 
  64         def Prefix="DoDVfMod_"
 
  66         ExceptionUtil exceptionUtil = new ExceptionUtil()
 
  67         JsonUtils jsonUtil = new JsonUtils()
 
  69         public void initProcessVariables(Execution execution) {
 
  70                 execution.setVariable("prefix",Prefix)
 
  71                 execution.setVariable("DoDVfMod_contrailNetworkPolicyFqdnList", null)
 
  72                 execution.setVariable("DoDVfMod_oamManagementV4Address", null)
 
  73                 execution.setVariable("DoDVfMod_oamManagementV6Address", null)
 
  77         // parse the incoming DELETE_VF_MODULE request for the Generic Vnf and Vf Module Ids
 
  78         // and formulate the outgoing request for PrepareUpdateAAIVfModuleRequest
 
  79         public void preProcessRequest(Execution execution) {
 
  80                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
 
  81                 initProcessVariables(execution)
 
  84                         def xml = execution.getVariable("DoDeleteVfModuleRequest")
 
  86                         String vfModuleId = ""
 
  88                         if (xml == null || xml.isEmpty()) {
 
  89                                 // Building Block-type request
 
  91                                 // Set mso-request-id to request-id for VNF Adapter interface
 
  92                                 String requestId = execution.getVariable("requestId")
 
  93                                 execution.setVariable("mso-request-id", requestId)
 
  95                                 String cloudConfiguration = execution.getVariable("cloudConfiguration")
 
  96                                 String vfModuleModelInfo = execution.getVariable("vfModuleModelInfo")
 
  97                                 String tenantId = jsonUtil.getJsonValue(cloudConfiguration, "tenantId")
 
  98                                 execution.setVariable("tenantId", tenantId)
 
  99                                 String cloudSiteId = jsonUtil.getJsonValue(cloudConfiguration, "lcpCloudRegionId")
 
 100                                 execution.setVariable("cloudSiteId", cloudSiteId)
 
 101                                 // Source is HARDCODED
 
 102                                 String source = "VID"
 
 103                                 execution.setVariable("source", source)
 
 104                                 // SrvInstId is hardcoded to empty
 
 105                                 execution.setVariable("srvInstId", "")
 
 106                                 // ServiceId is hardcoded to empty
 
 107                                 execution.setVariable("serviceId", "")
 
 108                                 String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
 109                                 vnfId = execution.getVariable("vnfId")
 
 110                                 vfModuleId = execution.getVariable("vfModuleId")
 
 111                                 if (serviceInstanceId == null || serviceInstanceId.isEmpty()) {
 
 112                                         execution.setVariable(Prefix + "serviceInstanceIdToSdnc", vfModuleId)
 
 115                                         execution.setVariable(Prefix + "serviceInstanceIdToSdnc", serviceInstanceId)
 
 118                                 def vfModuleModelName = jsonUtil.getJsonValue(vfModuleModelInfo, "modelName")
 
 119                                 execution.setVariable("vfModuleModelName", vfModuleModelName)
 
 121                                 def retainResources = execution.getVariable("retainResources")                  
 
 122                                 if (retainResources == null) {
 
 123                                         retainResources  = false
 
 125                                 execution.setVariable("retainResources", retainResources)
 
 129                                 utils.logAudit("DoDeleteVfModule Request: " + xml)
 
 131                                 utils.log("DEBUG", "input request xml: " + xml, isDebugEnabled)
 
 133                                 vnfId = utils.getNodeText1(xml,"vnf-id")
 
 134                                 execution.setVariable("vnfId", vnfId)
 
 135                                 vfModuleId = utils.getNodeText1(xml,"vf-module-id")
 
 136                                 execution.setVariable("vfModuleId", vfModuleId)
 
 137                                 def srvInstId = execution.getVariable("mso-service-instance-id")
 
 138                                 execution.setVariable("srvInstId", srvInstId)
 
 139                                 String requestId = ""
 
 141                                         requestId = execution.getVariable("mso-request-id")
 
 142                                 } catch (Exception ex) {
 
 143                                         requestId = utils.getNodeText1(xml, "request-id")
 
 145                                 execution.setVariable("requestId", requestId)
 
 146                                 String source = utils.getNodeText1(xml, "source")
 
 147                                 execution.setVariable("source", source)
 
 148                                 String serviceId = utils.getNodeText1(xml, "service-id")
 
 149                                 execution.setVariable("serviceId", serviceId)
 
 150                                 String tenantId = utils.getNodeText1(xml, "tenant-id")
 
 151                                 execution.setVariable("tenantId", tenantId)
 
 153                                 String serviceInstanceIdToSdnc = ""
 
 154                                 if (xml.contains("service-instance-id")) {
 
 155                                         serviceInstanceIdToSdnc = utils.getNodeText1(xml, "service-instance-id")
 
 157                                         serviceInstanceIdToSdnc = vfModuleId
 
 159                                 execution.setVariable(Prefix + "serviceInstanceIdToSdnc", serviceInstanceIdToSdnc)
 
 160                                 String vfModuleName = utils.getNodeText1(xml, "vf-module-name")
 
 161                                 execution.setVariable("vfModuleName", vfModuleName)
 
 162                                 String vfModuleModelName = utils.getNodeText1(xml, "vf-module-model-name")
 
 163                                 execution.setVariable("vfModuleModelName", vfModuleModelName)
 
 164                                 String cloudSiteId = utils.getNodeText1(xml, "aic-cloud-region")
 
 165                                 execution.setVariable("cloudSiteId", cloudSiteId)
 
 168                         // formulate the request for PrepareUpdateAAIVfModule
 
 169                         String request = """<PrepareUpdateAAIVfModuleRequest>
 
 170                                                                         <vnf-id>${vnfId}</vnf-id>
 
 171                                                                         <vf-module-id>${vfModuleId}</vf-module-id>
 
 172                                                                         <orchestration-status>pending-delete</orchestration-status>
 
 173                                                                 </PrepareUpdateAAIVfModuleRequest>""" as String
 
 174                         utils.log("DEBUG", "PrepareUpdateAAIVfModuleRequest :" + request, isDebugEnabled)
 
 175                         utils.logAudit("UpdateAAIVfModule Request: " + request)
 
 176                         execution.setVariable("PrepareUpdateAAIVfModuleRequest", request)
 
 177                         execution.setVariable("vfModuleFromAAI", null)
 
 181                         exceptionUtil.buildAndThrowWorkflowException(execution, 2000, "Internal Error encountered in PreProcess method!")
 
 185         // build a SDNC vnf-topology-operation request for the specified action
 
 186         // (note: the action passed is expected to be 'changedelete' or 'delete')
 
 187         public void prepSDNCAdapterRequest(Execution execution, String action) {
 
 188                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
 
 190                 String uuid = execution.getVariable('testReqId') // for junits
 
 192                         uuid = execution.getVariable("requestId") + "-" +       System.currentTimeMillis()
 
 195                 def srvInstId = execution.getVariable("srvInstId")
 
 196                 def callbackUrl = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
 
 197                 String requestId = execution.getVariable("requestId")
 
 198                 String source = execution.getVariable("source")
 
 199                 String serviceId = execution.getVariable("serviceId")
 
 200                 String vnfId = execution.getVariable("vnfId")
 
 201                 String tenantId = execution.getVariable("tenantId")
 
 202                 String vfModuleId = execution.getVariable("vfModuleId")
 
 203                 String serviceInstanceIdToSdnc = execution.getVariable(Prefix + "serviceInstanceIdToSdnc")
 
 204                 String vfModuleName = execution.getVariable("vfModuleName")
 
 205                 // Get vfModuleName from AAI response if it was not specified on the request
 
 206                 if (vfModuleName == null || vfModuleName.isEmpty()) {
 
 207                         if (execution.getVariable("vfModuleFromAAI") != null) {
 
 208                                 VfModule vfModuleFromAAI = execution.getVariable("vfModuleFromAAI")
 
 209                                 vfModuleName = vfModuleFromAAI.getElementText("vf-module-name")
 
 212                 String vfModuleModelName = execution.getVariable("vfModuleModelName")
 
 213                 String cloudSiteId = execution.getVariable("cloudSiteId")
 
 214                 boolean retainResources = execution.getVariable("retainResources")
 
 215                 String requestSubActionString = ""
 
 216                 if (retainResources) {
 
 217                         requestSubActionString = "<request-sub-action>RetainResource</request-sub-action>"                      
 
 219                 String request = """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.openecomp/mso/request/types/v1"
 
 220                                                                                                         xmlns:sdncadapterworkflow="http://org.openecomp/mso/workflow/schema/v1"
 
 221                                                                                                         xmlns:sdncadapter="http://org.openecomp/workflow/sdnc/adapter/schema/v1">
 
 222                                                       <sdncadapter:RequestHeader>
 
 223                                                          <sdncadapter:RequestId>${uuid}</sdncadapter:RequestId>
 
 224                                                          <sdncadapter:SvcInstanceId>${vfModuleId}</sdncadapter:SvcInstanceId>
 
 225                                                          <sdncadapter:SvcAction>${action}</sdncadapter:SvcAction>
 
 226                                                          <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
 
 227                                                          <sdncadapter:CallbackUrl>${callbackUrl}</sdncadapter:CallbackUrl>
 
 228                                                       </sdncadapter:RequestHeader>
 
 229                                                       <sdncadapterworkflow:SDNCRequestData>
 
 230                                                          <request-information>
 
 231                                                             <request-id>${requestId}</request-id>
 
 232                                                             <request-action>DisconnectVNFRequest</request-action>
 
 233                                                                         ${requestSubActionString}
 
 234                                                             <source>${source}</source>
 
 238                                                          </request-information>
 
 239                                                          <service-information>
 
 240                                                             <service-id>${serviceId}</service-id>
 
 241                                                                         <service-type>${serviceId}</service-type>
 
 242                                                             <service-instance-id>${serviceInstanceIdToSdnc}</service-instance-id>
 
 243                                                             <subscriber-name>notsurewecare</subscriber-name>
 
 244                                                          </service-information>
 
 245                                                          <vnf-request-information>
 
 246                                                                 <vnf-id>${vfModuleId}</vnf-id>
 
 247                                                                         <vnf-type>${vfModuleModelName}</vnf-type>
 
 248                                     <vnf-name>${vfModuleName}</vnf-name>
 
 249                                                                         <generic-vnf-id>${vnfId}</generic-vnf-id>
 
 250                                     <generic-vnf-name></generic-vnf-name>
 
 251                                                                         <generic-vnf-type></generic-vnf-type>
 
 252                                                                         <aic-cloud-region>${cloudSiteId}</aic-cloud-region>
 
 253                                                                         <tenant>${tenantId}</tenant>
 
 254                                                          </vnf-request-information>
 
 255                                                       </sdncadapterworkflow:SDNCRequestData>
 
 256                                                    </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
 
 258                 utils.log("DEBUG", "sdncAdapterWorkflowRequest: " + request, isDebugEnabled)
 
 259                 utils.logAudit("DoDeleteVfModule - SDNCAdapterWorkflowRequest: " + request)
 
 260                 execution.setVariable("sdncAdapterWorkflowRequest", request)
 
 263         // parse the incoming DELETE_VF_MODULE request
 
 264         // and formulate the outgoing VnfAdapterDeleteV1 request
 
 265         public void prepVNFAdapterRequest(Execution execution) {
 
 266                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
 
 267                 def requestId = UUID.randomUUID().toString()
 
 268                 def origRequestId = execution.getVariable('requestId')
 
 269                 def srvInstId = execution.getVariable("serviceInstanceId")
 
 270                 def aicCloudRegion = execution.getVariable("cloudSiteId")
 
 271                 def vnfId = execution.getVariable("vnfId")
 
 272                 def vfModuleId = execution.getVariable("vfModuleId")
 
 273                 def vfModuleStackId = execution.getVariable('DoDVfMod_heatStackId')
 
 274                 def tenantId = execution.getVariable("tenantId")
 
 275                 def messageId = execution.getVariable('requestId') + '-' +
 
 276                         System.currentTimeMillis()
 
 277                 def notificationUrl = createCallbackURL(execution, "VNFAResponse", messageId)
 
 278                 def useQualifiedHostName = execution.getVariable("URN_mso_use_qualified_host")
 
 279                 if ('true'.equals(useQualifiedHostName)) {
 
 280                         notificationUrl = utils.getQualifiedHostNameForCallback(notificationUrl)
 
 284                         <deleteVfModuleRequest>
 
 285                             <cloudSiteId>${aicCloudRegion}</cloudSiteId>
 
 286                             <tenantId>${tenantId}</tenantId>
 
 287                             <vnfId>${vnfId}</vnfId>
 
 288                             <vfModuleId>${vfModuleId}</vfModuleId>
 
 289                             <vfModuleStackId>${vfModuleStackId}</vfModuleStackId>
 
 290                             <skipAAI>true</skipAAI>
 
 292                                 <requestId>${origRequestId}</requestId>
 
 293                                 <serviceInstanceId>${srvInstId}</serviceInstanceId>
 
 295                             <messageId>${messageId}</messageId>
 
 296                             <notificationUrl>${notificationUrl}</notificationUrl>
 
 297                         </deleteVfModuleRequest>
 
 300                 utils.log("DEBUG", "vnfAdapterRestV1Request: " + request, isDebugEnabled)
 
 301                 utils.logAudit("deleteVfModuleRequest: " + request)
 
 302                 execution.setVariable("vnfAdapterRestV1Request", request)
 
 305         // parse the incoming DELETE_VF_MODULE request
 
 306         // and formulate the outgoing UpdateAAIVfModuleRequest request
 
 307         public void prepUpdateAAIVfModule(Execution execution) {
 
 308                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
 
 309                 def vnfId = execution.getVariable("vnfId")
 
 310                 def vfModuleId = execution.getVariable("vfModuleId")
 
 311                 // formulate the request for UpdateAAIVfModule
 
 312                 String request = """<UpdateAAIVfModuleRequest>
 
 313                                                                 <vnf-id>${vnfId}</vnf-id>
 
 314                                                                 <vf-module-id>${vfModuleId}</vf-module-id>
 
 315                                                                 <heat-stack-id>DELETE</heat-stack-id>
 
 316                                                                 <orchestration-status>deleted</orchestration-status>
 
 317                                                         </UpdateAAIVfModuleRequest>""" as String
 
 318                 utils.log("DEBUG", "UpdateAAIVfModuleRequest :" + request, isDebugEnabled)
 
 319                 utils.logAudit("UpdateAAIVfModuleRequest: " + request)
 
 320                 execution.setVariable("UpdateAAIVfModuleRequest", request)
 
 323         // parse the incoming DELETE_VF_MODULE request
 
 324         // and formulate the outgoing DeleteAAIVfModuleRequest request
 
 325         public void prepDeleteAAIVfModule(Execution execution) {
 
 326                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
 
 328                 def vnfId = execution.getVariable("vnfId")
 
 329                 def vfModuleId = execution.getVariable("vfModuleId")
 
 330                 // formulate the request for UpdateAAIVfModule
 
 331                 String request = """<DeleteAAIVfModuleRequest>
 
 332                                                                 <vnf-id>${vnfId}</vnf-id>
 
 333                                                                 <vf-module-id>${vfModuleId}</vf-module-id>
 
 334                                                         </DeleteAAIVfModuleRequest>""" as String
 
 335                 utils.log("DEBUG", "DeleteAAIVfModuleRequest :" + request, isDebugEnabled)
 
 336                 utils.logAudit("DeleteAAIVfModuleRequest: " + request)
 
 337                 execution.setVariable("DeleteAAIVfModuleRequest", request)
 
 340         // generates a WorkflowException if
 
 342         public void handleDoDeleteVfModuleFailure(Execution execution) {
 
 343                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
 
 344                 utils.log("ERROR", "AAI error occurred deleting the Generic Vnf: "
 
 345                         + execution.getVariable("DoDVfMod_deleteGenericVnfResponse"), isDebugEnabled)
 
 346                 String processKey = getProcessKey(execution);
 
 347                 WorkflowException exception = new WorkflowException(processKey, 5000,
 
 348                         execution.getVariable("DoDVfMod_deleteGenericVnfResponse"))
 
 349                 execution.setVariable("WorkflowException", exception)
 
 352         public void sdncValidateResponse(Execution execution, String response){
 
 353                 def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
 
 354                 execution.setVariable("prefix",Prefix)
 
 356                 WorkflowException workflowException = execution.getVariable("WorkflowException")
 
 357                 boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
 
 359                 SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
 
 360                 sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
 
 362                 if(execution.getVariable(Prefix + 'sdncResponseSuccess') == true){
 
 363                         utils.log("DEBUG", "Successfully Validated SDNC Response", isDebugEnabled)
 
 365                         throw new BpmnError("MSOWorkflowException")
 
 369         public void postProcessVNFAdapterRequest(Execution execution) {
 
 370                 def method = getClass().getSimpleName() + '.postProcessVNFAdapterRequest(' +
 
 371                         'execution=' + execution.getId() +
 
 373                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
 
 374                 logDebug('Entered ' + method, isDebugLogEnabled)
 
 375                 execution.setVariable("prefix",Prefix)
 
 377                 logDebug(" *** STARTED postProcessVNFAdapterRequest Process*** ", isDebugLogEnabled)
 
 379                 String vnfResponse = execution.getVariable("DoDVfMod_doDeleteVfModuleResponse")
 
 380                 logDebug("VNF Adapter Response is: " + vnfResponse, isDebugLogEnabled)
 
 381                 utils.logAudit("deleteVnfAResponse is: \n"  + vnfResponse)
 
 383                 if(vnfResponse != null){
 
 385                         if(vnfResponse.contains("deleteVfModuleResponse")){
 
 386                                 logDebug("Received a Good Response from VNF Adapter for DELETE_VF_MODULE Call.", isDebugLogEnabled)
 
 387                                 execution.setVariable("DoDVfMod_vnfVfModuleDeleteCompleted", true)
 
 389                                 // Parse vnfOutputs for contrail network polcy FQDNs
 
 390                                 if (vnfResponse.contains("vfModuleOutputs")) {
 
 391                                         def vfModuleOutputsXml = utils.getNodeXml(vnfResponse, "vfModuleOutputs")
 
 392                                         InputSource source = new InputSource(new StringReader(vfModuleOutputsXml));
 
 393                         DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
 
 394                         docFactory.setNamespaceAware(true)
 
 395                         DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
 
 396                         Document outputsXml = docBuilder.parse(source)
 
 398                                         NodeList entries = outputsXml.getElementsByTagNameNS("*", "entry")
 
 399                                         List contrailNetworkPolicyFqdnList = []
 
 400                                         for (int i = 0; i< entries.getLength(); i++) {
 
 401                                                 Node node = entries.item(i)
 
 402                                                 if (node.getNodeType() == Node.ELEMENT_NODE) {
 
 403                                                         Element element = (Element) node
 
 404                                                         String key = element.getElementsByTagNameNS("*", "key").item(0).getTextContent()
 
 405                                                         if (key.endsWith("contrail_network_policy_fqdn")) {
 
 406                                                                 String contrailNetworkPolicyFqdn = element.getElementsByTagNameNS("*", "value").item(0).getTextContent()
 
 407                                                                 logDebug("Obtained contrailNetworkPolicyFqdn: " + contrailNetworkPolicyFqdn, isDebugLogEnabled)
 
 408                                                                 contrailNetworkPolicyFqdnList.add(contrailNetworkPolicyFqdn)
 
 410                                                         else if (key.equals("oam_management_v4_address")) {
 
 411                                                                 String oamManagementV4Address = element.getElementsByTagNameNS("*", "value").item(0).getTextContent()
 
 412                                                                 logDebug("Obtained oamManagementV4Address: " + oamManagementV4Address, isDebugLogEnabled)
 
 413                                                                 execution.setVariable(Prefix + "oamManagementV4Address", oamManagementV4Address)
 
 415                                                         else if (key.equals("oam_management_v6_address")) {
 
 416                                                                 String oamManagementV6Address = element.getElementsByTagNameNS("*", "value").item(0).getTextContent()
 
 417                                                                 logDebug("Obtained oamManagementV6Address: " + oamManagementV6Address, isDebugLogEnabled)
 
 418                                                                 execution.setVariable(Prefix + "oamManagementV6Address", oamManagementV6Address)
 
 423                                         if (!contrailNetworkPolicyFqdnList.isEmpty()) {
 
 424                                                 logDebug("Setting the fqdn list", isDebugLogEnabled)
 
 425                                                 execution.setVariable("DoDVfMod_contrailNetworkPolicyFqdnList", contrailNetworkPolicyFqdnList)
 
 429                                 logDebug("Received a BAD Response from VNF Adapter for DELETE_VF_MODULE Call.", isDebugLogEnabled)
 
 430                                 exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "VNF Adapter Error")
 
 433                         logDebug("Response from VNF Adapter is Null for DELETE_VF_MODULE Call.", isDebugLogEnabled)
 
 434                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Empty response from VNF Adapter")
 
 440                         logDebug("Internal Error Occured in PostProcess Method", isDebugLogEnabled)
 
 441                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Internal Error Occured in PostProcess Method")
 
 443                 logDebug(" *** COMPLETED postProcessVnfAdapterResponse Process*** ", isDebugLogEnabled)
 
 446         public void deleteNetworkPoliciesFromAAI(Execution execution) {
 
 447                 def method = getClass().getSimpleName() + '.deleteNetworkPoliciesFromAAI(' +
 
 448                 'execution=' + execution.getId() +
 
 450                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
 
 451                 logDebug('Entered ' + method, isDebugLogEnabled)
 
 452                 execution.setVariable("prefix", Prefix)
 
 453                 logDebug(" ======== STARTED deleteNetworkPoliciesFromAAI ======== ", isDebugLogEnabled)
 
 457                         List fqdnList = execution.getVariable("DoDVfMod_contrailNetworkPolicyFqdnList")
 
 458                         if (fqdnList == null) {
 
 459                                 logDebug("No network policies to delete", isDebugLogEnabled)
 
 462                         int fqdnCount = fqdnList.size()
 
 464                         execution.setVariable("DoDVfMod_networkPolicyFqdnCount", fqdnCount)
 
 465                         logDebug("DoDVfMod_networkPolicyFqdnCount - " + fqdnCount, isDebugLogEnabled)
 
 467                         String aai_endpoint = execution.getVariable("URN_aai_endpoint")
 
 468                         AaiUtil aaiUriUtil = new AaiUtil(this)
 
 469                         String aai_uri = aaiUriUtil.getNetworkPolicyUri(execution)
 
 472                                 // AII loop call over contrail network policy fqdn list
 
 473                                 for (i in 0..fqdnCount-1) {
 
 476                                         String fqdn = fqdnList[i]
 
 478                                         // Query AAI for this network policy FQDN
 
 480                                         String queryNetworkPolicyByFqdnAAIRequest = "${aai_endpoint}${aai_uri}?network-policy-fqdn=" + UriUtils.encode(fqdn, "UTF-8")
 
 481                                         utils.logAudit("AAI request endpoint: " + queryNetworkPolicyByFqdnAAIRequest)
 
 482                                         logDebug("AAI request endpoint: "  + queryNetworkPolicyByFqdnAAIRequest, isDebugLogEnabled)
 
 484                                         APIResponse response = aaiUriUtil.executeAAIGetCall(execution, queryNetworkPolicyByFqdnAAIRequest)
 
 485                                         int returnCode = response.getStatusCode()
 
 486                                         execution.setVariable("DCVFM_aaiQueryNetworkPolicyByFqdnReturnCode", returnCode)
 
 487                                         logDebug(" ***** AAI query network policy Response Code, NetworkPolicy #" + counting + " : " + returnCode, isDebugLogEnabled)
 
 489                                         String aaiResponseAsString = response.getResponseBodyAsString()
 
 491                                         if (isOneOf(returnCode, 200, 201)) {
 
 492                                                 logDebug("The return code is: "  + returnCode, isDebugLogEnabled)
 
 493                                                 // This network policy FQDN exists in AAI - need to delete it now
 
 494                                                 utils.logAudit(aaiResponseAsString)
 
 495                                                 execution.setVariable("DoDVfMod_queryNetworkPolicyByFqdnAAIResponse", aaiResponseAsString)
 
 496                                                 logDebug("QueryAAINetworkPolicyByFQDN Success REST Response, , NetworkPolicy #" + counting + " : " + "\n" + aaiResponseAsString, isDebugLogEnabled)
 
 497                                                 // Retrieve the network policy id for this FQDN
 
 498                                                 def networkPolicyId = utils.getNodeText1(aaiResponseAsString, "network-policy-id")
 
 499                                                 logDebug("Deleting network-policy with network-policy-id " + networkPolicyId, isDebugLogEnabled)
 
 501                                                 // Retrieve the resource version for this network policy
 
 502                                                 def resourceVersion = utils.getNodeText1(aaiResponseAsString, "resource-version")
 
 503                                                 logDebug("Deleting network-policy with resource-version " + resourceVersion, isDebugLogEnabled)
 
 505                                                 String delNetworkPolicyAAIRequest = "${aai_endpoint}${aai_uri}/" + UriUtils.encode(networkPolicyId, "UTF-8") +
 
 506                                                         "?resource-version=" + UriUtils.encode(resourceVersion, "UTF-8")
 
 507                                                 utils.logAudit("AAI request endpoint: " + delNetworkPolicyAAIRequest)
 
 508                                                 logDebug("AAI request endpoint: " + delNetworkPolicyAAIRequest, isDebugLogEnabled)
 
 510                                                 logDebug("invoking DELETE call to AAI", isDebugLogEnabled)
 
 511                                                 utils.logAudit("Sending DELETE call to AAI with Endpoint /n" + delNetworkPolicyAAIRequest)
 
 512                                                 APIResponse responseDel = aaiUriUtil.executeAAIDeleteCall(execution, delNetworkPolicyAAIRequest)
 
 513                                                 int returnCodeDel = responseDel.getStatusCode()
 
 514                                                 execution.setVariable("DoDVfMod_aaiDeleteNetworkPolicyReturnCode", returnCodeDel)
 
 515                                                 logDebug(" ***** AAI delete network policy Response Code, NetworkPolicy #" + counting + " : " + returnCodeDel, isDebugLogEnabled)
 
 517                                                 if (isOneOf(returnCodeDel, 200, 201, 204)) {
 
 518                                                         logDebug("The return code from deleting network policy is: "  + returnCodeDel, isDebugLogEnabled)
 
 519                                                         // This network policy was deleted from AAI successfully
 
 520                                                         logDebug(" DelAAINetworkPolicy Success REST Response, , NetworkPolicy #" + counting + " : ", isDebugLogEnabled)
 
 524                                                                 String delErrorMessage = "Unable to delete network-policy to AAI deleteNetworkPoliciesFromAAI - " + returnCodeDel
 
 525                                                          logDebug(delErrorMessage, isDebugLogEnabled)
 
 526                                                          exceptionUtil.buildAndThrowWorkflowException(execution, 2500, delErrorMessage)
 
 528                                         } else if (returnCode == 404) {
 
 529                                                 // This network policy FQDN is not in AAI. No need to delete.
 
 530                                                 logDebug("The return code is: "  + returnCode, isDebugLogEnabled)
 
 531                                                 logDebug("This network policy FQDN is not in AAI: " + fqdn, isDebugLogEnabled)
 
 532                                                 utils.logAudit("Network policy FQDN is not in AAI")
 
 534                                            if (aaiResponseAsString.contains("RESTFault")) {
 
 535                                                    WorkflowException exceptionObject = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
 
 536                                                    execution.setVariable("WorkflowException", exceptionObject)
 
 537                                                    throw new BpmnError("MSOWorkflowException")
 
 541                                                                 String dataErrorMessage = "Unexpected Response from deleteNetworkPoliciesFromAAI - " + returnCode
 
 542                                                                 logDebug(dataErrorMessage, isDebugLogEnabled)
 
 543                                                                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
 
 554                                    logDebug("No contrail network policies to query/create", isDebugLogEnabled)
 
 558                 } catch (BpmnError e) {
 
 561                 } catch (Exception ex) {
 
 562                         String exceptionMessage = "Bpmn error encountered in DoDeletVfModule flow. deleteNetworkPoliciesFromAAI() - " + ex.getMessage()
 
 563                         logDebug(exceptionMessage, isDebugLogEnabled)
 
 564                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
 
 570          * Prepare a Request for invoking the UpdateAAIGenericVnf subflow.
 
 572          * @param execution The flow's execution instance.
 
 574         public void prepUpdateAAIGenericVnf(Execution execution) {
 
 575                 def method = getClass().getSimpleName() + '.prepUpdateAAIGenericVnf(' +
 
 576                         'execution=' + execution.getId() +
 
 578                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
 
 579                 logDebug('Entered ' + method, isDebugLogEnabled)
 
 582                         def vnfId = execution.getVariable('vnfId')
 
 583                         def oamManagementV4Address = execution.getVariable(Prefix + 'oamManagementV4Address')
 
 584                         def oamManagementV6Address = execution.getVariable(Prefix + 'oamManagementV6Address')
 
 585                         def ipv4OamAddressElement = ''
 
 586                         def managementV6AddressElement = ''
 
 588                         if (oamManagementV4Address != null) {
 
 589                                 ipv4OamAddressElement = '<ipv4-oam-address>' + 'DELETE' + '</ipv4-oam-address>'
 
 592                         if (oamManagementV6Address != null) {
 
 593                                 managementV6AddressElement = '<management-v6-address>' + 'DELETE' + '</management-v6-address>'
 
 597                         String updateAAIGenericVnfRequest = """
 
 598                                         <UpdateAAIGenericVnfRequest>
 
 599                                                 <vnf-id>${vnfId}</vnf-id>
 
 600                                                 ${ipv4OamAddressElement}
 
 601                                                 ${managementV6AddressElement}
 
 602                                         </UpdateAAIGenericVnfRequest>
 
 604                                 updateAAIGenericVnfRequest = utils.formatXml(updateAAIGenericVnfRequest)
 
 605                                 execution.setVariable(Prefix + 'updateAAIGenericVnfRequest', updateAAIGenericVnfRequest)
 
 606                                 utils.logAudit("updateAAIGenericVnfRequest : " + updateAAIGenericVnfRequest)
 
 607                                 logDebug('Request for UpdateAAIGenericVnf:\n' + updateAAIGenericVnfRequest, isDebugLogEnabled)
 
 610                         logDebug('Exited ' + method, isDebugLogEnabled)
 
 611                 } catch (BpmnError e) {
 
 613                 } catch (Exception e) {
 
 614                         logError('Caught exception in ' + method, e)
 
 615                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in prepUpdateAAIGenericVnf(): ' + e.getMessage())