/*-
* ============LICENSE_START=======================================================
* OPENECOMP - MSO
* ================================================================================
* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END=========================================================
*/
package com.att.bpm.scripts;
import org.openecomp.mso.bpmn.core.WorkflowException
import org.openecomp.mso.bpmn.core.json.JsonUtils;
import org.openecomp.mso.rest.APIResponse
import org.openecomp.mso.rest.RESTClient
import org.openecomp.mso.rest.RESTConfig
import java.util.UUID;
import org.camunda.bpm.engine.delegate.BpmnError
import org.camunda.bpm.engine.runtime.Execution
import org.apache.commons.lang3.*
import org.apache.commons.codec.binary.Base64;
import org.springframework.web.util.UriUtils
import groovy.xml.XmlUtil
import groovy.json.*
public class DeleteNetworkInstanceInfra extends AbstractServiceTaskProcessor {
String Prefix="DELNWKI_"
ExceptionUtil exceptionUtil = new ExceptionUtil()
JsonUtils jsonUtil = new JsonUtils()
VidUtils vidUtils = new VidUtils(this)
public InitializeProcessVariables(Execution execution){
/* Initialize all the process variables in this block */
execution.setVariable("DELNWKI_DeleteNetworkInstanceInfraJsonRequest", "")
execution.setVariable("DELNWKI_networkRequest", "")
execution.setVariable("DELNWKI_networkRESTRequest", "")
execution.setVariable("DELNWKI_CompleteMsoProcessRequest", "")
execution.setVariable("DELNWKI_FalloutHandlerRequest", "")
execution.setVariable("DELNWKI_isSilentSuccess", false)
execution.setVariable("DELNWKI_Success", false)
execution.setVariable("DELNWKI_isPONR", false) // Point-of-no-return, means, rollback is not needed
execution.setVariable("DELNWKI_requestId", "")
execution.setVariable("DELNWKI_source", "")
execution.setVariable("DELNWKI_networkInputs", "")
execution.setVariable("DELNWKI_queryAAIRequest","")
execution.setVariable("DELNWKI_queryAAIResponse", "")
execution.setVariable("DELNWKI_aaiReturnCode", "")
execution.setVariable("DELNWKI_isAAIGood", false)
execution.setVariable("DELNWKI_isVfRelationshipExist", false)
// AAI query Cloud Region
execution.setVariable("DELNWKI_queryCloudRegionRequest","")
execution.setVariable("DELNWKI_queryCloudRegionReturnCode","")
execution.setVariable("DELNWKI_queryCloudRegionResponse","")
execution.setVariable("DELNWKI_cloudRegionPo","")
execution.setVariable("DELNWKI_cloudRegionSdnc","")
execution.setVariable("DELNWKI_deleteNetworkRequest", "")
execution.setVariable("DELNWKI_deleteNetworkResponse", "")
execution.setVariable("DELNWKI_networkReturnCode", "")
execution.setVariable("DELNWKI_deleteSDNCRequest", "")
execution.setVariable("DELNWKI_deleteSDNCResponse", "")
execution.setVariable("DELNWKI_rollbackSDNCRequest", "")
execution.setVariable("DELNWKI_rollbackSDNCResponse", "")
execution.setVariable("DELNWKI_sdncReturnCode", "")
execution.setVariable("DELNWKI_rollbackSDNCReturnCode", "")
execution.setVariable("DELNWKI_isSdncRollbackNeeded", false)
execution.setVariable("DELNWKI_sdncResponseSuccess", false)
}
// **************************************************
// Pre or Prepare Request Section
// **************************************************
public void preProcessRequest (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix",Prefix)
utils.log("DEBUG", " ***** Inside preProcessRequest() DeleteNetworkV2 Request ***** ", isDebugEnabled)
// initialize flow variables
InitializeProcessVariables(execution)
// get incoming message/input
String deleteNetworkJsonIncoming = execution.getVariable("bpmnRequest")
utils.logAudit(deleteNetworkJsonIncoming)
try {
def prettyJson = JsonOutput.prettyPrint(deleteNetworkJsonIncoming.toString())
utils.log("DEBUG", " Incoming message formatted . . . : " + '\n' + prettyJson, isDebugEnabled)
} catch (Exception ex) {
String dataErrorMessage = " Invalid json format Request - " + ex.getMessage()
utils.log("DEBUG", dataErrorMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
}
// prepare messageId
String messageId = execution.getVariable("DELNWKI_messageId") // test scenario
if (messageId == null || messageId == "") {
messageId = UUID.randomUUID()
utils.log("DEBUG", " DELNWKI_messageId, random generated: " + messageId, isDebugEnabled)
} else {
utils.log("DEBUG", " DELNWKI_messageId, pre-assigned: " + messageId, isDebugEnabled)
}
execution.setVariable("DELNWKI_messageId", messageId)
// PO Authorization Info / headers Authorization=
String basicAuthValuePO = execution.getVariable("URN_mso_adapters_po_auth")
utils.log("DEBUG", " Obtained BasicAuth userid password for PO/SDNC adapter: " + basicAuthValuePO, isDebugEnabled)
try {
def encodedString = utils.getBasicAuth(basicAuthValuePO, execution.getVariable("URN_mso_msoKey"))
execution.setVariable("BasicAuthHeaderValuePO",encodedString)
execution.setVariable("BasicAuthHeaderValueSDNC", encodedString)
} catch (IOException ex) {
String dataErrorMessage = " Unable to encode PO/SDNC user/password string - " + ex.getMessage()
utils.log("DEBUG", dataErrorMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
}
try {
execution.setVariable("DELNWKI_DeleteNetworkInstanceInfraJsonRequest", deleteNetworkJsonIncoming)
// recreate the xml network-request
String networkRequest = vidUtils.createXmlNetworkRequestInfra(execution, deleteNetworkJsonIncoming)
execution.setVariable("DELNWKI_networkRequest", networkRequest)
utils.log("DEBUG", " network-request - " + '\n' + networkRequest, isDebugEnabled)
String networkInputs = utils.getNodeXml(networkRequest, "network-inputs", false).replace("tag0:","").replace(":tag0","")
execution.setVariable("DELNWKI_networkInputs", networkInputs)
String requestId = execution.getVariable("att-mso-request-id")
if (requestId == null || requestId == "") {
requestId = utils.getNodeText(networkRequest, "request-id")
}
execution.setVariable("DELNWKI_requestId", requestId)
execution.setVariable("DELNWKI_source", utils.getNodeText(networkRequest, "source"))
String networkId = ""
if (utils.nodeExists(networkInputs, "network-id")) {
networkId = utils.getNodeText1(networkInputs, "network-id")
if (networkId == 'null' || networkId == "") {
sendSyncError(execution)
// missing value of network-name
String dataErrorMessage = "network-request has missing 'network-id' element/value."
utils.log("DEBUG", " Invalid Request - " + dataErrorMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
}
}
String lcpCloudRegion = ""
if (utils.nodeExists(networkInputs, "aic-cloud-region")) {
lcpCloudRegion = utils.getNodeText1(networkInputs, "aic-cloud-region")
if ((lcpCloudRegion == 'null') || (lcpCloudRegion == "")) {
sendSyncError(execution)
String dataErrorMessage = "network-request has missing 'aic-cloud-region' element/value."
utils.log("DEBUG", " Invalid Request - " + dataErrorMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
}
}
} catch (BpmnError e) {
throw e;
} catch (Exception ex){
// caught exception
String exceptionMessage = "Exception Encountered in DeleteNetworkInstanceInfra, PreProcessRequest() - " + ex.getMessage()
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
public void sendSyncResponse (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix",Prefix)
utils.log("DEBUG", " ***** Inside sendSyncResponse() of DeleteNetworkV2 ***** ", isDebugEnabled)
try {
String requestId = execution.getVariable("att-mso-request-id")
String serviceInstanceId = execution.getVariable("serviceInstanceId")
// RESTResponse (for API Handler (APIH) Reply Task)
String deleteNetworkRestRequest = """{"requestReferences":{"instanceId":"${serviceInstanceId}","requestId":"${requestId}"}}""".trim()
utils.log("DEBUG", " sendSyncResponse to APIH - " + "\n" + deleteNetworkRestRequest, isDebugEnabled)
sendWorkflowResponse(execution, 202, deleteNetworkRestRequest)
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Exception Encountered in DeleteNetworkInstanceInfra, sendSyncResponse() - " + ex.getMessage()
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
public void callRESTQueryAAI (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix",Prefix)
utils.log("DEBUG", " ***** Inside callRESTQueryAAI() of DeleteNetworkV2 ***** " , isDebugEnabled)
// get variables
String networkInputs = execution.getVariable("DELNWKI_networkInputs")
String networkId = utils.getNodeText(networkInputs, "network-id")
networkId = UriUtils.encode(networkId,"UTF-8")
String messageId = execution.getVariable("DELNWKI_messageId")
// Prepare AA&I url
String aai_endpoint = execution.getVariable("URN_aai_endpoint")
AaiUtil aaiUriUtil = new AaiUtil(this)
String aai_uri = aaiUriUtil.getNetworkL3NetworkUri(execution)
String queryAAIRequest = "${aai_endpoint}${aai_uri}/" + networkId
utils.logAudit(queryAAIRequest)
execution.setVariable("DELNWKI_queryAAIRequest", queryAAIRequest)
utils.log("DEBUG", " DELNWKI_AAIRequest - " + "\n" + queryAAIRequest, isDebugEnabled)
String basicAuthCred = utils.getBasicAuth(execution.getVariable("URN_aai_auth"),execution.getVariable("URN_mso_msoKey"))
RESTConfig config = new RESTConfig(queryAAIRequest);
ExceptionUtil exceptionUtil = new ExceptionUtil()
Boolean isVfRelationshipExist = false
try {
RESTClient client = new RESTClient(config).addHeader("X-TransactionId", messageId)
.addHeader("X-FromAppId", "MSO")
.addHeader("Content-Type", "application/xml")
.addHeader("Accept","application/xml");
if (basicAuthCred != null && !"".equals(basicAuthCred)) {
client.addAuthorizationHeader(basicAuthCred)
}
APIResponse response = client.get()
String returnCode = response.getStatusCode()
execution.setVariable("DELNWKI_aaiReturnCode", returnCode)
utils.log("DEBUG", " ***** AAI Response Code : " + returnCode, isDebugEnabled)
String aaiResponseAsString = response.getResponseBodyAsString()
aaiResponseAsString = StringEscapeUtils.unescapeXml(aaiResponseAsString)
execution.setVariable("DELNWKI_queryAAIResponse", aaiResponseAsString)
if (returnCode=='200' || returnCode=='204') {
utils.logAudit(aaiResponseAsString)
execution.setVariable("DELNWKI_isAAIGood", true)
utils.log("DEBUG", " AAI Query Success REST Response - " + "\n" + aaiResponseAsString, isDebugEnabled)
// verify if vf or vnf relationship exist
if (utils.nodeExists(aaiResponseAsString, "relationship")) {
NetworkUtils networkUtils = new NetworkUtils()
isVfRelationshipExist = networkUtils.isVfRelationshipExist(aaiResponseAsString)
execution.setVariable("DELNWKI_isVfRelationshipExist", isVfRelationshipExist)
if (isVfRelationshipExist == true) {
String relationshipMessage = "AAI Query Success Response but 'vf-module' relationship exist, not allowed to delete: network Id: " + networkId
exceptionUtil.buildWorkflowException(execution, 2500, relationshipMessage)
}
}
utils.log("DEBUG", " DELNWKI_isVfRelationshipExist - " + isVfRelationshipExist, isDebugEnabled)
} else {
execution.setVariable("DELNWKI_isAAIGood", false)
if (returnCode=='404' || aaiResponseAsString == "" || aaiResponseAsString == null) {
// not found // empty aai response
execution.setVariable("DELNWKI_isSilentSuccess", true)
utils.log("DEBUG", " AAI Query is Silent Success", isDebugEnabled)
} else {
if (aaiResponseAsString.contains("RESTFault")) {
WorkflowException exceptionObject = exceptionUtil.MapAAIExceptionToWorkflowException(aaiResponseAsString, execution)
execution.setVariable("WorkflowException", exceptionObject)
} else {
// aai all errors
String dataErrorMessage = "Unexpected Error Response from callRESTQueryAAI() - " + returnCode
utils.log("DEBUG", dataErrorMessage, isDebugEnabled)
exceptionUtil.buildWorkflowException(execution, 2500, dataErrorMessage)
}
}
}
utils.log("DEBUG", " AAI Query call, isAAIGood? : " + execution.getVariable("DELNWKI_isAAIGood"), isDebugEnabled)
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Exception Encountered in DeleteNetworkInstanceInfra, callRESTQueryAAI() - " + ex.getMessage()
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
public void callRESTQueryAAICloudRegion (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
utils.log("DEBUG", " ***** Inside callRESTQueryAAICloudRegion of DeleteNetworkV2 ***** " , isDebugEnabled)
try {
String networkInputs = execution.getVariable("DELNWKI_networkInputs")
String cloudRegion = utils.getNodeText(networkInputs, "aic-cloud-region")
cloudRegion = UriUtils.encode(cloudRegion,"UTF-8")
// Prepare AA&I url
String aai_endpoint = execution.getVariable("URN_aai_endpoint")
AaiUtil aaiUtil = new AaiUtil(this)
String aai_uri = aaiUtil.getCloudInfrastructureCloudRegionUri(execution)
String queryCloudRegionRequest = "${aai_endpoint}${aai_uri}/" + cloudRegion
utils.logAudit(queryCloudRegionRequest)
execution.setVariable("DELNWKI_queryCloudRegionRequest", queryCloudRegionRequest)
utils.log("DEBUG", " DELNWKI_queryCloudRegionRequest - " + "\n" + queryCloudRegionRequest, isDebugEnabled)
String cloudRegionPo = aaiUtil.getAAICloudReqion(execution, queryCloudRegionRequest, "PO", cloudRegion)
String cloudRegionSdnc = aaiUtil.getAAICloudReqion(execution, queryCloudRegionRequest, "SDNC", cloudRegion)
if ((cloudRegionPo != "ERROR") && (cloudRegionSdnc != "ERROR")) {
execution.setVariable("DELNWKI_cloudRegionPo", cloudRegionPo)
execution.setVariable("DELNWKI_cloudRegionSdnc", cloudRegionSdnc)
} else {
String dataErrorMessage = "QueryAAICloudRegion Unsuccessful. Return Code: " + execution.getVariable("DELNWKI_queryCloudRegionReturnCode")
utils.log("DEBUG", dataErrorMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
}
} catch (BpmnError e) {
throw e;
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, callRESTQueryAAICloudRegion(). Unexpected Response from AAI - " + ex.getMessage()
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
public void prepareNetworkRequest (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
utils.log("DEBUG", " ***** Inside prepareNetworkRequest of DeleteNetworkV2 ***** ", isDebugEnabled)
ExceptionUtil exceptionUtil = new ExceptionUtil()
try {
// get variables
String cloudSiteId = execution.getVariable("DELNWKI_cloudRegionPo")
String networkInputs = execution.getVariable("DELNWKI_networkInputs")
String tenantId = utils.getNodeText(networkInputs, "tenant-id")
String networkType = utils.getNodeText(networkInputs, "network-type")
String networkId = utils.getNodeText(networkInputs, "network-id")
String networkStackId = ""
networkStackId = utils.getNodeText1(execution.getVariable("DELNWKI_queryAAIResponse"), "heat-stack-id")
if (networkStackId == 'null' || networkStackId == "") {
networkStackId = "force_delete"
}
String requestId = execution.getVariable("DELNWKI_requestId")
String serviceInstanceId = execution.getVariable("serviceInstanceId")
// Added new Elements
String messageId = execution.getVariable("DELNWKI_messageId")
String notificationUrl = "" //TODO - is this coming from URN? What variable/value to use?
//String notificationUrl = execution.getVariable("URN_?????") //TODO - is this coming from URN? What variable/value to use?
String deleteNetworkRequest = """
${cloudSiteId}
${tenantId}
${networkId}
${networkStackId}
${networkType}
true
${requestId}
${serviceInstanceId}
${messageId}
${notificationUrl}
""".trim()
utils.log("DEBUG", " DELNWKI_deleteNetworkRequest - " + "\n" + deleteNetworkRequest, isDebugEnabled)
// Format Response
String buildDeleteNetworkRequestAsString = utils.formatXml(deleteNetworkRequest)
utils.logAudit(buildDeleteNetworkRequestAsString)
utils.log("DEBUG", " DELNWKI_deleteNetworkRequestAsString - " + "\n" + buildDeleteNetworkRequestAsString, isDebugEnabled)
String restURL = execution.getVariable("URN_mso_adapters_network_rest_endpoint")
execution.setVariable("URN_mso_adapters_network_rest_endpoint", restURL + "/" + networkId)
utils.log("DEBUG", "URN_mso_adapters_network_rest_endpoint - " + "\n" + restURL + "/" + networkId, isDebugEnabled)
execution.setVariable("DELNWKI_deleteNetworkRequest", buildDeleteNetworkRequestAsString)
utils.log("DEBUG", " DELNWKI_deleteNetworkRequest - " + "\n" + buildDeleteNetworkRequestAsString, isDebugEnabled)
}
catch (Exception ex) {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, prepareNetworkRequest(). Unexpected Response from AAI - " + ex.getMessage()
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
/**
* This method is used instead of an HTTP Connector task because the
* connector does not allow DELETE with a body.
*/
public void sendRequestToVnfAdapter(Execution execution) {
def method = getClass().getSimpleName() + '.sendRequestToVnfAdapter(' +
'execution=' + execution.getId() +
')'
def isDebugEnabled = execution.getVariable('isDebugLogEnabled')
logDebug('Entered ' + method, isDebugEnabled)
try {
String vnfAdapterUrl = execution.getVariable("URN_mso_adapters_network_rest_endpoint")
String vnfAdapterRequest = execution.getVariable("DELNWKI_deleteNetworkRequest")
RESTConfig config = new RESTConfig(vnfAdapterUrl)
RESTClient client = new RESTClient(config).
addHeader("Content-Type", "application/xml").
addAuthorizationHeader(execution.getVariable("BasicAuthHeaderValuePO"));
APIResponse response;
response = client.httpDelete(vnfAdapterRequest)
execution.setVariable("DELNWKI_networkReturnCode", response.getStatusCode())
execution.setVariable("DELNWKI_deleteNetworkResponse", response.getResponseBodyAsString())
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, sendRequestToVnfAdapter() - " + ex.getMessage()
logError(exceptionMessage)
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
public void prepareSDNCRequest (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
utils.log("DEBUG", " ***** Inside prepareSDNCRequest of DeleteNetworkV2 ***** ", isDebugEnabled)
try {
// get variables
String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
String deleteNetworkInput = execution.getVariable("DELNWKI_networkRequest")
String networkId = ""
if (utils.nodeExists(deleteNetworkInput, "network-id")) {
networkId = utils.getNodeText1(deleteNetworkInput, "network-id")
}
if (networkId == 'null') {networkId = ""}
String serviceInstanceId = utils.getNodeText1(deleteNetworkInput, "service-instance-id")
SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
String cloudRegionId = execution.getVariable("DELNWKI_cloudRegionSdnc")
// 1. prepare delete topology via SDNC Adapter SUBFLOW call
String sndcTopologyDeleteRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, deleteNetworkInput, serviceInstanceId, sdncCallback, "delete", "DisconnectNetworkRequest", cloudRegionId, networkId, null)
String sndcTopologyDeleteRequesAsString = utils.formatXml(sndcTopologyDeleteRequest)
utils.logAudit(sndcTopologyDeleteRequesAsString)
execution.setVariable("DELNWKI_deleteSDNCRequest", sndcTopologyDeleteRequesAsString)
utils.log("DEBUG", " DELNWKI_deleteSDNCRequest - " + "\n" + sndcTopologyDeleteRequesAsString, isDebugEnabled)
// 2. prepare rollback topology via SDNC Adapter SUBFLOW call
String sndcTopologyRollbackRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, deleteNetworkInput, serviceInstanceId, sdncCallback, "rollback", "DisconnectNetworkRequest", cloudRegionId, networkId, null)
String sndcTopologyRollbackRequestAsString = utils.formatXml(sndcTopologyRollbackRequest)
execution.setVariable("DELNWKI_rollbackSDNCRequest", sndcTopologyRollbackRequestAsString)
utils.log("DEBUG", " DELNWKI_rollbackSDNCRequest (prepared if NEEDED later for SDNC Topology delete's rollback/compensation . . . - " + "\n" + sndcTopologyRollbackRequestAsString, isDebugEnabled)
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, prepareSDNCRequest() - " + ex.getMessage()
logError(exceptionMessage)
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
public void prepareDBRequest (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
try {
utils.log("DEBUG", " ***** Inside prepareDBRequest of DeleteNetworkV2 ***** ", isDebugEnabled)
String aaiReturnCode = execution.getVariable("DELNWKI_aaiReturnCode")
String requestId = execution.getVariable("DELNWKI_requestId")
String statusMessage = ""
if (aaiReturnCode == '404' || execution.getVariable("DELNWKI_isSilentSuccess") == true) {
// SILENT SUCCESS
statusMessage = "Network Id to be deleted NOT found. Silent success."
} else {
statusMessage = "Network successfully deleted."
}
String dbRequest =
"""
${requestId}
BPMN
${statusMessage}
COMPLETED
<network-outputs xmlns="http://ecomp.att.com/mso/infra/vnf-request/v1" xmlns:aetgt="http://ecomp.att.com/mso/infra/vnf-request/v1" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd"/>
"""
String buildDeleteDBRequestAsString = utils.formatXml(dbRequest)
utils.logAudit(buildDeleteDBRequestAsString)
execution.setVariable("DELNWKI_deleteDBRequest", buildDeleteDBRequestAsString)
utils.log("DEBUG", " DB Adapter Request - " + "\n" + buildDeleteDBRequestAsString, isDebugEnabled)
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, prepareDBRequest() - " + ex.getMessage()
logError(exceptionMessage)
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
public void prepareDBRequestError (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
try {
utils.log("DEBUG", " ***** Inside prepareDBRequestError of DeleteNetworkV2 ***** ", isDebugEnabled)
WorkflowException wfe = execution.getVariable("WorkflowException")
String statusMessage = wfe.getErrorMessage()
String requestId = execution.getVariable("DELNWKI_requestId")
String dbRequest =
"""
${requestId}
BPMN
${statusMessage}
FAILED
<network-outputs xmlns="http://ecomp.att.com/mso/infra/vnf-request/v1" xmlns:aetgt="http://ecomp.att.com/mso/infra/vnf-request/v1" xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd"/>
"""
execution.setVariable("DELNWKI_deleteDBRequest", dbRequest)
utils.log("DEBUG", " DB Adapter Request - " + "\n" + dbRequest, isDebugEnabled)
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, prepareDBRequestError() - " + ex.getMessage()
logError(exceptionMessage)
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage)
}
}
// **************************************************
// Post or Validate Response Section
// **************************************************
public void validateNetworkResponse (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
utils.log("DEBUG", " ***** Inside validateNetworkResponse of DeleteNetworkV2 *****", isDebugEnabled)
try {
String returnCode = execution.getVariable("DELNWKI_networkReturnCode")
String networkResponse = execution.getVariable("DELNWKI_deleteNetworkResponse")
utils.log("DEBUG", " Network Adapter responseCode: " + returnCode, isDebugEnabled)
utils.log("DEBUG", "Network Adapter Error Response - " + "\n" + networkResponse, isDebugEnabled)
String errorMessage = ""
if (returnCode == "200") {
utils.logAudit(networkResponse)
execution.setVariable("DELNWKI_deleteNetworkResponse", networkResponse)
utils.log("DEBUG", " Network Adapter Success Response - " + "\n" + networkResponse, isDebugEnabled)
} else { // network error
if (returnCode.toInteger() > 399 && returnCode.toInteger() < 600) { //4xx, 5xx
if (networkResponse.contains("deleteNetworkError") ) {
networkResponse = networkResponse.replace('', '')
errorMessage = utils.getNodeText1(networkResponse, "message")
errorMessage = "Received error from Network Adapter: " + errorMessage
exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
} else { // CatchAll exception
if (returnCode == "500") {
errorMessage = "JBWEB000065: HTTP Status 500."
} else {
errorMessage = "Return code is " + returnCode
}
errorMessage = "Received error from Network Adapter: " + errorMessage
exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMessage)
}
} else { // CatchAll exception
String dataErrorMessage = "Received error from Network Adapter. Return code is: " + returnCode
exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
}
}
} catch (BpmnError e) {
throw e;
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, validateNetworkResponse() - " + ex.getMessage()
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
public void validateSDNCResponse (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
utils.log("DEBUG", " ***** Inside validateSDNCResponse of DeleteNetworkV2 ***** ", isDebugEnabled)
String response = execution.getVariable("DELNWKI_deleteSDNCResponse")
WorkflowException workflowException = execution.getVariable("WorkflowException")
boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils(this)
sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
// reset variable
String deleteSDNCResponseDecodeXml = sdncAdapterUtils.decodeXML(execution.getVariable("DELNWKI_deleteSDNCResponse"))
deleteSDNCResponseDecodeXml = deleteSDNCResponseDecodeXml.replace("&", "&").replace('', "")
execution.setVariable("DELNWKI_deleteSDNCResponse", deleteSDNCResponseDecodeXml)
if (execution.getVariable("DELNWKI_sdncResponseSuccess") == true) { // from sdnc util, prefix+'sdncResponseSuccess'
execution.setVariable("DELNWKI_isSdncRollbackNeeded", true) //
execution.setVariable("DELNWKI_isPONR", true)
utils.log("DEBUG", "Successfully Validated SDNC Response", isDebugEnabled)
} else {
utils.log("DEBUG", "Did NOT Successfully Validated SDNC Response", isDebugEnabled)
throw new BpmnError("MSOWorkflowException")
}
}
public void postProcessResponse (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
utils.log("DEBUG", " ***** Inside postProcessResponse of DeleteNetworkV2 ***** ", isDebugEnabled)
try {
// Display DB response: DELNWKI_deleteDBResponse / DELNWKI_dbReturnCode
String dbReturnCode = execution.getVariable("DELNWKI_dbReturnCode")
utils.log("DEBUG", " ***** DB Update Response Code : " + dbReturnCode, isDebugEnabled)
utils.log("DEBUG", " ***** DB Update Response String: " + '\n' + execution.getVariable("DELNWKI_deleteDBResponse"), isDebugEnabled)
if (dbReturnCode == '200') {
String source = execution.getVariable("DELNWKI_source")
String requestId = execution.getVariable("DELNWKI_requestId")
String msoCompletionRequest =
"""
${requestId}
DELETE
${source}
Network has been deleted successfully.
BPMN Network action: DELETE
"""
// Format Response
String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
utils.logAudit(xmlMsoCompletionRequest)
execution.setVariable("DELNWKI_CompleteMsoProcessRequest", xmlMsoCompletionRequest)
execution.setVariable("DELNWKI_Success", true)
if (execution.getVariable("DELNWKI_isSilentSuccess") == false) {
utils.log("DEBUG", " Overall SUCCESS Response going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugEnabled)
} else {
utils.log("DEBUG", " Silent SUCCESS going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugEnabled)
}
} else {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, DB Update Failed: " + dbReturnCode
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 2500, exceptionMessage)
}
} catch (BpmnError e) {
throw e;
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, postProcessResponse() - " + ex.getMessage()
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
}
}
// *******************************
// Build Error Section
// *******************************
// Prepare for FalloutHandler
public void buildErrorResponse (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
utils.log("DEBUG", " ***** Prepare for FalloutHandler. FAILURE - prepare request for sub-process FalloutHandler. *****", isDebugEnabled)
String dbReturnCode = execution.getVariable("DELNWKI_dbReturnCode")
utils.log("DEBUG", " ***** DB Update Response Code : " + dbReturnCode, isDebugEnabled)
utils.log("DEBUG", " ***** DB Update Response String: " + '\n' + execution.getVariable("DELNWKI_deleteDBResponse"), isDebugEnabled)
String falloutHandlerRequest = ""
String workflowException = ""
String requestId = execution.getVariable("DELNWKI_requestId")
String source = execution.getVariable("DELNWKI_source")
execution.setVariable("DELNWKI_Success", false)
try {
WorkflowException wfe = execution.getVariable("WorkflowException")
String errorCode = String.valueOf(wfe.getErrorCode())
String errorMessage = wfe.getErrorMessage()
falloutHandlerRequest =
"""
${requestId}
DELETE
${source}
${errorMessage}
${errorCode}
"""
utils.logAudit(falloutHandlerRequest)
execution.setVariable("DELNWKI_FalloutHandlerRequest", falloutHandlerRequest)
utils.log("ERROR", " Overall Error Response going to FalloutHandler: " + "\n" + falloutHandlerRequest, isDebugEnabled)
} catch (Exception ex) {
// caught exception
String exceptionMessage = "Bpmn error encountered in DeleteNetworkInstanceInfra, buildErrorResponse() - " + ex.getMessage()
utils.log("DEBUG", exceptionMessage, isDebugEnabled)
falloutHandlerRequest =
"""
${requestId}
CREATE
${source}
${exceptionMessage}
9999
"""
execution.setVariable("DELNWKI_FalloutHandlerRequest", falloutHandlerRequest)
utils.log("DEBUG", " Overall Error Response going to FalloutHandler: " + "\n" + falloutHandlerRequest, isDebugEnabled)
}
}
public void sendSyncError (Execution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix", Prefix)
try {
String requestId = execution.getVariable("att-mso-request-id")
String serviceInstanceId = execution.getVariable("serviceInstanceId")
// RESTResponse (for API Handler (APIH) Reply Task)
String deleteNetworkRestError = """{"requestReferences":{"instanceId":"${serviceInstanceId}","requestId":"${requestId}"}}""".trim()
utils.log("DEBUG", " sendSyncResponse to APIH - " + "\n" + deleteNetworkRestError, isDebugEnabled)
sendWorkflowResponse(execution, 500, deleteNetworkRestError)
} catch (Exception ex) {
utils.log("DEBUG", " Sending Sync Error Activity Failed - DeleteNetworkInstanceInfra, sendSyncError(): " + "\n" + ex.getMessage(), isDebugEnabled)
}
}
public void processJavaException(Execution execution){
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
execution.setVariable("prefix",Prefix)
try{
utils.log("DEBUG", "Caught a Java Exception", isDebugEnabled)
utils.log("DEBUG", "Started processJavaException Method", isDebugEnabled)
utils.log("DEBUG", "Variables List: " + execution.getVariables(), isDebugEnabled)
execution.setVariable("UnexpectedError", "Caught a Java Lang Exception") // Adding this line temporarily until this flows error handling gets updated
exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Caught a Java Lang Exception")
}catch(BpmnError b){
utils.log("ERROR", "Rethrowing MSOWorkflowException", isDebugEnabled)
throw b
}catch(Exception e){
utils.log("DEBUG", "Caught Exception during processJavaException Method: " + e, isDebugEnabled)
execution.setVariable("UnexpectedError", "Exception in processJavaException method") // Adding this line temporarily until this flows error handling gets updated
exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Exception in processJavaException method")
}
utils.log("DEBUG", "Completed processJavaException Method", isDebugEnabled)
}
}