/*- * ============LICENSE_START======================================================= * ONAP - SO * ================================================================================ * 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 org.onap.so.bpmn.common.scripts import groovy.json.JsonBuilder import groovy.json.JsonSlurper import org.json.JSONObject import org.json.XML import org.onap.so.bpmn.core.xml.XmlTool import org.onap.so.logger.MsoLogger import org.onap.so.logger.MessageEnum class VidUtils { private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VidUtils.class); public MsoUtils utils = new MsoUtils() private AbstractServiceTaskProcessor taskProcessor public VidUtils(AbstractServiceTaskProcessor taskProcessor) { this.taskProcessor = taskProcessor } /** * Create a volume-request XML using a JSON string * @param jsonReq - JSON request from VID * @param action * @return */ public String createXmlVolumeRequest(String jsonReq, String action, String serviceInstanceId) { def jsonSlurper = new JsonSlurper() try{ Map reqMap = jsonSlurper.parseText(jsonReq) return createXmlVolumeRequest(reqMap, action, serviceInstanceId) } catch(Exception e) { throw e } } /** * Create a volume-request XML using a map * @param requestMap - map created from VID JSON * @param action * @param serviceInstanceId * @return */ public String createXmlVolumeRequest(Map requestMap, String action, String serviceInstanceId) { createXmlVolumeRequest(requestMap, action, serviceInstanceId, '') } /** * Create a volume-request XML using a map * @param requestMap * @param action * @param serviceInstanceId * @param volumeGroupId * @return */ public String createXmlVolumeRequest(Map requestMap, String action, String serviceInstanceId, String volumeGroupId) { def vnfType = '' def serviceName = '' def modelCustomizationName = '' def asdcServiceModelVersion = '' def suppressRollback = requestMap.requestDetails.requestInfo.suppressRollback def backoutOnFailure = "" if(suppressRollback != null){ if ( suppressRollback == true) { backoutOnFailure = "false" } else if ( suppressRollback == false) { backoutOnFailure = "true" } } def volGrpName = requestMap.requestDetails.requestInfo?.instanceName ?: '' def serviceId = requestMap.requestDetails.requestParameters?.serviceId ?: '' def relatedInstanceList = requestMap.requestDetails.relatedInstanceList relatedInstanceList.each { if (it.relatedInstance.modelInfo?.modelType == 'service') { serviceName = it.relatedInstance.modelInfo?.modelName asdcServiceModelVersion = it.relatedInstance.modelInfo?.modelVersion } if (it.relatedInstance.modelInfo?.modelType == 'vnf') { modelCustomizationName = it.relatedInstance.modelInfo?.modelInstanceName } } vnfType = serviceName + '/' + modelCustomizationName def userParams = requestMap.requestDetails?.requestParameters?.userParams def userParamsNode = '' if(userParams != null) { userParamsNode = buildUserParams(userParams) } def modelCustomizationId = requestMap.requestDetails?.modelInfo?.modelCustomizationUuid ?: '' def xmlReq = """ ${MsoUtils.xmlEscape(action)} ${MsoUtils.xmlEscape(requestMap.requestDetails.requestInfo.source)} ${MsoUtils.xmlEscape(serviceInstanceId)} ${MsoUtils.xmlEscape(volumeGroupId)} ${MsoUtils.xmlEscape(volGrpName)} ${MsoUtils.xmlEscape(vnfType)} ${MsoUtils.xmlEscape(requestMap.requestDetails.modelInfo.modelName)} ${MsoUtils.xmlEscape(asdcServiceModelVersion)} ${MsoUtils.xmlEscape(requestMap.requestDetails.cloudConfiguration.lcpCloudRegionId)} ${MsoUtils.xmlEscape(requestMap.requestDetails.cloudConfiguration.tenantId)} ${MsoUtils.xmlEscape(serviceId)} ${MsoUtils.xmlEscape(backoutOnFailure)} ${MsoUtils.xmlEscape(modelCustomizationId)} $userParamsNode """ // return a pretty-print of the volume-request xml without the preamble return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "") } /** * A common method that can be used to build volume-params node from a map. * @param Map userParams * @return */ public String buildUserParams(userParams) { if (userParams == null) return "" def xml = "" def key = "" def value = "" userParams.each {it -> key = it.name.replaceAll(/\B[A-Z]/) { '_' + it }.toLowerCase() value = it.value xml += "${MsoUtils.xmlEscape(value)}" } return xml } /** * A common method that can be used to extract 'requestDetails' * @param String json * @return String json requestDetails */ @Deprecated public getJsonRequestDetails(String jsonInput) { String rtn = "" if (jsonInput.isEmpty() || jsonInput == null) { return rtn } else { def jsonMapObject = new JsonSlurper().parseText(jsonInput) if (jsonMapObject instanceof Map) { String jsonString = new JsonBuilder(jsonMapObject.requestDetails) rtn = '{'+"requestDetails"+":"+jsonString+'}' return rtn } else { return rtn } } } /** * A common method that can be used to extract 'requestDetails' in Xml * @param String json * @return String xml requestDetails */ @Deprecated public getJsonRequestDetailstoXml(String jsonInput) { String rtn = null def jsonString = getJsonRequestDetails(jsonInput) if (jsonString == null) { return rtn } else { JSONObject jsonObj = new JSONObject(jsonString) return XmlTool.normalize(XML.toString(jsonObj)) } } /** * Create a network-request XML using a map * @param execution * @param xmlRequestDetails - requestDetails in xml * @return * Note: See latest version: createXmlNetworkRequestInstance() */ public String createXmlNetworkRequestInfra(execution, def networkJsonIncoming) { def requestId = execution.getVariable("requestId") def serviceInstanceId = execution.getVariable("serviceInstanceId") def requestAction = execution.getVariable("requestAction") def networkId = (execution.getVariable("networkId")) != null ? execution.getVariable("networkId") : "" def jsonSlurper = new JsonSlurper() try { Map reqMap = jsonSlurper.parseText(networkJsonIncoming) def instanceName = reqMap.requestDetails.requestInfo.instanceName def modelCustomizationId = reqMap.requestDetails.modelInfo.modelCustomizationId if (modelCustomizationId == null) { modelCustomizationId = reqMap.requestDetails.modelInfo.modelCustomizationUuid !=null ? reqMap.requestDetails.modelInfo.modelCustomizationUuid : "" } def modelName = reqMap.requestDetails.modelInfo.modelName def lcpCloudRegionId = reqMap.requestDetails.cloudConfiguration.lcpCloudRegionId def tenantId = reqMap.requestDetails.cloudConfiguration.tenantId def serviceId = reqMap.requestDetails.requestInfo.productFamilyId def suppressRollback = reqMap.requestDetails.requestInfo.suppressRollback.toString() def backoutOnFailure = "true" if(suppressRollback != null){ if (suppressRollback == true || suppressRollback == "true") { backoutOnFailure = "false" } else if (suppressRollback == false || suppressRollback == "false") { backoutOnFailure = "true" } } //def userParams = reqMap.requestDetails.requestParameters.userParams //def userParamsNode = buildUserParams(userParams) def userParams = reqMap.requestDetails?.requestParameters?.userParams def userParamsNode = '' if(userParams != null) { userParamsNode = buildUserParams(userParams) } //'sdncVersion' = current, '1610' (non-RPC SDNC) or '1702' (RPC SDNC) def sdncVersion = execution.getVariable("sdncVersion") def xmlReq = """ ${MsoUtils.xmlEscape(requestId)} ${MsoUtils.xmlEscape(requestAction)} VID ${MsoUtils.xmlEscape(serviceInstanceId)} ${MsoUtils.xmlEscape(networkId)} ${MsoUtils.xmlEscape(instanceName)} ${MsoUtils.xmlEscape(modelName)} ${MsoUtils.xmlEscape(modelCustomizationId)} ${MsoUtils.xmlEscape(lcpCloudRegionId)} ${MsoUtils.xmlEscape(tenantId)} ${MsoUtils.xmlEscape(serviceId)} ${MsoUtils.xmlEscape(backoutOnFailure)} ${MsoUtils.xmlEscape(sdncVersion)} ${userParamsNode} """ // return a pretty-print of the volume-request xml without the preamble return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "") } catch(Exception e) { msoLogger.debug("Error in Vid Utils",e.getCause()) e.printStackTrace(); throw e } } /** * Create a network-request XML using a map, * @param execution * @return */ public String createXmlNetworkRequestInstance(execution) { def networkModelUuid = "" def networkModelName = "" def networkModelVersion = "" def networkModelCustomizationUuid = "" def networkModelInvariantUuid = "" // verify the DB Catalog response JSON structure def networkModelInfo = execution.getVariable("networkModelInfo") def jsonSlurper = new JsonSlurper() if (networkModelInfo != null) { try { Map modelMap = jsonSlurper.parseText(networkModelInfo) if (modelMap != null) { if (networkModelInfo.contains("modelUuid")) { networkModelUuid = modelMap.modelUuid !=null ? modelMap.modelUuid : "" } if (networkModelInfo.contains("modelName")) { networkModelName = modelMap.modelName !=null ? modelMap.modelName : "" } if (networkModelInfo.contains("modelVersion")) { networkModelVersion = modelMap.modelVersion !=null ? modelMap.modelVersion : "" } if (networkModelInfo.contains("modelCustomizationUuid")) { networkModelCustomizationUuid = modelMap.modelCustomizationUuid !=null ? modelMap.modelCustomizationUuid : "" } if (networkModelInfo.contains("modelInvariantUuid")) { networkModelInvariantUuid = modelMap.modelInvariantUuid !=null ? modelMap.modelInvariantUuid : "" } } } catch (Exception ex) { throw ex } } def serviceModelUuid = "" def serviceModelName = "" def serviceModelVersion = "" def serviceModelCustomizationUuid = "" def serviceModelInvariantUuid = "" // verify the DB Catalog response JSON structure def serviceModelInfo = execution.getVariable("serviceModelInfo") def jsonServiceSlurper = new JsonSlurper() if (serviceModelInfo != null) { try { Map modelMap = jsonServiceSlurper.parseText(serviceModelInfo) if (modelMap != null) { if (serviceModelInfo.contains("modelUuid")) { serviceModelUuid = modelMap.modelUuid !=null ? modelMap.modelUuid : "" } if (serviceModelInfo.contains("modelName")) { serviceModelName = modelMap.modelName !=null ? modelMap.modelName : "" } if (serviceModelInfo.contains("modelVersion")) { serviceModelVersion = modelMap.modelVersion !=null ? modelMap.modelVersion : "" } if (serviceModelInfo.contains("modelCustomizationUuid")) { serviceModelCustomizationUuid = modelMap.modelCustomizationUuid !=null ? modelMap.modelCustomizationUuid : "" } if (serviceModelInfo.contains("modelInvariantUuid")) { serviceModelInvariantUuid = modelMap.modelInvariantUuid !=null ? modelMap.modelInvariantUuid : "" } } } catch (Exception ex) { throw ex } } def subscriptionServiceType = execution.getVariable("subscriptionServiceType") != null ? execution.getVariable("subscriptionServiceType") : "" def globalSubscriberId = execution.getVariable("globalSubscriberId") != null ? execution.getVariable("globalSubscriberId") : "" def requestId = execution.getVariable("msoRequestId") def serviceInstanceId = execution.getVariable("serviceInstanceId") != null ? execution.getVariable("serviceInstanceId") : "" def networkId = (execution.getVariable("networkId")) != null ? execution.getVariable("networkId") : "" // optional def networkName = execution.getVariable("networkName") != null ? execution.getVariable("networkName") : "" // optional def aicCloudReqion = execution.getVariable("lcpCloudRegionId") != null ? execution.getVariable("lcpCloudRegionId") : "" def tenantId = execution.getVariable("tenantId") != null ? execution.getVariable("tenantId") : "" def serviceId = execution.getVariable("productFamilyId") != null ? execution.getVariable("productFamilyId") : "" def failIfExist = execution.getVariable("failIfExists") != null ? execution.getVariable("failIfExists") : "" def suppressRollback = execution.getVariable("disableRollback") def backoutOnFailure = "true" if(suppressRollback != null){ if (suppressRollback == true || suppressRollback == "true") { backoutOnFailure = "false" } else if (suppressRollback == false || suppressRollback == "false") { backoutOnFailure = "true" } } //'sdncVersion' = current, '1610' (non-RPC SDNC) or '1702' (RPC SDNC) def sdncVersion = execution.getVariable("sdncVersion") def source = "VID" def action = execution.getVariable("action") def userParamsNode = "" def userParams = execution.getVariable("networkInputParams") if(userParams != null) { userParamsNode = buildUserParams(userParams) } def xmlReq = """ ${MsoUtils.xmlEscape(requestId)} ${MsoUtils.xmlEscape(action)} ${MsoUtils.xmlEscape(source)} ${MsoUtils.xmlEscape(serviceInstanceId)} ${MsoUtils.xmlEscape(networkId)} ${MsoUtils.xmlEscape(networkName)} ${MsoUtils.xmlEscape(networkModelName)} ${MsoUtils.xmlEscape(subscriptionServiceType)} ${MsoUtils.xmlEscape(globalSubscriberId)} ${MsoUtils.xmlEscape(aicCloudReqion)} ${MsoUtils.xmlEscape(tenantId)} ${MsoUtils.xmlEscape(serviceId)} ${MsoUtils.xmlEscape(backoutOnFailure)} ${MsoUtils.xmlEscape(failIfExist)} ${MsoUtils.xmlEscape(networkModelName)} ${MsoUtils.xmlEscape(networkModelUuid)} ${MsoUtils.xmlEscape(networkModelInvariantUuid)} ${MsoUtils.xmlEscape(networkModelVersion)} ${MsoUtils.xmlEscape(networkModelCustomizationUuid)} ${MsoUtils.xmlEscape(serviceModelName)} ${MsoUtils.xmlEscape(serviceModelUuid)} ${MsoUtils.xmlEscape(serviceModelInvariantUuid)} ${MsoUtils.xmlEscape(serviceModelVersion)} ${MsoUtils.xmlEscape(serviceModelCustomizationUuid)} ${MsoUtils.xmlEscape(sdncVersion)} ${userParamsNode} """ // return a pretty-print of the volume-request xml without the preamble return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "") } /** * Create a vnf-request XML using a map * @param requestMap - map created from VID JSON * @param action * @return */ public String createXmlVfModuleRequest(execution, Map requestMap, String action, String serviceInstanceId) { //def relatedInstanceList = requestMap.requestDetails.relatedInstanceList //relatedInstanceList.each { // if (it.relatedInstance.modelInfo.modelType == 'vnf') { // vnfType = it.relatedInstance.modelInfo.modelName // vnfId = it.relatedInstance.modelInfo.modelInvariantId // } //} def vnfName = '' def asdcServiceModelInfo = '' def relatedInstanceList = requestMap.requestDetails?.relatedInstanceList if (relatedInstanceList != null) { relatedInstanceList.each { if (it.relatedInstance.modelInfo?.modelType == 'service') { asdcServiceModelInfo = it.relatedInstance.modelInfo?.modelVersion } if (it.relatedInstance.modelInfo.modelType == 'vnf') { vnfName = it.relatedInstance.instanceName ?: '' } } } def vnfType = execution.getVariable('vnfType') def vnfId = execution.getVariable('vnfId') def vfModuleId = execution.getVariable('vfModuleId') def volumeGroupId = execution.getVariable('volumeGroupId') def userParams = requestMap.requestDetails?.requestParameters?.userParams def userParamsNode = '' if(userParams != null) { userParamsNode = buildUserParams(userParams) } def isBaseVfModule = "false" if (execution.getVariable('isBaseVfModule') == true) { isBaseVfModule = "true" } def requestId = execution.getVariable("mso-request-id") def vfModuleName = requestMap.requestDetails?.requestInfo?.instanceName ?: '' def vfModuleModelName = requestMap.requestDetails?.modelInfo?.modelName ?: '' def suppressRollback = requestMap.requestDetails?.requestInfo?.suppressRollback def backoutOnFailure = "" if(suppressRollback != null){ if ( suppressRollback == true) { backoutOnFailure = "false" } else if ( suppressRollback == false) { backoutOnFailure = "true" } } def serviceId = requestMap.requestDetails?.requestParameters?.serviceId ?: '' def aicCloudRegion = requestMap.requestDetails?.cloudConfiguration?.lcpCloudRegionId ?: '' def tenantId = requestMap.requestDetails?.cloudConfiguration?.tenantId ?: '' def personaModelId = requestMap.requestDetails?.modelInfo?.modelInvariantUuid ?: '' def personaModelVersion = requestMap.requestDetails?.modelInfo?.modelUuid ?: '' def modelCustomizationId = requestMap.requestDetails?.modelInfo?.modelCustomizationUuid ?: '' def xmlReq = """ ${MsoUtils.xmlEscape(requestId)} ${MsoUtils.xmlEscape(action)} VID ${MsoUtils.xmlEscape(serviceInstanceId)} ${MsoUtils.xmlEscape(vnfName)} ${MsoUtils.xmlEscape(vnfType)} ${MsoUtils.xmlEscape(vnfId)} ${MsoUtils.xmlEscape(volumeGroupId)} ${MsoUtils.xmlEscape(vfModuleId)} ${MsoUtils.xmlEscape(vfModuleName)} ${MsoUtils.xmlEscape(vfModuleModelName)} ${MsoUtils.xmlEscape(modelCustomizationId)} ${MsoUtils.xmlEscape(isBaseVfModule)} ${MsoUtils.xmlEscape(asdcServiceModelInfo)} ${MsoUtils.xmlEscape(aicCloudRegion)} ${MsoUtils.xmlEscape(tenantId)} ${MsoUtils.xmlEscape(serviceId)} ${MsoUtils.xmlEscape(backoutOnFailure)} ${MsoUtils.xmlEscape(personaModelId)} ${MsoUtils.xmlEscape(personaModelVersion)} $userParamsNode """ // return a pretty-print of the volume-request xml without the preamble return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "") } }