/*- * ============LICENSE_START======================================================= * ONAP - SO * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Modifications Copyright (c) 2019 Samsung * ================================================================================ * 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 org.onap.so.bpmn.infrastructure.scripts; import javax.ws.rs.core.UriBuilder import javax.xml.parsers.DocumentBuilder import javax.xml.parsers.DocumentBuilderFactory import org.apache.commons.lang3.* import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution import org.onap.so.bpmn.common.scripts.AaiUtil import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor import org.onap.so.bpmn.common.scripts.ExceptionUtil import org.onap.so.bpmn.common.scripts.MsoUtils import org.onap.so.bpmn.common.scripts.NetworkUtils import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils import org.onap.so.bpmn.common.scripts.VidUtils import org.onap.so.bpmn.core.UrnPropertiesReader import org.onap.so.bpmn.core.WorkflowException import org.onap.so.bpmn.core.json.JsonUtils import org.onap.so.client.aai.AAIObjectType import org.onap.so.client.aai.AAIResourcesClient import org.onap.so.client.aai.entities.uri.AAIResourceUri import org.onap.so.client.aai.entities.uri.AAIUriFactory import org.onap.so.client.aai.entities.AAIResultWrapper import org.onap.so.client.graphinventory.entities.uri.Depth import org.onap.so.constants.Defaults import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.web.util.UriUtils import org.w3c.dom.Document import org.w3c.dom.Element import org.w3c.dom.NamedNodeMap import org.w3c.dom.Node import org.w3c.dom.NodeList; import org.xml.sax.InputSource import org.onap.aai.domain.yang.VpnBinding import org.onap.aai.domain.yang.L3Network import org.onap.aai.domain.yang.NetworkPolicy import org.onap.aai.domain.yang.RouteTableReference import org.onap.aai.domain.yang.RouteTarget import org.onap.aai.domain.yang.Subnet import javax.ws.rs.NotFoundException import groovy.json.* import groovy.xml.XmlUtil /** * This groovy class supports the DoUpdateNetworkInstance.bpmn process. * */ public class DoUpdateNetworkInstance extends AbstractServiceTaskProcessor { private static final Logger logger = LoggerFactory.getLogger( DoUpdateNetworkInstance.class); String Prefix="UPDNETI_" ExceptionUtil exceptionUtil = new ExceptionUtil() JsonUtils jsonUtil = new JsonUtils() VidUtils vidUtils = new VidUtils(this) NetworkUtils networkUtils = new NetworkUtils() SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils() /** * This method is executed during the preProcessRequest task of the DoUpdateNetworkInstance.bpmn process. * @param execution */ public InitializeProcessVariables(DelegateExecution execution){ /* Initialize all the process variables in this block */ execution.setVariable(Prefix + "messageId", "") execution.setVariable("BasicAuthHeaderValuePO", "") execution.setVariable("BasicAuthHeaderValueSDNC", "") execution.setVariable(Prefix + "networkRequest", "") execution.setVariable(Prefix + "networkInputs", "") execution.setVariable(Prefix + "networkOutputs", "") execution.setVariable(Prefix + "requestId", "") execution.setVariable(Prefix + "source", "") execution.setVariable(Prefix + "networkId", "") execution.setVariable(Prefix + "isPONR", false) // Point-of-no-return, means, rollback is not needed // AAI query Cloud Region execution.setVariable(Prefix + "queryCloudRegionRequest","") execution.setVariable(Prefix + "queryCloudRegionReturnCode","") execution.setVariable(Prefix + "queryCloudRegionResponse","") execution.setVariable(Prefix + "cloudRegionPo","") execution.setVariable(Prefix + "cloudRegionSdnc","") execution.setVariable(Prefix + "isCloudRegionGood", false) // AAI query Id execution.setVariable(Prefix + "queryIdAAIRequest","") execution.setVariable(Prefix + "queryIdAAIResponse", "") execution.setVariable(Prefix + "aaiIdReturnCode", "") // AAI query vpn binding execution.setVariable(Prefix + "queryVpnBindingAAIRequest","") execution.setVariable(Prefix + "queryVpnBindingAAIResponse", "") execution.setVariable(Prefix + "aaiQqueryVpnBindingReturnCode", "") execution.setVariable(Prefix + "vpnBindings", null) execution.setVariable(Prefix + "vpnCount", 0) execution.setVariable(Prefix + "routeCollection", "") // AAI query network policy execution.setVariable(Prefix + "queryNetworkPolicyAAIRequest","") execution.setVariable(Prefix + "queryNetworkPolicyAAIResponse", "") execution.setVariable(Prefix + "aaiQqueryNetworkPolicyReturnCode", "") execution.setVariable(Prefix + "networkPolicyUriList", null) execution.setVariable(Prefix + "networkPolicyCount", 0) execution.setVariable(Prefix + "networkCollection", "") // AAI query route table reference execution.setVariable(Prefix + "queryNetworkTableRefAAIRequest","") execution.setVariable(Prefix + "queryNetworkTableRefAAIResponse", "") execution.setVariable(Prefix + "aaiQqueryNetworkTableRefReturnCode", "") execution.setVariable(Prefix + "networkTableRefUriList", null) execution.setVariable(Prefix + "networkTableRefCount", 0) execution.setVariable(Prefix + "tableRefCollection", "") // AAI requery Id execution.setVariable(Prefix + "requeryIdAAIRequest","") execution.setVariable(Prefix + "requeryIdAAIResponse", "") execution.setVariable(Prefix + "aaiRequeryIdReturnCode", "") // AAI update contrail execution.setVariable(Prefix + "updateContrailAAIUrlRequest","") execution.setVariable(Prefix + "updateContrailAAIPayloadRequest","") execution.setVariable(Prefix + "updateContrailAAIResponse", "") execution.setVariable(Prefix + "aaiUpdateContrailReturnCode", "") execution.setVariable(Prefix + "updateNetworkRequest", "") execution.setVariable(Prefix + "updateNetworkResponse", "") execution.setVariable(Prefix + "rollbackNetworkRequest", "") execution.setVariable(Prefix + "networkReturnCode", "") execution.setVariable(Prefix + "isNetworkRollbackNeeded", false) execution.setVariable(Prefix + "changeAssignSDNCRequest", "") execution.setVariable(Prefix + "changeAssignSDNCResponse", "") execution.setVariable(Prefix + "rollbackSDNCRequest", "") execution.setVariable(Prefix + "sdncReturnCode", "") execution.setVariable(Prefix + "isSdncRollbackNeeded", false) execution.setVariable(Prefix + "sdncResponseSuccess", false) execution.setVariable(Prefix + "isVnfBindingPresent", false) execution.setVariable(Prefix + "Success", false) execution.setVariable(Prefix + "serviceInstanceId", "") execution.setVariable(Prefix + "isException", false) } // ************************************************** // Pre or Prepare Request Section // ************************************************** /** * This method is executed during the preProcessRequest task of the DoUpdateNetworkInstance.bpmn process. * @param execution */ public void preProcessRequest (DelegateExecution execution) { execution.setVariable("prefix",Prefix) logger.trace("Inside preProcessRequest DoUpdateNetworkInstance Request ") try { // initialize flow variables InitializeProcessVariables(execution) // GET Incoming request & validate 3 kinds of format. execution.setVariable("action", "UPDATE") String networkRequest = execution.getVariable("bpmnRequest") if (networkRequest != null) { if (networkRequest.contains("requestDetails")) { // JSON format request is sent, create xml try { def prettyJson = JsonOutput.prettyPrint(networkRequest.toString()) logger.debug(" Incoming message formatted . . . : " + '\n' + prettyJson) networkRequest = vidUtils.createXmlNetworkRequestInfra(execution, networkRequest) } catch (Exception ex) { String dataErrorMessage = " Invalid json format Request - " + ex.getMessage() logger.debug(dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } } else { // XML format request is sent } } else { // vIPR format request is sent, create xml from individual variables networkRequest = vidUtils.createXmlNetworkRequestInstance(execution) } networkRequest = utils.formatXml(networkRequest) logger.debug(networkRequest) execution.setVariable(Prefix + "networkRequest", networkRequest) logger.debug(" network-request - " + '\n' + networkRequest) // validate 'disableRollback' (aka, 'suppressRollback') boolean rollbackEnabled = networkUtils.isRollbackEnabled(execution, networkRequest) execution.setVariable(Prefix + "rollbackEnabled", rollbackEnabled) logger.debug(Prefix + "rollbackEnabled - " + rollbackEnabled) String networkInputs = utils.getNodeXml(networkRequest, "network-inputs", false).replace("tag0:","").replace(":tag0","") execution.setVariable(Prefix + "networkInputs", networkInputs) logger.debug(Prefix + "networkInputs - " + '\n' + networkInputs) // prepare messageId String messageId = execution.getVariable(Prefix + "messageId") // for testing if (messageId == null || messageId == "") { messageId = UUID.randomUUID() logger.debug(" UPDNETI_messageId, random generated: " + messageId) } else { logger.debug(" UPDNETI_messageId, pre-assigned: " + messageId) } execution.setVariable(Prefix + "messageId", messageId) String source = utils.getNodeText(networkRequest, "source") execution.setVariable(Prefix + "source", source) logger.debug(Prefix + "source - " + source) String networkId = "" if (utils.nodeExists(networkRequest, "network-id")) { networkId = utils.getNodeText(networkRequest, "network-id") if (networkId == 'null' || networkId == "") { sendSyncError(execution) // missing value of networkId String dataErrorMessage = "Variable 'network-id' value/element is missing." logger.debug(" Invalid Request - " + dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } } String lcpCloudRegion = "" if (utils.nodeExists(networkRequest, "aic-cloud-region")) { lcpCloudRegion = utils.getNodeText(networkRequest, "aic-cloud-region") if ((lcpCloudRegion == 'null') || (lcpCloudRegion == "")) { sendSyncError(execution) String dataErrorMessage = "requestDetails has missing 'aic-cloud-region' value/element." logger.debug(" Invalid Request - " + dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } } String serviceInstanceId = "" if (utils.nodeExists(networkRequest, "service-instance-id")) { serviceInstanceId = utils.getNodeText(networkRequest, "service-instance-id") if ((serviceInstanceId == 'null') || (lcpCloudRegion == "")) { sendSyncError(execution) String dataErrorMessage = "Variable 'serviceInstanceId' value/element is missing." logger.debug(" Invalid Request - " + dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } } // PO Authorization Info / headers Authorization= String basicAuthValuePO = UrnPropertiesReader.getVariable("mso.adapters.po.auth",execution) try { def encodedString = utils.getBasicAuth(basicAuthValuePO, UrnPropertiesReader.getVariable("mso.msoKey", execution)) execution.setVariable("BasicAuthHeaderValuePO",encodedString) execution.setVariable("BasicAuthHeaderValueSDNC", encodedString) } catch (IOException ex) { String exceptionMessage = "Exception Encountered in DoUpdateNetworkInstance, PreProcessRequest() - " String dataErrorMessage = exceptionMessage + " Unable to encode PO/SDNC user/password string - " + ex.getMessage() logger.debug(dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } // Set variables for Generic Get Sub Flow use execution.setVariable(Prefix + "serviceInstanceId", serviceInstanceId) logger.debug(Prefix + "serviceInstanceId - " + serviceInstanceId) logger.debug(" Url for SDNC adapter: " + UrnPropertiesReader.getVariable("mso.adapters.sdnc.endpoint",execution)) String sdncVersion = execution.getVariable("sdncVersion") logger.debug("sdncVersion? : " + sdncVersion) // build 'networkOutputs' networkId = utils.getNodeText(networkRequest, "network-id") if ((networkId == null) || (networkId == "null")) { networkId = "" } String networkName = utils.getNodeText(networkRequest, "network-name") if ((networkName == null) || (networkName == "null")) { networkName = "" } String networkOutputs = """ ${MsoUtils.xmlEscape(networkId)} ${MsoUtils.xmlEscape(networkName)} """ execution.setVariable(Prefix + "networkOutputs", networkOutputs) logger.debug(Prefix + "networkOutputs - " + '\n' + networkOutputs) execution.setVariable(Prefix + "networkId", networkId) execution.setVariable(Prefix + "networkName", networkName) } catch (BpmnError e) { throw e; } catch (Exception ex){ sendSyncError(execution) // caught exception String exceptionMessage = "Exception Encountered in DoUpdateNetworkInstance, PreProcessRequest() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } /** * Gets the service instance uri from aai * */ public void getServiceInstance(DelegateExecution execution) { logger.trace("getServiceInstance ") try { String serviceInstanceId = execution.getVariable('serviceInstanceId') AAIResourcesClient resourceClient = new AAIResourcesClient() AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId) if(!resourceClient.exists(uri)){ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Service Instance not found in aai") }else{ Map keys = uri.getURIKeys() execution.setVariable("serviceType", keys.get("service-type")) execution.setVariable("subscriberName", keys.get("global-customer-id")) } }catch(BpmnError e) { throw e; }catch (Exception ex){ String msg = "Exception in getServiceInstance. " + ex.getMessage() logger.debug(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) } } public void callRESTQueryAAICloudRegion (DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.debug(" ***** Inside callRESTQueryAAICloudRegion of DoUpdateNetworkInstance ***** " ) try { String networkInputs = execution.getVariable(Prefix + "networkInputs") String cloudRegion = utils.getNodeText(networkInputs, "aic-cloud-region") // Prepare AA&I url String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution) AaiUtil aaiUtil = new AaiUtil(this) AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, Defaults.CLOUD_OWNER.toString(), cloudRegion) def queryCloudRegionRequest = aaiUtil.createAaiUri(uri) execution.setVariable(Prefix + "queryCloudRegionRequest", queryCloudRegionRequest) String cloudRegionPo = aaiUtil.getAAICloudReqion(execution, queryCloudRegionRequest, "PO", cloudRegion) String cloudRegionSdnc = aaiUtil.getAAICloudReqion(execution, queryCloudRegionRequest, "SDNC", cloudRegion) if ((cloudRegionPo != "ERROR") && (cloudRegionSdnc != "ERROR")) { execution.setVariable(Prefix + "cloudRegionPo", cloudRegionPo) execution.setVariable(Prefix + "cloudRegionSdnc", cloudRegionSdnc) execution.setVariable(Prefix + "isCloudRegionGood", true) } else { String dataErrorMessage = "QueryAAICloudRegion Unsuccessful. Return Code: " + execution.getVariable(Prefix + "queryCloudRegionReturnCode") logger.debug(dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } logger.debug(" is Cloud Region Good: " + execution.getVariable(Prefix + "isCloudRegionGood")) } catch (BpmnError e) { throw e; } catch (Exception ex) { // try error String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow - callRESTQueryAAICloudRegion() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void callRESTQueryAAINetworkId(DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.debug(" ***** Inside callRESTQueryAAINetworkId of DoUpdateNetworkInstance ***** " ) try { // get variables String networkRequest = execution.getVariable(Prefix + "networkRequest") String networkId = utils.getNodeText(networkRequest, "network-id") execution.setVariable(Prefix + "networkId", networkId) AAIResourcesClient client = new AAIResourcesClient() AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, networkId).depth(Depth.ONE) AAIResultWrapper network = client.get(uri, NotFoundException.class) execution.setVariable(Prefix + "aaiIdReturnCode", "200") execution.setVariable(Prefix + "queryIdAAIResponse", network) } catch (NotFoundException e) { String dataErrorMessage = "Response Error from QueryAAINetworkId is 404 (Not Found)." logger.debug(" AAI Query Failed. " + dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } catch (Exception ex) { String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTQueryAAINetworkId() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void callRESTReQueryAAINetworkId(DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.debug(" ***** Inside callRESTReQueryAAINetworkId of DoUpdateNetworkInstance ***** " ) try { // get variables String networkRequest = execution.getVariable(Prefix + "networkRequest") String networkId = utils.getNodeText(networkRequest, "network-id") AAIResourcesClient client = new AAIResourcesClient() AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, networkId).depth(Depth.ONE) AAIResultWrapper network = client.get(uri, NotFoundException.class) execution.setVariable(Prefix + "aaiRequeryIdReturnCode", "200") execution.setVariable(Prefix + "requeryIdAAIResponse", network) L3Network net = network.asBean(L3Network.class).get() String netId = net.getNetworkId() String netName = net.getNetworkName() String networkOutputs = """ ${MsoUtils.xmlEscape(netId)} ${MsoUtils.xmlEscape(netName)} """ execution.setVariable(Prefix + "networkOutputs", networkOutputs) logger.debug(" networkOutputs - " + '\n' + networkOutputs) } catch (NotFoundException e) { String dataErrorMessage = "Response Error from ReQueryAAINetworkId is 404 (Not Found)." logger.debug(" AAI ReQuery Failed. - " + dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } catch (Exception ex) { String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTReQueryAAINetworkId() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void callRESTQueryAAINetworkVpnBinding(DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.debug(" ***** Inside callRESTQueryAAINetworkVpnBinding of DoUpdateNetworkInstance ***** " ) try { // get variables AAIResultWrapper queryIdAAIResponse = execution.getVariable(Prefix + "requeryIdAAIResponse") if(queryIdAAIResponse.getRelationships().isPresent()){ List uris = queryIdAAIResponse.getRelationships().get().getRelatedAAIUris(AAIObjectType.VPN_BINDING) logger.debug(Prefix + "vpnCount - " + uris.size()) if (uris.size() > 0) { String routeTargets = "" for(AAIResourceUri u : uris) { AAIResourcesClient client = new AAIResourcesClient() AAIResultWrapper wrapper = client.get(u.depth(Depth.TWO), NotFoundException.class) Optional binding = wrapper.asBean(VpnBinding.class) String routeTarget = "" String routeRole = "" if(binding.get().getRouteTargets() != null) { List targets = binding.get().getRouteTargets().getRouteTarget() for(RouteTarget target : targets) { routeTarget = target.getGlobalRouteTarget() routeRole = target.getRouteTargetRole() routeTargets += "" + '\n' + " " + routeTarget + "" + '\n' + " " + routeRole + "" + '\n' + "" + '\n' } } } // end loop execution.setVariable(Prefix + "routeCollection", routeTargets) logger.debug(" UPDNETI_routeCollection - " + '\n' + routeTargets) } else { // reset return code to success execution.setVariable(Prefix + "aaiQqueryVpnBindingReturnCode", "200") AaiUtil aaiUriUtil = new AaiUtil(this) String schemaVersion = aaiUriUtil.getNamespace() String aaiStubResponse = """ """ String aaiStubResponseAsXml = utils.formatXml(aaiStubResponse) execution.setVariable(Prefix + "queryVpnBindingAAIResponse", aaiStubResponseAsXml) execution.setVariable(Prefix + "routeCollection", "") logger.debug(" No vpnBinding, using this stub as response - " + '\n' + aaiStubResponseAsXml) } } } catch (NotFoundException e) { logger.debug("Response Error from AAINetworkVpnBinding is 404 (Not Found).") exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Response Error from AAINetworkVpnBinding is 404 (Not Found).") } catch (Exception ex) { String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTQueryAAINetworkVpnBinding() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void callRESTQueryAAINetworkPolicy(DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.debug(" ***** Inside callRESTQueryAAINetworkPolicy of DoUpdateNetworkInstance ***** " ) try { // get variables AAIResultWrapper queryIdAAIResponse = execution.getVariable(Prefix + "requeryIdAAIResponse") if(queryIdAAIResponse.getRelationships().isPresent()){ List uris = queryIdAAIResponse.getRelationships().get().getRelatedAAIUris(AAIObjectType.NETWORK_POLICY) execution.setVariable(Prefix + "networkPolicyCount", uris.size()) logger.debug(Prefix + "networkPolicyCount - " + uris.size()) if (uris.size() > 0) { String networkPolicies = "" // AII loop call using list vpnBindings for(AAIResourceUri u : uris) { AAIResourcesClient client = new AAIResourcesClient() NetworkPolicy p = client.get(u, NotFoundException.class).asBean(NetworkPolicy.class).get() execution.setVariable(Prefix + "aaiQqueryNetworkPolicyReturnCode", "200") String networkPolicy = p.getNetworkPolicyFqdn() networkPolicies += "" + networkPolicy + "" + '\n' } // end loop execution.setVariable(Prefix + "networkCollection", networkPolicies) logger.debug(" UPDNETI_networkCollection - " + '\n' + networkPolicies) } else { // reset return code to success execution.setVariable(Prefix + "aaiQqueryNetworkPolicyReturnCode", "200") AaiUtil aaiUriUtil = new AaiUtil(this) String schemaVersion = aaiUriUtil.getNamespace() String aaiStubResponse = """ """ String aaiStubResponseAsXml = utils.formatXml(aaiStubResponse) execution.setVariable(Prefix + "queryNetworkPolicyAAIResponse", aaiStubResponseAsXml) execution.setVariable(Prefix + "networkCollection", "") logger.debug(" No net policies, using this stub as response - " + '\n' + aaiStubResponseAsXml) } } } catch (NotFoundException e) { String dataErrorMessage = "Response Error from QueryAAINetworkPolicy is 404 (Not Found)." logger.debug(dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } catch (Exception ex) { String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTQueryAAINetworkPolicy() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void callRESTQueryAAINetworkTableRef(DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.debug(" ***** Inside callRESTQueryAAINetworkTableRef of DoUpdateNetworkInstance ***** " ) try { AAIResultWrapper queryIdAAIResponse = execution.getVariable(Prefix + "requeryIdAAIResponse") if(queryIdAAIResponse.getRelationships().isPresent()){ List uris = queryIdAAIResponse.getRelationships().get().getRelatedAAIUris(AAIObjectType.ROUTE_TABLE_REFERENCE) execution.setVariable(Prefix + "networkTableRefCount", uris.size()) logger.debug(Prefix + "networkTableRefCount - " + uris.size()) logger.debug(" UPDNETI_networkTableRefCount - " + uris.size()) if (uris.size() > 0) { execution.setVariable(Prefix + "aaiQqueryNetworkTableRefReturnCode", "200") // AII loop call using list vpnBindings String networkTableRefs = "" for(AAIResourceUri u : uris) { AAIResourcesClient client = new AAIResourcesClient() RouteTableReference rt = client.get(u, NotFoundException.class).asBean(RouteTableReference.class).get() String networkTableRef = rt.getRouteTableReferenceFqdn() networkTableRefs += "" + networkTableRef + "" + '\n' } // end loop execution.setVariable(Prefix + "tableRefCollection", networkTableRefs) logger.debug(" UPDNETI_tableRefCollection - " + '\n' + networkTableRefs) } else { // reset return code to success execution.setVariable(Prefix + "aaiQqueryNetworkTableRefReturnCode", "200") AaiUtil aaiUriUtil = new AaiUtil(this) String schemaVersion = aaiUriUtil.getNamespace() String aaiStubResponse = """ """ String aaiStubResponseAsXml = utils.formatXml(aaiStubResponse) execution.setVariable(Prefix + "queryNetworkTableRefAAIResponse", aaiStubResponseAsXml) execution.setVariable(Prefix + "tableRefCollection", "") logger.debug(" No net table references, using this stub as response - " + '\n' + aaiStubResponseAsXml) } } } catch (NotFoundException e) { String dataErrorMessage = "Response Error from QueryAAINetworkTableRef is 404 (Not Found)." logger.debug(dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } catch (Exception ex) { String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTQueryAAINetworkTableRef() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void callRESTUpdateContrailAAINetwork(DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.debug(" ***** Inside callRESTUpdateContrailAAINetwork of DoUpdateNetworkInstance ***** " ) try { // get variables String networkRequest = execution.getVariable(Prefix + "networkRequest") String networkId = utils.getNodeText(networkRequest, "network-id") AAIResultWrapper requeryIdAAIResponse = execution.getVariable(Prefix + "requeryIdAAIResponse") String updateNetworkResponse = execution.getVariable(Prefix + "updateNetworkResponse") L3Network oldL3Network = requeryIdAAIResponse.asBean(L3Network.class).get() L3Network l3Network = new L3Network() if (oldL3Network.getHeatStackId() != null) { } else { if (utils.nodeExists(updateNetworkResponse, 'networkStackId')) { l3Network.setHeatStackId(utils.getNodeText(updateNetworkResponse, 'networkStackId')) } } if (oldL3Network.getNeutronNetworkId() != null) { } else { if (utils.nodeExists(updateNetworkResponse, 'neutronNetworkId')) { l3Network.setNeutronNetworkId(utils.getNodeText(updateNetworkResponse, 'neutronNetworkId')) } } if (oldL3Network.getContrailNetworkFqdn() != null) { } else { if (utils.nodeExists(updateNetworkResponse, 'networkFqdn')) { l3Network.setContrailNetworkFqdn(utils.getNodeText(updateNetworkResponse, 'networkFqdn')) } } String status = utils.getNodeText(updateNetworkResponse, 'orchestration-status') if(status.equals("pending-create") || status.equals("PendingCreate")){ l3Network.setOrchestrationStatus("Created") }else{ l3Network.setOrchestrationStatus("Active") } AAIResourcesClient client = new AAIResourcesClient() AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, networkId) client.update(uri, l3Network) List subnets = oldL3Network.getSubnets().getSubnet() for(Subnet s:subnets){ String subnetOrchStatus = s.getOrchestrationStatus() String subnetId = s.getSubnetId() Subnet subnet = new Subnet() String neutronSubnetId = networkUtils.extractNeutSubId(updateNetworkResponse, subnetId) subnet.setNeutronSubnetId(neutronSubnetId) if(subnetOrchStatus.equals("pending-create") || subnetOrchStatus.equals("PendingCreate") ){ subnet.setOrchestrationStatus("Created") }else{ subnet.setOrchestrationStatus("Active") } AAIResourceUri subUri = AAIUriFactory.createResourceUri(AAIObjectType.SUBNET, networkId, subnetId) client.update(subUri, subnet) } execution.setVariable(Prefix + "isPONR", true) } catch (BpmnError e) { throw e; } catch (NotFoundException e) { String dataErrorMessage = " Response Error from UpdateContrailAAINetwork is 404 (Not Found)." logger.debug(dataErrorMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage) } catch (Exception ex) { String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. callRESTUpdateContrailAAINetwork() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void prepareUpdateNetworkRequest (DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.trace("Inside prepareUpdateNetworkRequest of DoUpdateNetworkInstance ") try { // get variables String requestId = execution.getVariable(Prefix + "requestId") String messageId = execution.getVariable(Prefix + "messageId") String source = execution.getVariable(Prefix + "source") String requestInput = execution.getVariable(Prefix + "networkRequest") String queryIdResponse = execution.getVariable(Prefix + "requeryIdAAIResponse") String cloudRegionId = execution.getVariable(Prefix + "cloudRegionPo") String backoutOnFailure = execution.getVariable(Prefix + "rollbackEnabled") // Prepare Network request String routeCollection = execution.getVariable(Prefix + "routeCollection") String policyCollection = execution.getVariable(Prefix + "networkCollection") String tableCollection = execution.getVariable(Prefix + "tableRefCollection") String updateNetworkRequest = networkUtils.UpdateNetworkRequestV2(execution, requestId, messageId, requestInput, queryIdResponse, routeCollection, policyCollection, tableCollection, cloudRegionId, backoutOnFailure, source ) // Format Response String buildUpdateNetworkRequestAsString = utils.formatXml(updateNetworkRequest) buildUpdateNetworkRequestAsString = buildUpdateNetworkRequestAsString.replace(":w1aac13n0", "").replace("w1aac13n0:", "") logger.debug(buildUpdateNetworkRequestAsString) execution.setVariable(Prefix + "updateNetworkRequest", buildUpdateNetworkRequestAsString) logger.debug(" UPDNETI_updateNetworkRequest - " + "\n" + buildUpdateNetworkRequestAsString) } catch (Exception ex) { String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareUpdateNetworkRequest() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void prepareSDNCRequest (DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.trace("Inside prepareSDNCRequest of DoUpdateNetworkInstance ") try { // get variables String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution) String updateNetworkInput = execution.getVariable(Prefix + "networkRequest") String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc") String networkId = "" if (utils.nodeExists(updateNetworkInput, "network-id")) { networkId = utils.getNodeText(updateNetworkInput, "network-id") } if (networkId == null) {networkId = ""} String serviceInstanceId = utils.getNodeText(updateNetworkInput, "service-instance-id") AAIResultWrapper wrapper = execution.getVariable(Prefix + "queryIdAAIResponse") L3Network queryAAIResponse = wrapper.asBean(L3Network.class).get() // 1. prepare assign topology via SDNC Adapter SUBFLOW call String sndcTopologyCreateRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, updateNetworkInput, serviceInstanceId, sdncCallback, "changeassign", "NetworkActivateRequest", cloudRegionId, networkId, queryAAIResponse, null) String sndcTopologyUpdateRequesAsString = utils.formatXml(sndcTopologyCreateRequest) logger.debug(sndcTopologyUpdateRequesAsString) execution.setVariable(Prefix + "changeAssignSDNCRequest", sndcTopologyUpdateRequesAsString) logger.debug(" UPDNETI_changeAssignSDNCRequest - " + "\n" + sndcTopologyUpdateRequesAsString) } catch (Exception ex) { String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareSDNCRequest() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } // ************************************************** // Post or Validate Response Section // ************************************************** public void validateUpdateNetworkResponse (DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.trace("Inside validateUpdateNetworkResponse of DoUpdateNetworkInstance ") try { String returnCode = execution.getVariable(Prefix + "networkReturnCode") String networkResponse = execution.getVariable(Prefix + "updateNetworkResponse") if (networkResponse==null) { networkResponse="" // reset } logger.debug(" Network Adapter update responseCode: " + returnCode) String errorMessage = "" if (returnCode == "200") { execution.setVariable(Prefix + "isNetworkRollbackNeeded", true) logger.debug(networkResponse) execution.setVariable(Prefix + "updateNetworkResponse", networkResponse) logger.debug(" Network Adapter update Success Response - " + "\n" + networkResponse) // prepare rollback data String rollbackData = utils.getNodeXml(networkResponse, "rollback", false).replace("tag0:","").replace(":tag0","") rollbackData = rollbackData.replace("rollback>", "networkRollback>") String rollbackNetwork = """ ${rollbackData} """ String rollbackNetworkXml = utils.formatXml(rollbackNetwork) execution.setVariable(Prefix + "rollbackNetworkRequest", rollbackNetworkXml) logger.debug(" Network Adapter rollback data - " + "\n" + rollbackNetworkXml) } else { // network error if (returnCode.toInteger() > 399 && returnCode.toInteger() < 600) { //4xx, 5xx if (networkResponse.contains("updateNetworkError")) { networkResponse = networkResponse.replace('', '') errorMessage = utils.getNodeText(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) { String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. validateUpdateNetworkResponse() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void validateSDNCResponse (DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.trace("Inside validateSDNCResponse of DoUpdateNetworkInstance ") String response = execution.getVariable(Prefix + "changeAssignSDNCResponse") WorkflowException workflowException = null try { workflowException = execution.getVariable(Prefix + "WorkflowException") //execution.setVariable("WorkflowException", workflowException) } catch (Exception ex) { logger.debug(" Sdnc 'WorkflowException' object is empty or null. ") } boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator") SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils() sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator) // reset variable String changeAssignSDNCResponseDecodeXml = execution.getVariable(Prefix + "changeAssignSDNCResponse") changeAssignSDNCResponseDecodeXml = changeAssignSDNCResponseDecodeXml.replace('', "") execution.setVariable(Prefix + "changeAssignSDNCResponse", changeAssignSDNCResponseDecodeXml) if (execution.getVariable(Prefix + "sdncResponseSuccess") == true) { // from sdnc util, prefix+'sdncResponseSuccess' execution.setVariable(Prefix + "isSdncRollbackNeeded", true) logger.debug("Successfully Validated SDNC Response") } else { logger.debug("Did NOT Successfully Validated SDNC Response") throw new BpmnError("MSOWorkflowException") } } public void postProcessResponse (DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.trace("Inside postProcessResponse of DoUpdateNetworkInstance ") try { logger.debug(" ***** Is Exception Encountered (isException)? : " + execution.getVariable(Prefix + "isException")) if (execution.getVariable(Prefix + "isException") == false) { // set rollback data execution.setVariable("orchestrationStatus", "") execution.setVariable("networkId", execution.getVariable(Prefix + "networkId")) execution.setVariable("networkName", execution.getVariable(Prefix + "networkName")) prepareSuccessRollbackData(execution) // populate rollbackData execution.setVariable("WorkflowException", null) execution.setVariable(Prefix + "Success", true) logger.debug(" ***** postProcessResponse(), GOOD !!!") } else { execution.setVariable(Prefix + "Success", false) execution.setVariable("rollbackData", null) String exceptionMessage = " Exception encountered in MSO Bpmn. " if (execution.getVariable("workflowException") != null) { // Output of Rollback flow. logger.debug(" ***** workflowException: " + execution.getVariable("workflowException")) WorkflowException wfex = execution.getVariable("workflowException") exceptionMessage = wfex.getErrorMessage() } else { if (execution.getVariable(Prefix + "WorkflowException") != null) { WorkflowException pwfex = execution.getVariable(Prefix + "WorkflowException") exceptionMessage = pwfex.getErrorMessage() } } // going to the Main flow: a-la-carte or macro logger.debug(" ***** postProcessResponse(), BAD !!!") exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage) throw new BpmnError("MSOWorkflowException") } } catch(BpmnError b){ logger.debug("Rethrowing MSOWorkflowException") throw b } catch (Exception ex) { String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. postProcessResponse() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } public void prepareSDNCRollbackRequest (DelegateExecution execution) { execution.setVariable("prefix", Prefix) logger.trace("Inside prepareSDNCRollbackRequest of DoUpdateNetworkInstance ") try { // for some reason the WorkflowException object is null after the sdnc rollback call task, need to save WorkflowException. execution.setVariable(Prefix + "WorkflowException", execution.getVariable("WorkflowException")) // get variables String sdncCallback = UrnPropertiesReader.getVariable("mso.workflow.sdncadapter.callback",execution) String updateNetworkInput = execution.getVariable(Prefix + "networkRequest") String cloudRegionId = execution.getVariable(Prefix + "cloudRegionSdnc") String changeAssignSDNCResponse = execution.getVariable(Prefix + "changeAssignSDNCResponse") String networkId = utils.getNodeText(changeAssignSDNCResponse, "network-id") String serviceInstanceId = utils.getNodeText(updateNetworkInput, "service-instance-id") // 2. prepare rollback topology via SDNC Adapter SUBFLOW call String sndcTopologyRollbackRequest = sdncAdapterUtils.sdncTopologyRequestV2(execution, updateNetworkInput, serviceInstanceId, sdncCallback, "rollback", "NetworkActivateRequest", cloudRegionId, networkId, null, null) String sndcTopologyRollbackRequestAsString = utils.formatXml(sndcTopologyRollbackRequest) execution.setVariable(Prefix + "rollbackSDNCRequest", sndcTopologyRollbackRequestAsString) logger.debug(" Preparing request for SDNC Topology assign's rollback/compensation . . . - " + "\n" + sndcTopologyRollbackRequestAsString) } catch (Exception ex) { String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareSDNCRollbackRequest() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage) } } public void prepareRollbackData(DelegateExecution execution) { execution.setVariable("prefix",Prefix) logger.trace("Inside prepareRollbackData() of DoUpdateNetworkInstance ") try { Map rollbackData = new HashMap(); String rollbackSDNCRequest = execution.getVariable(Prefix + "rollbackSDNCRequest") if (rollbackSDNCRequest != null) { if (rollbackSDNCRequest != "") { rollbackData.put("rollbackSDNCRequest", execution.getVariable(Prefix + "rollbackSDNCRequest")) } } String rollbackNetworkRequest = execution.getVariable(Prefix + "rollbackNetworkRequest") if (rollbackNetworkRequest != null) { if (rollbackNetworkRequest != "") { rollbackData.put("rollbackNetworkRequest", execution.getVariable(Prefix + "rollbackNetworkRequest")) } } execution.setVariable("rollbackData", rollbackData) logger.debug("** rollbackData : " + rollbackData) execution.setVariable("WorkflowException", execution.getVariable(Prefix + "WorkflowException")) logger.debug("** WorkflowException : " + execution.getVariable("WorkflowException")) } catch (Exception ex) { String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareRollbackData() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage) } } public void prepareSuccessRollbackData(DelegateExecution execution) { execution.setVariable("prefix",Prefix) logger.trace("Inside prepareSuccessRollbackData() of DoUpdateNetworkInstance ") try { if (execution.getVariable("sdncVersion") != '1610') { // skip: 1702 for 'changeassign' or equivalent not yet defined in SNDC, so no rollback. } else { prepareSDNCRollbackRequest(execution) } Map rollbackData = new HashMap(); String rollbackSDNCRequest = execution.getVariable(Prefix + "rollbackSDNCRequest") if (rollbackSDNCRequest != null) { if (rollbackSDNCRequest != "") { rollbackData.put("rollbackSDNCRequest", rollbackSDNCRequest) } } String rollbackNetworkRequest = execution.getVariable(Prefix + "rollbackNetworkRequest") if (rollbackNetworkRequest != null) { if (rollbackNetworkRequest != "") { rollbackData.put("rollbackNetworkRequest", rollbackNetworkRequest) } } execution.setVariable("rollbackData", rollbackData) logger.debug("** 'rollbackData' for Full Rollback : " + rollbackData) execution.setVariable("WorkflowException", null) } catch (Exception ex) { String exceptionMessage = " Bpmn error encountered in DoUpdateNetworkInstance flow. prepareSuccessRollbackData() - " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage) } } public void setExceptionFlag(DelegateExecution execution){ execution.setVariable("prefix",Prefix) logger.trace("Inside setExceptionFlag() of DoUpdateNetworkInstance ") try { execution.setVariable(Prefix + "isException", true) if (execution.getVariable("SavedWorkflowException1") != null) { execution.setVariable(Prefix + "WorkflowException", execution.getVariable("SavedWorkflowException1")) } else { execution.setVariable(Prefix + "WorkflowException", execution.getVariable("WorkflowException")) } logger.debug(Prefix + "WorkflowException - " +execution.getVariable(Prefix + "WorkflowException")) } catch(Exception ex){ String exceptionMessage = "Bpmn error encountered in DoUpdateNetworkInstance flow. setExceptionFlag(): " + ex.getMessage() logger.debug(exceptionMessage) exceptionUtil.buildWorkflowException(execution, 7000, exceptionMessage) } } // ******************************* // Build Error Section // ******************************* public void processJavaException(DelegateExecution execution){ execution.setVariable("prefix",Prefix) try{ logger.debug("Caught a Java Exception") logger.debug("Started processJavaException Method") logger.debug("Variables List: " + execution.getVariables()) execution.setVariable("UnexpectedError", "Caught a Java Lang Exception - " + Prefix) // Adding this line temporarily until this flows error handling gets updated exceptionUtil.buildWorkflowException(execution, 500, "Caught a Java Lang Exception") }catch(Exception e){ logger.debug("Caught Exception during processJavaException Method: " + e) execution.setVariable("UnexpectedError", "Exception in processJavaException method") // Adding this line temporarily until this flows error handling gets updated exceptionUtil.buildWorkflowException(execution, 500, "Exception in processJavaException method") } logger.debug("Completed processJavaException Method") } }