/*-
* ============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.apache.commons.lang3.*
import groovy.xml.XmlUtil
import javax.xml.parsers.DocumentBuilder
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.transform.Transformer
import javax.xml.transform.TransformerFactory
import javax.xml.transform.TransformerException
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult
import org.camunda.bpm.engine.delegate.BpmnError
import org.camunda.bpm.engine.runtime.Execution
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.apache.commons.lang3.*
import org.camunda.bpm.engine.delegate.BpmnError
import org.camunda.bpm.engine.runtime.Execution
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
/**
* This groovy class supports the any Network processes that need the methods defined here.
*/
class NetworkUtils {
public MsoUtils utils = new MsoUtils()
private AbstractServiceTaskProcessor taskProcessor
public NetworkUtils(AbstractServiceTaskProcessor taskProcessor) {
this.taskProcessor = taskProcessor
}
/**
* This method returns the string for Network request
* V2 for Contrail 3.x will populate cloud-region data in same cloudSiteId filed
* Network adapter will handle it properly
* @param requestId either 'request-id' or 'att-mso-request-id'
* @param requestInput the request in the process
* @param queryIdResponse the response of REST AAI query by Id
* @param routeCollection the collection
* @param policyFqdns the policy
* @param tableCollection the collection
* @param cloudRegionId the cloud-region-region
* @return String request
*/
def CreateNetworkRequestV2(execution, requestId, messageId, requestInput, queryIdResponse, routeCollection, policyFqdns, tableCollection, cloudRegionId, backoutOnFailure, source) {
String createNetworkRequest = null
if(requestInput!=null && queryIdResponse!=null) {
String serviceInstanceId = ""
String sharedValue = ""
String externalValue = ""
if (source == "VID") {
sharedValue = utils.getNodeText1(queryIdResponse, "is-shared-network") != null ? utils.getNodeText1(queryIdResponse, "is-shared-network") : "false"
externalValue = utils.getNodeText1(queryIdResponse, "is-external-network") != null ? utils.getNodeText1(queryIdResponse, "is-external-network") : "false"
serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id")
} else { // source = 'PORTAL'
sharedValue = getParameterValue(requestInput, "shared")
externalValue = getParameterValue(requestInput, "external")
serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id") != null ? utils.getNodeText1(requestInput, "service-instance-id") : ""
}
String networkParams = ""
if (utils.nodeExists(requestInput, "network-params")) {
String netParams = utils.getNodeXml(requestInput, "network-params", false).replace("tag0:","").replace(":tag0","")
networkParams = buildParams(netParams)
}
String failIfExists = "false"
// requestInput
String cloudRegion = cloudRegionId
String tenantId = utils.getNodeText1(requestInput, "tenant-id")
// queryIdResponse
String networkName = utils.getNodeText1(queryIdResponse, "network-name")
String networkId = utils.getNodeText1(queryIdResponse, "network-id")
String networkType = utils.getNodeText1(queryIdResponse, "network-type")
// rebuild subnets
String subnets = ""
if (utils.nodeExists(queryIdResponse, "subnets")) {
def subnetsGroup = utils.getNodeXml(queryIdResponse, "subnets", false)
subnets = buildSubnets(subnetsGroup)
}
String physicalNetworkName = ""
physicalNetworkName = utils.getNodeText1(queryIdResponse, "physical-network-name")
String vlansCollection = buildVlans(queryIdResponse)
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?
createNetworkRequest = """
${cloudRegion}
${tenantId}
${networkId}
${networkName}
${networkType}
CONTRAIL
${physicalNetworkName}
${vlansCollection}
${sharedValue}
${externalValue}
${routeCollection}
${policyFqdns}
${tableCollection}
${subnets}
true
${backoutOnFailure}
${failIfExists}
${networkParams}
${requestId}
${serviceInstanceId}
${messageId}
${notificationUrl}
""".trim()
}
return createNetworkRequest
}
/**
* This method returns the string for Network request
* V2 for Contrail 3.x will populate cloud-region data in same cloudSiteId filed
* Network adapter will handle it properly
* @param requestId either 'request-id' or 'att-mso-request-id'
* @param requestInput the request in the process
* @param queryIdResponse the response of REST AAI query by Id
* @param routeCollection the collection
* @param policyFqdns the policy
* @param cloudRegionId the cloud-region-region
* @return String request
*/
def UpdateNetworkRequestV2(execution, requestId, messageId, requestInput, queryIdResponse, routeCollection, policyFqdns, tableCollection, cloudRegionId, backoutOnFailure, source) {
String updateNetworkRequest = null
if(requestInput!=null && queryIdResponse!=null) {
String serviceInstanceId = ""
String sharedValue = ""
String externalValue = ""
if (source == "VID") {
sharedValue = utils.getNodeText1(queryIdResponse, "is-shared-network") != null ? utils.getNodeText1(queryIdResponse, "is-shared-network") : "false"
externalValue = utils.getNodeText1(queryIdResponse, "is-external-network") != null ? utils.getNodeText1(queryIdResponse, "is-external-network") : "false"
serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id")
} else { // source = 'PORTAL'
sharedValue = getParameterValue(requestInput, "shared")
externalValue = getParameterValue(requestInput, "external")
serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id") != null ? utils.getNodeText1(requestInput, "service-instance-id") : ""
}
String failIfExists = "false"
// requestInput
String cloudRegion = cloudRegionId
String tenantId = utils.getNodeText1(requestInput, "tenant-id")
// queryIdResponse
String networkName = utils.getNodeText1(queryIdResponse, "network-name")
String networkId = utils.getNodeText1(queryIdResponse, "network-id")
String networkType = utils.getNodeText1(queryIdResponse, "network-type")
// rebuild subnets
String subnets = ""
if (utils.nodeExists(queryIdResponse, "subnets")) {
def subnetsGroup = utils.getNodeXml(queryIdResponse, "subnets", false)
subnets = buildSubnets(subnetsGroup)
}
String networkParams = ""
if (utils.nodeExists(requestInput, "network-params")) {
String netParams = utils.getNodeXml(requestInput, "network-params", false).replace("tag0:","").replace(":tag0","")
networkParams = buildParams(netParams)
}
String networkStackId = utils.getNodeText1(queryIdResponse, "heat-stack-id")
if (networkStackId == 'null' || networkStackId == "" || networkStackId == null) {
networkStackId = "force_update"
}
String physicalNetworkName = utils.getNodeText1(queryIdResponse, "physical-network-name")
String vlansCollection = buildVlans(queryIdResponse)
updateNetworkRequest =
"""
${cloudRegion}
${tenantId}
${networkId}
${networkStackId}
${networkName}
${networkType}
CONTRAIL
${physicalNetworkName}
${vlansCollection}
${sharedValue}
${externalValue}
${routeCollection}
${policyFqdns}
${tableCollection}
${subnets}
true
${backoutOnFailure}
${failIfExists}
${networkParams}
${requestId}
${serviceInstanceId}
${messageId}
""".trim()
}
return updateNetworkRequest
}
/**
* This method returns the string for Create Volume Request payload
* @param groupId the volume-group-id
* @param volumeName the volume-group-name
* @param vnfType the vnf-type
* @param tenantId the value of relationship-key 'tenant.tenant-id'
* @return String request payload
*/
def String CreateNetworkVolumeRequest(groupId, volumeName, vnfType, tenantId) {
String requestPayload =
"""
${groupId}
${volumeName}
${vnfType}
Pending
tenant
tenant.tenant-id
${tenantId}
"""
return requestPayload
}
def String createCloudRegionVolumeRequest(groupId, volumeName, vnfType, tenantId, cloudRegion, namespace) {
String requestPayload =
"""
${groupId}
${volumeName}
${vnfType}
Pending
tenant
tenant.tenant-id
${tenantId}
cloud-region.cloud-owner
att-aic
cloud-region.cloud-region-id
${cloudRegion}
"""
return requestPayload
}
def String createCloudRegionVolumeRequest(groupId, volumeName, vnfType, vnfId, tenantId, cloudRegion, namespace) {
String requestPayload =
"""
${groupId}
${volumeName}
${vnfType}
Pending
generic-vnf
generic-vnf.vnf-id
${vnfId}
tenant
tenant.tenant-id
${tenantId}
cloud-region.cloud-owner
att-aic
cloud-region.cloud-region-id
${cloudRegion}
"""
return requestPayload
}
/**
* This method returns the string for Update Volume Request payload
* @param requeryAAIVolGrpNameResponse the response of query volume group name (in AAI)
* @param heatStackId the value of heat stack id
* @return String request payload
*/
def String updateCloudRegionVolumeRequest(requeryAAIVolGrpNameResponse, heatStackId, namespace) {
String requestPayload = ""
if (requeryAAIVolGrpNameResponse != null) {
def groupId = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-id")
def volumeName = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-name")
def vnfType = utils.getNodeText(requeryAAIVolGrpNameResponse, "vnf-type")
def resourceVersion = utils.getNodeText(requeryAAIVolGrpNameResponse, "resource-version")
def relationshipList = ""
if (utils.nodeExists(requeryAAIVolGrpNameResponse, "relationship")) {
relationshipList = rebuildRelationship(requeryAAIVolGrpNameResponse)
}
requestPayload =
"""
${groupId}
${volumeName}
${heatStackId}
${vnfType}
Active
${resourceVersion}
${relationshipList}
"""
}
return requestPayload
}
/**
* This method returns the string for Update Volume Request payload
* @param requeryAAIVolGrpNameResponse the response of query volume group name (in AAI)
* @param heatStackId the value of heat stack id
* @return String request payload
*/
def String UpdateNetworkVolumeRequest(requeryAAIVolGrpNameResponse, heatStackId) {
String requestPayload = ""
if (requeryAAIVolGrpNameResponse != null) {
def groupId = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-id")
def volumeName = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-name")
def vnfType = utils.getNodeText(requeryAAIVolGrpNameResponse, "vnf-type")
def resourceVersion = utils.getNodeText(requeryAAIVolGrpNameResponse, "resource-version")
def relationshipList = ""
if (utils.nodeExists(requeryAAIVolGrpNameResponse, "relationship")) {
relationshipList = rebuildRelationship(requeryAAIVolGrpNameResponse)
}
requestPayload =
"""
${groupId}
${volumeName}
${heatStackId}
${vnfType}
Active
${resourceVersion}
${relationshipList}
"""
}
return requestPayload
}
/**
* This method returns the string for Create Contrail Network payload
* @param requeryIdAAIResponse the response from AAI query by id
* @param createNetworkResponse the response of create network
* @return String contrailNetworkCreatedUpdate
*/
def ContrailNetworkCreatedUpdate(requeryIdAAIResponse, createNetworkResponse, schemaVersion) {
String contrailNetworkCreatedUpdate = ""
if(requeryIdAAIResponse!=null && createNetworkResponse!=null) {
def l3Network = utils.getNodeXml(requeryIdAAIResponse, "l3-network", false).replace("tag0:","").replace(":tag0","")
def createNetworkContrailResponse = ""
if (utils.nodeExists(createNetworkResponse, 'createNetworkResponse')) {
createNetworkContrailResponse = utils.getNodeXml(createNetworkResponse, "createNetworkResponse", false).replace("tag0:","").replace(":tag0","")
} else {
createNetworkContrailResponse = utils.getNodeXml(createNetworkResponse, "updateNetworkContrailResponse", false).replace("tag0:","").replace(":tag0","")
}
// rebuild network
def networkList = ["network-id", "network-name", "network-type", "network-role", "network-technology", "neutron-network-id", "is-bound-to-vpn", "service-id", "network-role-instance", "resource-version", "resource-model-uuid", "orchestration-status", "heat-stack-id", "mso-catalog-key", "contrail-network-fqdn",
"physical-network-name", "is-provider-network", "is-shared-network", "is-external-network"]
String rebuildNetworkElements = buildNetworkElements(l3Network, createNetworkContrailResponse, networkList)
// rebuild 'subnets'
def rebuildSubnetList = ""
if (utils.nodeExists(requeryIdAAIResponse, 'subnet')) {
rebuildSubnetList = buildSubnets(requeryIdAAIResponse, createNetworkResponse)
}
// rebuild 'segmentation-assignments'
def rebuildSegmentationAssignments = ""
if (utils.nodeExists(requeryIdAAIResponse, 'segmentation-assignments')) {
List elementList = ["segmentation-id"]
rebuildSegmentationAssignments = buildXMLElements(requeryIdAAIResponse, "", "segmentation-assignments", elementList)
}
// rebuild 'ctag-assignments' / rebuildCtagAssignments
def rebuildCtagAssignmentsList = ""
if (utils.nodeExists(requeryIdAAIResponse, 'ctag-assignment')) {
rebuildCtagAssignmentsList = rebuildCtagAssignments(requeryIdAAIResponse)
}
// rebuild 'relationship'
def relationshipList = ""
if (utils.nodeExists(requeryIdAAIResponse, 'relationship-list')) {
String rootRelationshipData = getFirstNodeXml(requeryIdAAIResponse, "relationship-list").drop(38).trim().replace("tag0:","").replace(":tag0","")
if (utils.nodeExists(rootRelationshipData, 'relationship')) {
relationshipList = rebuildRelationship(rootRelationshipData)
}
}
//Check for optional contrail network fqdn within CreateNetworkResponse
String contrailNetworkFQDN
if(utils.nodeExists(createNetworkResponse, "contrail-network-fqdn")){
contrailNetworkFQDN = utils.getNodeXml(createNetworkResponse, "contrail-network-fqdn")
contrailNetworkFQDN = utils.removeXmlNamespaces(contrailNetworkFQDN)
contrailNetworkFQDN = utils.removeXmlPreamble(contrailNetworkFQDN)
}else{
contrailNetworkFQDN = ""
}
contrailNetworkCreatedUpdate =
"""
${rebuildNetworkElements}
${rebuildSubnetList}
${rebuildSegmentationAssignments}
${rebuildCtagAssignmentsList}
${relationshipList}
${contrailNetworkFQDN}
""".trim()
}
return contrailNetworkCreatedUpdate
}
/**
* This method returns the value for the name paramName.
* Ex:
* 1
* 0
*
*
* @param xmlInput the XML document
* @param paramName the param name (ex: 'shared')
* @return a param value for 'shared' (ex: '1')
*/
def getParameterValue(xmlInput, paramName) {
def rtn=""
if(xmlInput!=null){
def xml= new XmlSlurper().parseText(xmlInput)
rtn= xml.'**'.find {param->param.'@name'.text() == paramName}
}
if (rtn==null) {
return ""
} else {
return rtn
}
}
/**
* This method returns the name of param if found/match with paramName.
* Ex:
* 1
* 0
*
*
* @param xmlInput the XML document
* @param paramName the param name (ex: 'shared', )
* @return a param name for 'shared' (ex: 'shared' if found)
*/
def getParameterName(xmlInput, paramName) {
def rtn=""
if(xmlInput!=null){
def xml= new XmlSlurper().parseText(xmlInput)
try {
rtn= xml.'**'.find {param->param.'@name' == paramName}.'@name'
} catch (Exception ex) {
rtn=""
}
}
if (rtn==null || rtn=="") {
return ""
} else {
return rtn
}
}
/**
* This method returns the networkParams xml string.
* Ex: input:
*
* 1
* 0
*
*
* Sample result:
*
* 1
* 0
*
*
*/
def buildParams(networkParams) {
def build = ""
def netParams = new XmlParser().parseText(networkParams)
try {
def paramsList = netParams.'**'.findAll {param->param.'@name'}.'@name'
if (paramsList.size() > 0) {
build += ""
for (i in 0..paramsList.size()-1) {
def name = netParams.'**'.find {param->param.'@name' == paramsList[i]}.'@name'
def value= netParams.'**'.find {param->param.'@name' == paramsList[i]}.text()
build += "<${name}>${value}${name}>"
}
build += ""
}
} catch (Exception ex) {
println ' buildParams error - ' + ex.getMessage()
build = ""
}
return build
}
def getVlans(xmlInput) {
def rtn = ""
if (xmlInput!=null) {
def vlansList = getListWithElements(xmlInput, 'vlans')
def vlansListSize = vlansList.size()
if (vlansListSize > 0) {
for (i in 0..vlansListSize-1) {
rtn += ''+vlansList[i]+''
}
}
}
return rtn
}
/**
* This method returns the uri value for the vpn bindings.
* Return the a list of value of vpn binding in the string.
* Ex.
*
*
* vpn-binding
* https://aai-app-e2e.test.att.com:8443/aai/v6/network/vpn-bindings/vpn-binding/85f015d0-2e32-4c30-96d2-87a1a27f8017/
*
* vpn-binding.vpn-id
* 85f015d0-2e32-4c30-96d2-87a1a27f8017
*
*
*
* vpn-binding
* https://aai-ext1.test.att.com:8443/aai/v6/network/vpn-bindings/vpn-binding/24a4b507-853a-4a38-99aa-05fcc54be24d/
*
* vpn-binding.vpn-id
* 24a4b507-853a-4a38-99aa-05fcc54be24d
*
*
* vpn-binding.vpn-name
* oam_protected_net_6_MTN5_msotest1
*
*
* @param xmlInput the XML document
* @return a list of vpn binding values
* ex: ['aai/v6/network/vpn-bindings/vpn-binding/85f015d0-2e32-4c30-96d2-87a1a27f8017/', 'aai/v6/network/vpn-bindings/vpn-binding/c980a6ef-3b88-49f0-9751-dbad8608d0a6/']
*
**/
def getVnfBindingObject(xmlInput) {
//def rtn = null
List rtn = []
if (xmlInput!=null) {
def relationshipList = getListWithElements(xmlInput, 'relationship')
def relationshipListSize = relationshipList.size()
if (relationshipListSize > 0) {
for (i in 0..relationshipListSize-1) {
def relationshipXml = XmlUtil.serialize(relationshipList[i])
if (utils.getNodeText(relationshipXml, 'related-to') == "vpn-binding") {
def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
if (relatedLink != null || relatedLink != "") {
rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
}
}
}
}
}
return rtn
}
/**
* similar to VNF bindings method
* @param xmlInput the XML document
* @return a list of network policy values
* ex: ['aai/v$/network/network-policies/network-policy/cee6d136-e378-4678-a024-2cd15f0ee0cg', 'aai/v$/network/network-policies/network-policy/cee6d136-e378-4678-a024-2cd15f0ee0cg']
*
**/
def getNetworkPolicyObject(xmlInput) {
//def rtn = null
List rtn = []
if (xmlInput!=null) {
def relationshipList = getListWithElements(xmlInput, 'relationship')
def relationshipListSize = relationshipList.size()
if (relationshipListSize > 0) {
for (i in 0..relationshipListSize-1) {
def relationshipXml = XmlUtil.serialize(relationshipList[i])
if (utils.getNodeText(relationshipXml, 'related-to') == "network-policy") {
def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
if (relatedLink != null || relatedLink != "") {
rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
}
}
}
}
}
return rtn
}
/**
* similar to network policymethod
* @param xmlInput the XML document
* @return a list of network policy values
* ex: ['aai/v$/network/route-table-references/route-table-reference/refFQDN1', 'aai/v$/network/route-table-references/route-table-reference/refFQDN2']
*
**/
def getNetworkTableRefObject(xmlInput) {
//def rtn = null
List rtn = []
if (xmlInput!=null) {
def relationshipList = getListWithElements(xmlInput, 'relationship')
def relationshipListSize = relationshipList.size()
if (relationshipListSize > 0) {
for (i in 0..relationshipListSize-1) {
def relationshipXml = XmlUtil.serialize(relationshipList[i])
if (utils.getNodeText(relationshipXml, 'related-to') == "route-table-reference") {
def relatedLink = utils.getNodeText1(relationshipXml, 'related-link')
if (relatedLink != null || relatedLink != "") {
rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
}
}
}
}
}
return rtn
}
def isVfRelationshipExist(xmlInput) {
Boolean rtn = false
if (xmlInput!=null) {
def relationshipList = getListWithElements(xmlInput, 'relationship')
def relationshipListSize = relationshipList.size()
if (relationshipListSize > 0) {
for (i in 0..relationshipListSize-1) {
def relationshipXml = XmlUtil.serialize(relationshipList[i])
if (utils.getNodeText(relationshipXml, 'related-to') == "vf-module") {
rtn = true
}
}
}
}
return rtn
}
def isInstanceValueMatch(linkResource, globalSubscriberId, serviceType) {
Boolean rtn = false
try {
String globalSubscriberIdLink = linkResource.substring(linkResource.indexOf("/customer/")+10, linkResource.indexOf("/service-subscriptions"))
String serviceTypeLink = linkResource.substring(linkResource.indexOf("/service-subscription/")+22, linkResource.indexOf("/service-instances"))
if (globalSubscriberIdLink == globalSubscriberId) {
rtn = true
} else {
if (serviceTypeLink == serviceType) {
rtn = true
}
}
} catch (Exception ex) {
println 'Exception - ' + ex.getMessage()
return false
}
return rtn
}
def getListWithElements(xmlInput, groupName) {
def rtn = ""
if (xmlInput != null) {
def relationshipData = new XmlSlurper().parseText(xmlInput)
rtn = relationshipData.'**'.findAll {it.name() == groupName}
}
return rtn
}
// build network single elements
def buildNetworkElements(l3Network, createNetworkContrailResponse, networkList) {
def replaceNetworkId = ""
def replaceNeutronNetworkId = ""
def replaceContrailNetworkFqdn = ""
if (l3Network != null && createNetworkContrailResponse != null) {
if (utils.nodeExists(l3Network, 'heat-stack-id')) {
replaceNetworkId = utils.getNodeText(l3Network, 'heat-stack-id')
} else {
if (utils.nodeExists(createNetworkContrailResponse, 'networkStackId')) {
replaceNetworkId = utils.getNodeText(createNetworkContrailResponse, 'networkStackId')
}
}
if (utils.nodeExists(l3Network, 'neutron-network-id')) {
replaceNeutronNetworkId = utils.getNodeText(l3Network, 'neutron-network-id')
} else {
if (utils.nodeExists(createNetworkContrailResponse, 'neutronNetworkId')) {
replaceNeutronNetworkId = utils.getNodeText(createNetworkContrailResponse, 'neutronNetworkId')
}
}
if (utils.nodeExists(l3Network, 'contrail-network-fqdn')) {
replaceContrailNetworkFqdn = utils.getNodeText(l3Network, 'contrail-network-fqdn')
} else {
if (utils.nodeExists(createNetworkContrailResponse, 'networkFqdn')) {
replaceContrailNetworkFqdn = utils.getNodeText(createNetworkContrailResponse, 'networkFqdn')
}
}
}
String var = ""
def xmlNetwork = ""
if (l3Network != null) {
for (element in networkList) {
def xml= new XmlSlurper().parseText(l3Network)
var = xml.'**'.find {it.name() == element}
if (var == null) {
if (element=="orchestration-status") {
xmlNetwork += "<"+element+">"+"active"+""+element+">"
}
if (element=="heat-stack-id") {
if (replaceNetworkId != "") {
xmlNetwork += "<"+element+">"+replaceNetworkId+""+element+">"
}
}
if (element=="neutron-network-id") {
if (replaceNeutronNetworkId != "") {
xmlNetwork += "<"+element+">"+replaceNeutronNetworkId+""+element+">"
}
}
if (element=="contrail-network-fqdn") {
if (replaceContrailNetworkFqdn != "") {
xmlNetwork += "<"+element+">"+replaceContrailNetworkFqdn+""+element+">"
}
}
} else {
if (element=="orchestration-status") {
xmlNetwork += "<"+element+">"+"active"+""+element+">"
} else {
xmlNetwork += "<"+element+">"+var.toString()+""+element+">"
}
}
}
}
return xmlNetwork
}
def buildSubnets(requeryIdAAIResponse, createNetworkResponse) {
def rebuildingSubnets = ""
if (requeryIdAAIResponse != null && utils.nodeExists(requeryIdAAIResponse, 'subnets')) {
def subnetIdMapValue = ""
def subnetsGroup = utils.getNodeXml(requeryIdAAIResponse, "subnets", false)
def subnetsData = new XmlSlurper().parseText(subnetsGroup)
rebuildingSubnets += ""
try {
def subnets = subnetsData.'**'.findAll {it.name() == "subnet"}
def subnetsSize = subnets.size()
for (i in 0..subnetsSize-1) {
def subnet = subnets[i]
def subnetXml = XmlUtil.serialize(subnet)
def subnetList = ["subnet-id", "neutron-subnet-id", "gateway-address", "network-start-address", "cidr-mask", "ip-version", "orchestration-status", "dhcp-enabled", "dhcp-start", "dhcp-end", "resource-version", "subnet-name"]
rebuildingSubnets += buildSubNetworkElements(subnetXml, createNetworkResponse, subnetList, "subnet")
}
if (utils.nodeExists(subnetsData, 'relationship')) {
rebuildingSubnets = rebuildRelationship(requeryIdAAIResponse)
}
} catch (Exception ex) {
// error
} finally {
rebuildingSubnets += ""
}
}
return rebuildingSubnets
}
def buildSubnets(queryIdResponse) {
def rebuildingSubnets = ""
def subnetsData = new XmlSlurper().parseText(queryIdResponse)
//rebuildingSubnets += ""
try {
def subnets = subnetsData.'**'.findAll {it.name() == "subnet"}
def subnetsSize = subnets.size()
for (i in 0..subnetsSize-1) {
def subnet = subnets[i]
def subnetXml = XmlUtil.serialize(subnet)
def subnetList = ["dhcp-start", "dhcp-end", "network-start-address", "cidr-mask", "dhcp-enabled", "gateway-address", "ip-version", "subnet-id", "subnet-name"]
rebuildingSubnets += buildSubNetworkElements(subnetXml, subnetList, "subnets")
//rebuildingSubnets += buildSubNetworkElements(subnetXml, subnetList, "")
}
} catch (Exception ex) {
//
} finally {
//rebuildingSubnets += ""
}
return rebuildingSubnets
}
// build subnet sub-network single elements
def buildSubNetworkElements(subnetXml, createNetworkResponse, elementList, parentName) {
String var = ""
def xmlBuild = ""
if (parentName != "") {
xmlBuild += "<"+parentName+">"
}
if (subnetXml != null) {
for (element in elementList) {
def xml= new XmlSlurper().parseText(subnetXml)
var = xml.'**'.find {it.name() == element}
if (var != null) {
if (element=="orchestration-status") {
xmlBuild += "<"+element+">"+"active"+""+element+">"
} else { // "subnet-id", "neutron-subnet-id"
if (element=="subnet-id") {
if (utils.nodeExists(createNetworkResponse, "subnetMap")) {
xmlBuild += "<"+element+">"+var.toString()+""+element+">"
String neutronSubnetId = extractNeutSubId(createNetworkResponse, var.toString())
xmlBuild += ""+neutronSubnetId+""
}
} else {
if (element=="neutron-subnet-id") {
// skip
} else {
xmlBuild += "<"+element+">"+var.toString()+""+element+">"
}
}
}
}
}
}
if (parentName != "") {
xmlBuild += ""+parentName+">"
}
return xmlBuild
}
// build subnet sub-network single elements
def buildSubNetworkElements(subnetXml, elementList, parentName) {
def var = ""
def xmlBuild = ""
if (parentName != "") {
xmlBuild += "<"+parentName+">"
}
if (subnetXml != null) {
def networkStartAddress = ""
for (element in elementList) {
def xml= new XmlSlurper().parseText(subnetXml)
var = xml.'**'.find {it.name() == element}
if (element == "dhcp-start") {
xmlBuild += ""
if (var.toString() == 'null') {
xmlBuild += ""+""+""
} else {
xmlBuild += ""+var.toString()+""
}
}
if (element == "dhcp-end") {
if (var.toString() == 'null') {
xmlBuild += ""+""+""
} else {
xmlBuild += ""+var.toString()+""
}
xmlBuild += ""
}
if (element == "network-start-address" || element == "cidr-mask") {
if (element == "network-start-address") {
networkStartAddress = var.toString()
}
if (element == "cidr-mask") {
xmlBuild += ""+networkStartAddress+"/"+var.toString()+""
}
}
if (element == "dhcp-enabled") {
xmlBuild += ""+var.toString()+""
}
if (element == "gateway-address") {
xmlBuild += ""+var.toString()+""
}
if (element == "ip-version") {
xmlBuild += ""+var.toString()+""
}
if (element == "subnet-id") {
xmlBuild += ""+var.toString()+""
}
if ((element == "subnet-name") && (var != null)) {
xmlBuild += ""+var.toString()+""
}
}
}
if (parentName != "") {
xmlBuild += ""+parentName+">"
}
return xmlBuild
}
// rebuild ctag-assignments
def rebuildCtagAssignments(xmlInput) {
def rebuildingCtagAssignments = ""
if (xmlInput!=null) {
def ctagAssignmentsData = new XmlSlurper().parseText(xmlInput)
rebuildingCtagAssignments += ""
def ctagAssignments = ctagAssignmentsData.'**'.findAll {it.name() == "ctag-assignment"}
def ctagAssignmentsSize = ctagAssignments.size()
for (i in 0..ctagAssignmentsSize-1) {
def ctagAssignment = ctagAssignments[i]
def ctagAssignmentXml = XmlUtil.serialize(ctagAssignment)
rebuildingCtagAssignments += ""
List elementList = ["vlan-id-inner", "resource-version"]
rebuildingCtagAssignments += buildXMLElements(ctagAssignmentXml, "" , "", elementList)
if (utils.nodeExists(ctagAssignmentXml, 'relationship')) {
rebuildingCtagAssignments += rebuildRelationship(ctagAssignmentXml)
}
rebuildingCtagAssignments += ""
}
rebuildingCtagAssignments += ""
}
return rebuildingCtagAssignments
}
// rebuild 'relationship-list'
def rebuildRelationship(xmlInput) {
def rebuildingSubnets = ""
if (xmlInput!=null) {
def subnetsData = new XmlSlurper().parseText(xmlInput)
rebuildingSubnets += ""
def relationships = subnetsData.'**'.findAll {it.name() == "relationship"}
def relationshipsSize = relationships.size()
for (i in 0..relationshipsSize-1) {
def relationship = relationships[i]
def relationshipXml = XmlUtil.serialize(relationship)
rebuildingSubnets += ""
def relationshipList = ["related-to", "related-link"]
rebuildingSubnets += buildSubNetworkElements(relationshipXml, "", relationshipList, "")
if (utils.nodeExists(relationshipXml, 'relationship-data')) {
def relationshipDataXmlData = new XmlSlurper().parseText(relationshipXml)
def relationshipsData = relationshipDataXmlData.'**'.findAll {it.name() == "relationship-data"}
def relationshipsDataSize = relationshipsData.size()
for (j in 0..relationshipsDataSize-1) {
def relationshipData = relationshipsData[j]
def relationshipDataXml = XmlUtil.serialize(relationshipData)
def relationshipDataList = ["relationship-key", "relationship-value"]
rebuildingSubnets += buildXMLElements(relationshipDataXml, "", "relationship-data", relationshipDataList)
}
}
if (utils.nodeExists(relationshipXml, 'related-to-property')) {
def relationshipDataXmlData = new XmlSlurper().parseText(relationshipXml)
def relationshipsData = relationshipDataXmlData.'**'.findAll {it.name() == "related-to-property"}
def relationshipsDataSize = relationshipsData.size()
for (j in 0..relationshipsDataSize-1) {
def relationshipData = relationshipsData[j]
def relationshipDataXml = XmlUtil.serialize(relationshipData)
def relationshipDataList = ["property-key", "property-value"]
rebuildingSubnets += buildXMLElements(relationshipDataXml, "", "related-to-property", relationshipDataList)
}
}
rebuildingSubnets += ""
}
rebuildingSubnets += ""
}
return rebuildingSubnets
}
def buildVlans(queryIdResponse) {
def rebuildingSubnets = ""
def subnetsData = new XmlSlurper().parseText(queryIdResponse)
try {
def subnets = subnetsData.'**'.findAll {it.name() == "segmentation-assignments"}
def subnetsSize = subnets.size()
for (i in 0..subnetsSize-1) {
def subnet = subnets[i]
def subnetXml = XmlUtil.serialize(subnet)
String vlan = utils.getNodeText1(subnetXml, "segmentation-id")
if (i>0){
rebuildingSubnets += ","
}
rebuildingSubnets += vlan
}
} catch (Exception ex) {
//
} finally {
//rebuildingSubnets += ""
rebuildingSubnets += ""
}
return rebuildingSubnets
}
/* Utility code to rebuild xml/elements in a list:
* rebuild xml with 1) unbounded groups of elements; or
* 2) one group of elements; or
* 3) just one or more elements (in a list as argument)
* @param xmlInput the XML document
* @param parentName the parent name (ex: 'inputs')
* @param childrenName the chilrendName (ex: 'entry' as unbounded/occurs>1)
* @param elementList the element list of children (ex: 'key', 'value')
* @return a string of rebuild xml
*
* Ex 1: xmlInput:
*
*
* name
* Edward
*
*
* age
* 30
*
*
* age
* 30
*
*
* Usage:
* List elementList = ["key", "value"]
* String rebuild = buildXMLElements(xmlInput, "inputs", "entry", elementList)
*
* Ex 2: xmlInput // no parent tag
*
* fec8ec88-151a-45c9-ad60-8233e0fc8ff2
* https://msojra.mtsnj.aic.cip.att.com:8443/adapters/rest/SDNCNotify
* assign
*
* Usage:
* List elementList = ["svc-request-id", "svc-notification-url", "svc-action"]
* String rebuild = buildXMLElements(xmlInput, "" , "sdnc-request-header", elementList) // no parent tag
*
* Ex 3: xmlInput // elements one after another (with no parent & children tag)
* myTestid
* myUser
* Usage:
* List elementList = ["test-id", "test-user"]
* String rebuild = buildXMLElements(xmlInput, "" , "", elementList)
*
*/
def buildXMLElements(xmlInput, parentName, childrenName, elementList) {
def varChildren = ""
def var = ""
def xmlBuildUnbounded = ""
if (parentName!="") {xmlBuildUnbounded += "<"+parentName+">" +'\n'}
if (xmlInput != null) {
def xml= new XmlSlurper().parseText(xmlInput)
if (childrenName!="") {
varChildren = xml.'**'.findAll {it.name() == childrenName}
for (i in 0..varChildren.size()-1) {
xmlBuildUnbounded += "<"+childrenName+">" +'\n'
for (element in elementList) {
var = varChildren[i].'*'.find {it.name() == element}
if (var != null) {
xmlBuildUnbounded += "<"+element+">"+var.toString()+""+element+">" +'\n'
}
}
xmlBuildUnbounded += ""+childrenName+">" +'\n'
}
} else {
for (element in elementList) {
var = xml.'*'.find {it.name() == element}
if (var != null) {
xmlBuildUnbounded += "<"+element+">"+var.toString()+""+element+">" +'\n'
}
}
}
}
if (parentName!="") {xmlBuildUnbounded += ""+parentName+">" +'\n'}
return xmlBuildUnbounded
}
def getFirstNodeXml(xmlInput, element){
def nodeAsText = ""
def nodeToSerialize = ""
if (xmlInput != null) {
def fxml= new XmlSlurper().parseText(xmlInput)
if (utils.nodeExists(xmlInput, "payload")) {
nodeToSerialize = fxml.'payload'.'l3-network'.'*'.find {it.name() == element}
if (nodeToSerialize!=null) {
nodeAsText = XmlUtil.serialize(nodeToSerialize)
} else {
nodeAsText = ""
}
} else {
nodeToSerialize = fxml.'*'.find {it.name() == element}
if (nodeToSerialize!=null) {
nodeAsText = XmlUtil.serialize(nodeToSerialize)
} else {
nodeAsText = ""
}
}
}
return nodeAsText
}
//TODO: This method still needs to be tested before using.
/**
* This method is similar to the gennetwork:ContrailNetworUpdateCompletedObject
* BPEL method. It extracts all of the required subnet information
* for each subnet listed with an orch status equal to the one provided
* and puts the corresponding infomation with the appropriate node for
* updating aai. The method sets the orch status for each subnet to active
*
* @param subnetsXml the entire subnets xml
* @param requestInput the request in the process
* @param queryIdResponse the response of REST AAI query by Id
* @param queryVpnBindingResponse the response of REST AAI query by vpn binding
* @param routeCollection the collection of vpnBinding's 'global-route-target'
* @return String request
*/
public String networkUpdateSubnetInfo(String subnetsXml, String networkResponseXml){
String subnets = ""
StringBuilder sb = new StringBuilder()
InputSource source = new InputSource(new StringReader(subnetsXml));
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setNamespaceAware(true)
DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
Document xml = docBuilder.parse(source)
NodeList nodeList = xml.getElementsByTagNameNS("*", "subnet")
for (int x = 0; x < nodeList.getLength(); x++) {
Node node = nodeList.item(x)
String subnet = ""
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) node
String subnetOrchStatus = eElement.getElementsByTagNameNS("*", "orchestration-status").item(0).getTextContent()
if(subnetOrchStatus.equals("pending-create")){
String subnetId = eElement.getElementsByTagNameNS("*", "subnet-id").item(0).getTextContent()
def netAddress = eElement.getElementsByTagNameNS("*", "network-start-address").item(0).getTextContent()
def mask = eElement.getElementsByTagNameNS("*", "cidr-mask").item(0).getTextContent()
def dhcpEnabledSubnet = eElement.getElementsByTagNameNS("*", "dhcp-enabled").item(0).getTextContent()
def gatewayAddress = eElement.getElementsByTagNameNS("*", "gateway-address").item(0).getTextContent()
def ipVersion = eElement.getElementsByTagNameNS("*", "ip-version").item(0).getTextContent()
def relationshipList = eElement.getElementsByTagNameNS("*", "relationship-list").item(0).getTextContent() //TODO: test this
String neutronSubnetId = extractNeutSubId(networkResponseXml, subnetId)
subnet =
"""
${subnetId}
${neutronSubnetId}
${gatewayAddress}
${netAddress}
${mask}
${ipVersion}
active
${dhcpEnabledSubnet}
${relationshipList}
"""
}else if(subnetOrchStatus.equals("pending-delete")){
StringWriter writer = new StringWriter()
Transformer transformer = TransformerFactory.newInstance().newTransformer()
transformer.transform(new DOMSource(node), new StreamResult(writer))
subnet = writer.toString()
}else{
subnet = ""
}
}
subnets = sb.append(subnet)
}
subnets = utils.removeXmlPreamble(subnets)
String subnetsList =
"""
${subnets}
"""
return subnetsList
}
/**
* This method extracts the "value" node text for the the given subnet Id.
*
* @param String inputSource - xml that contains the subnet id key and value
* @param String subnetId - for which you want the value of
* @return String value - node text of node named value associated with the given subnet id
*/
public String extractNeutSubId(String inputSource, String subnetId){
String value = ""
InputSource source = new InputSource(new StringReader(inputSource));
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setNamespaceAware(true)
DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
Document xml = docBuilder.parse(source)
NodeList nodeList = xml.getElementsByTagNameNS("*", "entry")
for (int x = 0; x < nodeList.getLength(); x++) {
Node node = nodeList.item(x)
String subnet = ""
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) node
String key = eElement.getElementsByTagNameNS("*", "key").item(0).getTextContent()
if(key.equals(subnetId)){
value = eElement.getElementsByTagNameNS("*", "value").item(0).getTextContent()
}
}
}
return value
}
public boolean isRollbackEnabled (Execution execution, String payloadXml) {
boolean rollbackEnabled = false
boolean rollbackValueSet = false
if (utils.nodeExists(payloadXml, "backout-on-failure")) {
String backoutValue = utils.getNodeText1(payloadXml, "backout-on-failure")
if (backoutValue != null && !backoutValue.isEmpty()) {
if (backoutValue.equalsIgnoreCase("false")) {
rollbackEnabled = false
}
else {
rollbackEnabled = true
}
rollbackValueSet = true;
}
}
if (!rollbackValueSet) {
rollbackEnabled = execution.getVariable("URN_mso_rollback")
}
return rollbackEnabled
}
}