2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.so.bpmn.common.scripts
23 import groovy.xml.XmlUtil
24 import org.camunda.bpm.engine.delegate.DelegateExecution
25 import org.onap.so.bpmn.core.UrnPropertiesReader
26 import org.onap.so.logger.MsoLogger
27 import org.w3c.dom.Document
28 import org.w3c.dom.Element
29 import org.w3c.dom.Node
30 import org.w3c.dom.NodeList
31 import org.xml.sax.InputSource
33 import javax.xml.parsers.DocumentBuilder
34 import javax.xml.parsers.DocumentBuilderFactory
35 import javax.xml.transform.Transformer
36 import javax.xml.transform.TransformerFactory
37 import javax.xml.transform.dom.DOMSource
38 import javax.xml.transform.stream.StreamResult
41 * This groovy class supports the any Network processes that need the methods defined here.
44 private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NetworkUtils.class);
47 public MsoUtils utils = new MsoUtils()
48 private AbstractServiceTaskProcessor taskProcessor
50 public NetworkUtils(AbstractServiceTaskProcessor taskProcessor) {
51 this.taskProcessor = taskProcessor
55 * This method returns the string for Network request
56 * V2 for Contrail 3.x will populate cloud-region data in same cloudSiteId filed
57 * Network adapter will handle it properly
58 * @param requestId either 'request-id' or 'mso-request-id'
59 * @param requestInput the request in the process
60 * @param queryIdResponse the response of REST AAI query by Id
61 * @param routeCollection the collection
62 * @param policyFqdns the policy
63 * @param tableCollection the collection
64 * @param cloudRegionId the cloud-region-region
65 * @return String request
67 def CreateNetworkRequestV2(execution, requestId, messageId, requestInput, queryIdResponse, routeCollection, policyFqdns, tableCollection, cloudRegionId, backoutOnFailure, source) {
68 String createNetworkRequest = null
69 if(requestInput!=null && queryIdResponse!=null) {
70 String serviceInstanceId = ""
71 String sharedValue = ""
72 String externalValue = ""
74 if (source == "VID") {
75 sharedValue = utils.getNodeText(queryIdResponse, "is-shared-network") != null ? utils.getNodeText(queryIdResponse, "is-shared-network") : "false"
76 externalValue = utils.getNodeText(queryIdResponse, "is-external-network") != null ? utils.getNodeText(queryIdResponse, "is-external-network") : "false"
77 serviceInstanceId = utils.getNodeText(requestInput, "service-instance-id")
79 } else { // source = 'PORTAL'
80 sharedValue = getParameterValue(requestInput, "shared")
81 externalValue = getParameterValue(requestInput, "external")
82 serviceInstanceId = utils.getNodeText(requestInput, "service-instance-id") != null ? utils.getNodeText(requestInput, "service-instance-id") : ""
85 String networkParams = ""
86 if (utils.nodeExists(requestInput, "network-params")) {
87 String netParams = utils.getNodeXml(requestInput, "network-params", false).replace("tag0:","").replace(":tag0","")
88 networkParams = buildParams(netParams)
91 String failIfExists = "false"
93 String cloudRegion = cloudRegionId
94 String tenantId = utils.getNodeText(requestInput, "tenant-id")
96 String networkType = ""
97 String modelCustomizationUuid = ""
98 if (utils.nodeExists(requestInput, "networkModelInfo")) {
99 String networkModelInfo = utils.getNodeXml(requestInput, "networkModelInfo", false).replace("tag0:","").replace(":tag0","")
100 networkType = utils.getNodeText(networkModelInfo, "modelName")
101 modelCustomizationUuid = utils.getNodeText(networkModelInfo, "modelCustomizationUuid")
103 networkType = utils.getNodeText(queryIdResponse, "network-type")
104 modelCustomizationUuid = utils.getNodeText(requestInput, "modelCustomizationId")
108 String networkName = utils.getNodeText(queryIdResponse, "network-name")
109 String networkId = utils.getNodeText(queryIdResponse, "network-id")
110 String networkTechnology = utils.getNodeText(queryIdResponse, "network-technology")
112 // contrailNetwork - networkTechnology = 'Contrail' vs. 'AIC_SR_IOV')
113 String contrailNetwork = ""
114 if (networkTechnology.contains('Contrail') || networkTechnology.contains('contrail') || networkTechnology.contains('CONTRAIL')) {
115 contrailNetwork = """<contrailNetwork>
116 <shared>${MsoUtils.xmlEscape(sharedValue)}</shared>
117 <external>${MsoUtils.xmlEscape(externalValue)}</external>
121 </contrailNetwork>"""
122 networkTechnology = "CONTRAIL" // replace
127 if (utils.nodeExists(queryIdResponse, "subnets")) {
128 def subnetsGroup = utils.getNodeXml(queryIdResponse, "subnets", false)
129 subnets = buildSubnets(subnetsGroup)
132 String physicalNetworkName = ""
133 physicalNetworkName = utils.getNodeText(queryIdResponse, "physical-network-name")
135 String vlansCollection = buildVlans(queryIdResponse)
137 String notificationUrl = "" //TODO - is this coming from URN? What variable/value to use?
138 //String notificationUrl = execution.getVariable("URN_?????") //TODO - is this coming from URN? What variable/value to use?
140 createNetworkRequest = """
141 <createNetworkRequest>
142 <cloudSiteId>${MsoUtils.xmlEscape(cloudRegion)}</cloudSiteId>
143 <tenantId>${MsoUtils.xmlEscape(tenantId)}</tenantId>
144 <networkId>${MsoUtils.xmlEscape(networkId)}</networkId>
145 <networkName>${MsoUtils.xmlEscape(networkName)}</networkName>
146 <networkType>${MsoUtils.xmlEscape(networkType)}</networkType>
147 <modelCustomizationUuid>${MsoUtils.xmlEscape(modelCustomizationUuid)}</modelCustomizationUuid>
148 <networkTechnology>${MsoUtils.xmlEscape(networkTechnology)}</networkTechnology>
149 <providerVlanNetwork>
150 <physicalNetworkName>${MsoUtils.xmlEscape(physicalNetworkName)}</physicalNetworkName >
152 </providerVlanNetwork>
155 <skipAAI>true</skipAAI>
156 <backout>${MsoUtils.xmlEscape(backoutOnFailure)}</backout>
157 <failIfExists>${MsoUtils.xmlEscape(failIfExists)}</failIfExists>
160 <requestId>${MsoUtils.xmlEscape(requestId)}</requestId>
161 <serviceInstanceId>${MsoUtils.xmlEscape(serviceInstanceId)}</serviceInstanceId>
163 <messageId>${MsoUtils.xmlEscape(messageId)}</messageId>
164 <notificationUrl>${MsoUtils.xmlEscape(notificationUrl)}</notificationUrl>
165 </createNetworkRequest>
168 return createNetworkRequest
173 * This method returns the string for Network request
174 * V2 for Contrail 3.x will populate cloud-region data in same cloudSiteId filed
175 * Network adapter will handle it properly
176 * @param requestId either 'request-id' or 'mso-request-id'
177 * @param requestInput the request in the process
178 * @param queryIdResponse the response of REST AAI query by Id
179 * @param routeCollection the collection
180 * @param policyFqdns the policy
181 * @param cloudRegionId the cloud-region-region
182 * @return String request
184 def UpdateNetworkRequestV2(execution, requestId, messageId, requestInput, queryIdResponse, routeCollection, policyFqdns, tableCollection, cloudRegionId, backoutOnFailure, source) {
185 String updateNetworkRequest = null
186 if(requestInput!=null && queryIdResponse!=null) {
187 String serviceInstanceId = ""
188 String sharedValue = ""
189 String externalValue = ""
191 if (source == "VID") {
192 sharedValue = utils.getNodeText(queryIdResponse, "is-shared-network") != null ? utils.getNodeText(queryIdResponse, "is-shared-network") : "false"
193 externalValue = utils.getNodeText(queryIdResponse, "is-external-network") != null ? utils.getNodeText(queryIdResponse, "is-external-network") : "false"
194 serviceInstanceId = utils.getNodeText(requestInput, "service-instance-id")
196 } else { // source = 'PORTAL'
197 sharedValue = getParameterValue(requestInput, "shared")
198 externalValue = getParameterValue(requestInput, "external")
199 serviceInstanceId = utils.getNodeText(requestInput, "service-instance-id") != null ? utils.getNodeText(requestInput, "service-instance-id") : ""
202 String failIfExists = "false"
204 String cloudRegion = cloudRegionId
205 String tenantId = utils.getNodeText(requestInput, "tenant-id")
208 String networkName = utils.getNodeText(queryIdResponse, "network-name")
209 String networkId = utils.getNodeText(queryIdResponse, "network-id")
211 String networkType = ""
212 String modelCustomizationUuid = ""
213 if (utils.nodeExists(requestInput, "networkModelInfo")) {
214 String networkModelInfo = utils.getNodeXml(requestInput, "networkModelInfo", false).replace("tag0:","").replace(":tag0","")
215 networkType = utils.getNodeText(networkModelInfo, "modelName")
216 modelCustomizationUuid = utils.getNodeText(networkModelInfo, "modelCustomizationUuid")
218 networkType = utils.getNodeText(queryIdResponse, "network-type")
219 modelCustomizationUuid = utils.getNodeText(requestInput, "modelCustomizationId")
224 if (utils.nodeExists(queryIdResponse, "subnets")) {
225 def subnetsGroup = utils.getNodeXml(queryIdResponse, "subnets", false)
226 subnets = buildSubnets(subnetsGroup)
229 String networkParams = ""
230 if (utils.nodeExists(requestInput, "network-params")) {
231 String netParams = utils.getNodeXml(requestInput, "network-params", false).replace("tag0:","").replace(":tag0","")
232 networkParams = buildParams(netParams)
235 String networkStackId = utils.getNodeText(queryIdResponse, "heat-stack-id")
236 if (networkStackId == 'null' || networkStackId == "" || networkStackId == null) {
237 networkStackId = "force_update"
240 String physicalNetworkName = utils.getNodeText(queryIdResponse, "physical-network-name")
241 String vlansCollection = buildVlans(queryIdResponse)
243 updateNetworkRequest =
244 """<updateNetworkRequest>
245 <cloudSiteId>${MsoUtils.xmlEscape(cloudRegion)}</cloudSiteId>
246 <tenantId>${MsoUtils.xmlEscape(tenantId)}</tenantId>
247 <networkId>${MsoUtils.xmlEscape(networkId)}</networkId>
248 <networkStackId>${MsoUtils.xmlEscape(networkStackId)}</networkStackId>
249 <networkName>${MsoUtils.xmlEscape(networkName)}</networkName>
250 <networkType>${MsoUtils.xmlEscape(networkType)}</networkType>
251 <modelCustomizationUuid>${MsoUtils.xmlEscape(modelCustomizationUuid)}</modelCustomizationUuid>
252 <networkTypeVersion/>
253 <networkTechnology>CONTRAIL</networkTechnology>
254 <providerVlanNetwork>
255 <physicalNetworkName>${MsoUtils.xmlEscape(physicalNetworkName)}</physicalNetworkName>
257 </providerVlanNetwork>
259 <shared>${MsoUtils.xmlEscape(sharedValue)}</shared>
260 <external>${MsoUtils.xmlEscape(externalValue)}</external>
266 <skipAAI>true</skipAAI>
267 <backout>${MsoUtils.xmlEscape(backoutOnFailure)}</backout>
268 <failIfExists>${MsoUtils.xmlEscape(failIfExists)}</failIfExists>
272 <requestId>${MsoUtils.xmlEscape(requestId)}</requestId>
273 <serviceInstanceId>${MsoUtils.xmlEscape(serviceInstanceId)}</serviceInstanceId>
275 <messageId>${MsoUtils.xmlEscape(messageId)}</messageId>
276 <notificationUrl></notificationUrl>
277 </updateNetworkRequest>""".trim()
280 return updateNetworkRequest
285 * This method returns the string for Create Volume Request payload
286 * @param groupId the volume-group-id
287 * @param volumeName the volume-group-name
288 * @param vnfType the vnf-type
289 * @param tenantId the value of relationship-key 'tenant.tenant-id'
290 * @return String request payload
292 def String CreateNetworkVolumeRequest(groupId, volumeName, vnfType, tenantId) {
294 String requestPayload =
295 """<volume-group xmlns="http://org.onap.so/v6">
296 <volume-group-id>${MsoUtils.xmlEscape(groupId)}</volume-group-id>
297 <volume-group-name>${MsoUtils.xmlEscape(volumeName)}</volume-group-name>
298 <heat-stack-id></heat-stack-id>
299 <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
300 <orchestration-status>Pending</orchestration-status>
303 <related-to>tenant</related-to>
305 <relationship-key>tenant.tenant-id</relationship-key>
306 <relationship-value>${MsoUtils.xmlEscape(tenantId)}</relationship-value>
312 return requestPayload
316 * This method returns the string for Update Volume Request payload
317 * @param requeryAAIVolGrpNameResponse the response of query volume group name (in AAI)
318 * @param heatStackId the value of heat stack id
319 * @return String request payload
321 def String updateCloudRegionVolumeRequest(requeryAAIVolGrpNameResponse, heatStackId, namespace, modelCustomizationId) {
322 String requestPayload = ""
323 if (requeryAAIVolGrpNameResponse != null) {
324 def groupId = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-id")
325 def volumeName = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-name")
326 def vnfType = utils.getNodeText(requeryAAIVolGrpNameResponse, "vnf-type")
327 def resourceVersion = utils.getNodeText(requeryAAIVolGrpNameResponse, "resource-version")
328 def relationshipList = ""
329 if (utils.nodeExists(requeryAAIVolGrpNameResponse, "relationship")) {
330 relationshipList = rebuildRelationship(requeryAAIVolGrpNameResponse)
334 """<volume-group xmlns="${namespace}">
335 <volume-group-id>${MsoUtils.xmlEscape(groupId)}</volume-group-id>
336 <volume-group-name>${MsoUtils.xmlEscape(volumeName)}</volume-group-name>
337 <heat-stack-id>${MsoUtils.xmlEscape(heatStackId)}</heat-stack-id>
338 <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
339 <orchestration-status>Active</orchestration-status>
340 <resource-version>${MsoUtils.xmlEscape(resourceVersion)}</resource-version>
341 <vf-module-model-customization-id>${MsoUtils.xmlEscape(modelCustomizationId)}</vf-module-model-customization-id>
346 return requestPayload
351 * This method returns the string for Update Volume Request payload
352 * @param requeryAAIVolGrpNameResponse the response of query volume group name (in AAI)
353 * @param heatStackId the value of heat stack id
354 * @return String request payload
356 def String UpdateNetworkVolumeRequest(requeryAAIVolGrpNameResponse, heatStackId) {
357 String requestPayload = ""
358 if (requeryAAIVolGrpNameResponse != null) {
359 def groupId = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-id")
360 def volumeName = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-name")
361 def vnfType = utils.getNodeText(requeryAAIVolGrpNameResponse, "vnf-type")
362 def resourceVersion = utils.getNodeText(requeryAAIVolGrpNameResponse, "resource-version")
363 def relationshipList = ""
364 if (utils.nodeExists(requeryAAIVolGrpNameResponse, "relationship")) {
365 relationshipList = rebuildRelationship(requeryAAIVolGrpNameResponse)
369 """<volume-group xmlns="http://org.onap.so/v6">
370 <volume-group-id>${MsoUtils.xmlEscape(groupId)}</volume-group-id>
371 <volume-group-name>${MsoUtils.xmlEscape(volumeName)}</volume-group-name>
372 <heat-stack-id>${MsoUtils.xmlEscape(heatStackId)}</heat-stack-id>
373 <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
374 <orchestration-status>Active</orchestration-status>
375 <resource-version>${MsoUtils.xmlEscape(resourceVersion)}</resource-version>
380 return requestPayload
384 * This method returns the string for Create Contrail Network payload
385 * @param requeryIdAAIResponse the response from AAI query by id
386 * @param createNetworkResponse the response of create network
387 * @return String contrailNetworkCreatedUpdate
389 def ContrailNetworkCreatedUpdate(requeryIdAAIResponse, createNetworkResponse, schemaVersion) {
391 String contrailNetworkCreatedUpdate = ""
392 if(requeryIdAAIResponse!=null && createNetworkResponse!=null) {
394 def l3Network = utils.getNodeXml(requeryIdAAIResponse, "l3-network", false).replace("tag0:","").replace(":tag0","")
395 def createNetworkContrailResponse = ""
396 if (utils.nodeExists(createNetworkResponse, 'createNetworkResponse')) {
397 createNetworkContrailResponse = utils.getNodeXml(createNetworkResponse, "createNetworkResponse", false).replace("tag0:","").replace(":tag0","")
399 createNetworkContrailResponse = utils.getNodeXml(createNetworkResponse, "updateNetworkContrailResponse", false).replace("tag0:","").replace(":tag0","")
403 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",
404 "physical-network-name", "is-provider-network", "is-shared-network", "is-external-network"]
405 String rebuildNetworkElements = buildNetworkElements(l3Network, createNetworkContrailResponse, networkList)
408 def rebuildSubnetList = ""
409 if (utils.nodeExists(requeryIdAAIResponse, 'subnet')) {
410 rebuildSubnetList = buildSubnets(requeryIdAAIResponse, createNetworkResponse)
413 // rebuild 'segmentation-assignments'
414 def rebuildSegmentationAssignments = ""
415 if (utils.nodeExists(requeryIdAAIResponse, 'segmentation-assignments')) {
416 List elementList = ["segmentation-id", "resource-version"]
417 if (utils.nodeExists(requeryIdAAIResponse, 'segmentation-assignment')) { // new tag
418 rebuildSegmentationAssignments = buildXMLElements(requeryIdAAIResponse, "segmentation-assignments", "segmentation-assignment", elementList)
420 rebuildSegmentationAssignments = buildXMLElements(requeryIdAAIResponse, "", "segmentation-assignments", elementList)
424 // rebuild 'ctag-assignments' / rebuildCtagAssignments
425 def rebuildCtagAssignmentsList = ""
426 if (utils.nodeExists(requeryIdAAIResponse, 'ctag-assignment')) {
427 rebuildCtagAssignmentsList = rebuildCtagAssignments(requeryIdAAIResponse)
430 // rebuild 'relationship'
431 def relationshipList = ""
432 if (utils.nodeExists(requeryIdAAIResponse, 'relationship-list')) {
433 String rootRelationshipData = getFirstNodeXml(requeryIdAAIResponse, "relationship-list").drop(38).trim().replace("tag0:","").replace(":tag0","")
434 if (utils.nodeExists(rootRelationshipData, 'relationship')) {
435 relationshipList = rebuildRelationship(rootRelationshipData)
439 //Check for optional contrail network fqdn within CreateNetworkResponse
440 String contrailNetworkFQDN
441 if(utils.nodeExists(createNetworkResponse, "contrail-network-fqdn")){
442 contrailNetworkFQDN = utils.getNodeXml(createNetworkResponse, "contrail-network-fqdn")
443 contrailNetworkFQDN = utils.removeXmlNamespaces(contrailNetworkFQDN)
444 contrailNetworkFQDN = utils.removeXmlPreamble(contrailNetworkFQDN)
446 contrailNetworkFQDN = ""
449 contrailNetworkCreatedUpdate =
450 """<l3-network xmlns="${schemaVersion}">
451 ${rebuildNetworkElements}
453 ${rebuildSegmentationAssignments}
454 ${rebuildCtagAssignmentsList}
456 ${contrailNetworkFQDN}
457 </l3-network>""".trim()
460 return contrailNetworkCreatedUpdate
466 * This method returns the value for the name paramName.
467 * Ex: <network-params>
468 * <param name="shared">1</param>
469 * <param name="external">0</external>
472 * @param xmlInput the XML document
473 * @param paramName the param name (ex: 'shared')
474 * @return a param value for 'shared' (ex: '1')
476 def getParameterValue(xmlInput, paramName) {
479 def xml= new XmlSlurper().parseText(xmlInput)
480 rtn= xml.'**'.find {param->param.'@name'.text() == paramName}
490 * This method returns the name of param if found/match with paramName.
491 * Ex: <network-params>
492 * <param name="shared">1</param>
493 * <param name="external">0</external>
496 * @param xmlInput the XML document
497 * @param paramName the param name (ex: 'shared', )
498 * @return a param name for 'shared' (ex: 'shared' if found)
500 def getParameterName(xmlInput, paramName) {
503 def xml= new XmlSlurper().parseText(xmlInput)
505 rtn= xml.'**'.find {param->param.'@name' == paramName}.'@name'
506 } catch (Exception ex) {
510 if (rtn==null || rtn=="") {
518 * This method returns the networkParams xml string.
521 * <param name="shared">1</param>
522 * <param name="external">0</external>
528 * <external>0</external>
533 def buildParams(networkParams) {
535 def netParams = new XmlParser().parseText(networkParams)
537 def paramsList = netParams.'**'.findAll {param->param.'@name'}.'@name'
538 if (paramsList.size() > 0) {
539 build += "<networkParams>"
540 for (i in 0..paramsList.size()-1) {
541 def name = netParams.'**'.find {param->param.'@name' == paramsList[i]}.'@name'
542 def value= netParams.'**'.find {param->param.'@name' == paramsList[i]}.text()
543 build += "<${name}>${MsoUtils.xmlEscape(value)}</${name}>"
545 build += "</networkParams>"
548 } catch (Exception ex) {
549 println ' buildParams error - ' + ex.getMessage()
555 def getVlans(xmlInput) {
557 if (xmlInput!=null) {
558 def vlansList = getListWithElements(xmlInput, 'vlans')
559 def vlansListSize = vlansList.size()
560 if (vlansListSize > 0) {
561 for (i in 0..vlansListSize-1) {
562 rtn += '<vlans>'+vlansList[i]+'</vlans>'
572 * This method returns the uri value for the vpn bindings.
573 * Return the a list of value of vpn binding in the <related-link> string.
575 * <relationship-list>
577 * <related-to>vpn-binding</related-to>
578 * <related-link>https://aai-app-e2e.test.openecomp.com:8443/aai/v6/network/vpn-bindings/vpn-binding/85f015d0-2e32-4c30-96d2-87a1a27f8017/</related-link>
579 * <relationship-data>
580 * <relationship-key>vpn-binding.vpn-id</relationship-key>
581 * <relationship-value>85f015d0-2e32-4c30-96d2-87a1a27f8017</relationship-value>
582 * </relationship-data>
585 * <related-to>vpn-binding</related-to>
586 * <related-link>https://aai-ext1.test.openecomp.com:8443/aai/v6/network/vpn-bindings/vpn-binding/24a4b507-853a-4a38-99aa-05fcc54be24d/</related-link>
587 * <relationship-data>
588 * <relationship-key>vpn-binding.vpn-id</relationship-key>
589 * <relationship-value>24a4b507-853a-4a38-99aa-05fcc54be24d</relationship-value>
590 * </relationship-data>
591 * <related-to-property>
592 * <property-key>vpn-binding.vpn-name</property-key>
593 * <property-value>oam_protected_net_6_MTN5_msotest1</property-value>
594 * </related-to-property>
596 * @param xmlInput the XML document
597 * @return a list of vpn binding values
598 * 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/']
601 def getVnfBindingObject(xmlInput) {
604 if (xmlInput!=null) {
605 def relationshipList = getListWithElements(xmlInput, 'relationship')
606 def relationshipListSize = relationshipList.size()
607 if (relationshipListSize > 0) {
608 for (i in 0..relationshipListSize-1) {
609 def relationshipXml = XmlUtil.serialize(relationshipList[i])
610 if (utils.getNodeText(relationshipXml, 'related-to') == "vpn-binding") {
611 def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
612 if (relatedLink != null || relatedLink != "") {
613 rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
622 * similar to VNF bindings method
623 * @param xmlInput the XML document
624 * @return a list of network policy values
625 * 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']
628 def getNetworkPolicyObject(xmlInput) {
631 if (xmlInput!=null) {
632 def relationshipList = getListWithElements(xmlInput, 'relationship')
633 def relationshipListSize = relationshipList.size()
634 if (relationshipListSize > 0) {
635 for (i in 0..relationshipListSize-1) {
636 def relationshipXml = XmlUtil.serialize(relationshipList[i])
637 if (utils.getNodeText(relationshipXml, 'related-to') == "network-policy") {
638 def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
639 if (relatedLink != null || relatedLink != "") {
640 rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
650 * similar to network policymethod
651 * @param xmlInput the XML document
652 * @return a list of network policy values
653 * ex: ['aai/v$/network/route-table-references/route-table-reference/refFQDN1', 'aai/v$/network/route-table-references/route-table-reference/refFQDN2']
656 def getNetworkTableRefObject(xmlInput) {
659 if (xmlInput!=null) {
660 def relationshipList = getListWithElements(xmlInput, 'relationship')
661 def relationshipListSize = relationshipList.size()
662 if (relationshipListSize > 0) {
663 for (i in 0..relationshipListSize-1) {
664 def relationshipXml = XmlUtil.serialize(relationshipList[i])
665 if (utils.getNodeText(relationshipXml, 'related-to') == "route-table-reference") {
666 def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
667 if (relatedLink != null || relatedLink != "") {
668 rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
678 * similar to network policymethod
679 * @param xmlInput the XML document
680 * @return a list of IDs for related VNF instances
683 def getRelatedVnfIdList(xmlInput) {
686 if (xmlInput!=null) {
687 def relationshipList = getListWithElements(xmlInput, 'relationship')
688 def relationshipListSize = relationshipList.size()
689 if (relationshipListSize > 0) {
690 for (i in 0..relationshipListSize-1) {
691 def relationshipXml = XmlUtil.serialize(relationshipList[i])
692 if (utils.getNodeText(relationshipXml, 'related-to') == "generic-vnf") {
693 def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
694 if (relatedLink != null || relatedLink != "") {
695 if (relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()).contains('/')) {
696 rtn.add(relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()-1))
698 rtn.add(relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()))
709 * similar to network policymethod
710 * @param xmlInput the XML document
711 * @return a list of IDs for related Network instances
714 def getRelatedNetworkIdList(xmlInput) {
717 if (xmlInput!=null) {
718 def relationshipList = getListWithElements(xmlInput, 'relationship')
719 def relationshipListSize = relationshipList.size()
720 if (relationshipListSize > 0) {
721 for (i in 0..relationshipListSize-1) {
722 def relationshipXml = XmlUtil.serialize(relationshipList[i])
723 if (utils.getNodeText(relationshipXml, 'related-to') == "l3-network") {
724 def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
725 if (relatedLink != null || relatedLink != "") {
726 if (relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()).contains('/')) {
727 rtn.add(relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()-1))
729 rtn.add(relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()))
740 def isInstanceValueMatch(linkResource, globalSubscriberId, serviceType) {
743 String globalSubscriberIdLink = linkResource.substring(linkResource.indexOf("/customer/")+10, linkResource.indexOf("/service-subscriptions"))
744 String serviceTypeLink = linkResource.substring(linkResource.indexOf("/service-subscription/")+22, linkResource.indexOf("/service-instances"))
745 if (globalSubscriberIdLink == globalSubscriberId) {
748 if (serviceTypeLink == serviceType) {
753 } catch (Exception ex) {
754 println 'Exception - ' + ex.getMessage()
760 def getListWithElements(xmlInput, groupName) {
762 if (xmlInput != null) {
763 def relationshipData = new XmlSlurper().parseText(xmlInput)
764 rtn = relationshipData.'**'.findAll {it.name() == groupName}
770 // build network single elements
771 def buildNetworkElements(l3Network, createNetworkContrailResponse, networkList) {
772 def replaceNetworkId = ""
773 def replaceNeutronNetworkId = ""
774 def replaceContrailNetworkFqdn = ""
775 if (l3Network != null && createNetworkContrailResponse != null) {
776 if (utils.nodeExists(l3Network, 'heat-stack-id')) {
777 replaceNetworkId = utils.getNodeText(l3Network, 'heat-stack-id')
779 if (utils.nodeExists(createNetworkContrailResponse, 'networkStackId')) {
780 replaceNetworkId = utils.getNodeText(createNetworkContrailResponse, 'networkStackId')
783 if (utils.nodeExists(l3Network, 'neutron-network-id')) {
784 replaceNeutronNetworkId = utils.getNodeText(l3Network, 'neutron-network-id')
786 if (utils.nodeExists(createNetworkContrailResponse, 'neutronNetworkId')) {
787 replaceNeutronNetworkId = utils.getNodeText(createNetworkContrailResponse, 'neutronNetworkId')
790 if (utils.nodeExists(l3Network, 'contrail-network-fqdn')) {
791 replaceContrailNetworkFqdn = utils.getNodeText(l3Network, 'contrail-network-fqdn')
793 if (utils.nodeExists(createNetworkContrailResponse, 'networkFqdn')) {
794 replaceContrailNetworkFqdn = utils.getNodeText(createNetworkContrailResponse, 'networkFqdn')
801 if (l3Network != null) {
802 for (element in networkList) {
803 def xml= new XmlSlurper().parseText(l3Network)
804 var = xml.'**'.find {it.name() == element}
806 if (element=="orchestration-status") {
807 if (var.toString() == 'pending-create' || var.toString() == 'PendingCreate') {
808 xmlNetwork += "<"+element+">"+"Created"+"</"+element+">"
809 } else { //pending-update or PendingUpdate
810 xmlNetwork += "<"+element+">"+"Active"+"</"+element+">"
813 if (element=="heat-stack-id") {
814 if (replaceNetworkId != "") {
815 xmlNetwork += "<"+element+">"+replaceNetworkId+"</"+element+">"
818 if (element=="neutron-network-id") {
819 if (replaceNeutronNetworkId != "") {
820 xmlNetwork += "<"+element+">"+replaceNeutronNetworkId+"</"+element+">"
823 if (element=="contrail-network-fqdn") {
824 if (replaceContrailNetworkFqdn != "") {
825 xmlNetwork += "<"+element+">"+replaceContrailNetworkFqdn+"</"+element+">"
830 if (element=="orchestration-status") {
831 if (element=="orchestration-status") {
832 if (var.toString() == 'pending-create' || var.toString() == 'PendingCreate') {
833 xmlNetwork += "<"+element+">"+"Created"+"</"+element+">"
834 } else { //pending-update or PendingUpdate
835 xmlNetwork += "<"+element+">"+"Active"+"</"+element+">"
839 xmlNetwork += "<"+element+">"+var.toString()+"</"+element+">"
847 def buildSubnets(requeryIdAAIResponse, createNetworkResponse) {
848 def rebuildingSubnets = ""
849 if (requeryIdAAIResponse != null && utils.nodeExists(requeryIdAAIResponse, 'subnets')) {
850 def subnetIdMapValue = ""
851 def subnetsGroup = utils.getNodeXml(requeryIdAAIResponse, "subnets", false)
852 def subnetsData = new XmlSlurper().parseText(subnetsGroup)
853 rebuildingSubnets += "<subnets>"
855 def subnets = subnetsData.'**'.findAll {it.name() == "subnet"}
856 def subnetsSize = subnets.size()
857 for (i in 0..subnetsSize-1) {
858 def subnet = subnets[i]
859 def subnetXml = XmlUtil.serialize(subnet)
860 def orchestrationStatus = utils.getNodeText(subnetXml, "orchestration-status")
861 if (orchestrationStatus == "PendingDelete" || orchestrationStatus == "pending-delete") {
862 // skip, do not include in processing, remove!!!
864 def subnetList = ["subnet-id", "neutron-subnet-id", "gateway-address", "network-start-address", "cidr-mask", "ip-version", "orchestration-status", "dhcp-enabled", "dhcp-start", "dhcp-end", "subnet-role", "resource-version", "subnet-name", "ip-assignment-direction", "host-routes"]
865 rebuildingSubnets += buildSubNetworkElements(subnetXml, createNetworkResponse, subnetList, "subnet")
868 if (utils.nodeExists(subnetsData, 'relationship')) {
869 rebuildingSubnets = rebuildRelationship(requeryIdAAIResponse)
872 } catch (Exception ex) {
875 rebuildingSubnets += "</subnets>"
878 return rebuildingSubnets
881 def buildSubnets(queryIdResponse) {
882 def rebuildingSubnets = ""
883 def subnetsData = new XmlSlurper().parseText(queryIdResponse)
884 //rebuildingSubnets += "<subnets>"
886 def subnets = subnetsData.'**'.findAll {it.name() == "subnet"}
887 def subnetsSize = subnets.size()
888 for (i in 0..subnetsSize-1) {
889 def subnet = subnets[i]
890 def subnetXml = XmlUtil.serialize(subnet)
891 def orchestrationStatus = utils.getNodeText(subnetXml, "orchestration-status")
892 if (orchestrationStatus == "pending-delete" || orchestrationStatus == "PendingDelete") {
893 // skip, do not include in processing, remove!!!
895 def subnetList = ["dhcp-start", "dhcp-end", "network-start-address", "cidr-mask", "dhcp-enabled", "gateway-address", "ip-version", "subnet-id", "subnet-name", "ip-assignment-direction", "host-routes"]
896 rebuildingSubnets += buildSubNetworkElements(subnetXml, subnetList, "subnets")
897 //rebuildingSubnets += buildSubNetworkElements(subnetXml, subnetList, "")
900 } catch (Exception ex) {
903 //rebuildingSubnets += "</subnets>"
905 return rebuildingSubnets
909 // build subnet sub-network single elements
910 def buildSubNetworkElements(subnetXml, createNetworkResponse, elementList, parentName) {
913 if (parentName != "") {
914 xmlBuild += "<"+parentName+">"
916 if (subnetXml != null) {
917 for (element in elementList) {
918 def xml= new XmlSlurper().parseText(subnetXml)
919 var = xml.'**'.find {it.name() == element}
921 if (element=="orchestration-status") {
922 if(var.toString() == 'pending-create' || var.toString() == 'PendingCreate') {
923 xmlBuild += "<"+element+">"+"Created"+"</"+element+">"
924 } else { // pending-update or PendingUpdate'
925 xmlBuild += "<"+element+">"+"Active"+"</"+element+">"
927 } else { // "subnet-id", "neutron-subnet-id"
928 if (element=="subnet-id") {
929 if (utils.nodeExists(createNetworkResponse, "subnetMap")) {
930 xmlBuild += "<"+element+">"+var.toString()+"</"+element+">"
931 String neutronSubnetId = extractNeutSubId(createNetworkResponse, var.toString())
932 xmlBuild += "<neutron-subnet-id>"+neutronSubnetId+"</neutron-subnet-id>"
935 if (element=="neutron-subnet-id") {
938 if (element=="host-routes") {
939 if (subnetXml.contains("host-routes")) {
940 List elementRoute = ["host-route-id", "route-prefix", "next-hop", "next-hop-type", "resource-version"]
941 xmlBuild += buildXMLElements(subnetXml, "host-routes", "host-route", elementRoute)
944 xmlBuild += "<"+element+">"+var.toString()+"</"+element+">"
953 if (parentName != "") {
954 xmlBuild += "</"+parentName+">"
959 // build subnet sub-network single elements
960 def buildSubNetworkElements(subnetXml, elementList, parentName) {
963 if (parentName != "") {
964 xmlBuild += "<"+parentName+">"
966 if (subnetXml != null) {
967 def networkStartAddress = ""
968 for (element in elementList) {
969 def xml= new XmlSlurper().parseText(subnetXml)
970 var = xml.'**'.find {it.name() == element}
971 if (element == "dhcp-start") {
972 xmlBuild += "<allocationPools>"
973 if (var.toString() == 'null') {
974 xmlBuild += "<start>"+""+"</start>"
976 xmlBuild += "<start>"+var.toString()+"</start>"
979 if (element == "dhcp-end") {
980 if (var.toString() == 'null') {
981 xmlBuild += "<end>"+""+"</end>"
983 xmlBuild += "<end>"+var.toString()+"</end>"
985 xmlBuild += "</allocationPools>"
987 if (element == "network-start-address" || element == "cidr-mask") {
988 if (element == "network-start-address") {
989 networkStartAddress = var.toString()
991 if (element == "cidr-mask") {
992 xmlBuild += "<cidr>"+networkStartAddress+"/"+var.toString()+"</cidr>"
995 if (element == "dhcp-enabled") {
996 xmlBuild += "<enableDHCP>"+var.toString()+"</enableDHCP>"
998 if (element == "gateway-address") {
999 xmlBuild += "<gatewayIp>"+var.toString()+"</gatewayIp>"
1001 if (element == "ip-version") {
1002 String ipVersion = getIpvVersion(var.toString())
1003 xmlBuild += "<ipVersion>"+ipVersion+"</ipVersion>"
1005 if (element == "subnet-id") {
1006 xmlBuild += "<subnetId>"+var.toString()+"</subnetId>"
1008 if ((element == "subnet-name") && (var != null)) {
1009 xmlBuild += "<subnetName>"+var.toString()+"</subnetName>"
1011 if ((element == "ip-assignment-direction") && (var != null)) {
1012 xmlBuild += "<addrFromStart>"+var.toString()+"</addrFromStart>"
1014 if (element == "host-routes") {
1016 if (subnetXml.contains("host-routes")) {
1017 routes = buildHostRoutes(subnetXml)
1024 if (parentName != "") {
1025 xmlBuild += "</"+parentName+">"
1030 // rebuild host-routes
1031 def buildHostRoutes(subnetXml) {
1032 List routeElementList = ["host-route-id", "route-prefix", "next-hop", "next-hop-type", "resource-version"]
1033 def hostRoutes = buildXMLElements(subnetXml, "host-routes", "host-route", routeElementList)
1034 def buildHostRoutes = ""
1036 if (hostRoutes!=null) {
1037 def routesData = new XmlSlurper().parseText(hostRoutes)
1038 def routes = routesData.'**'.findAll {it.name() == "host-route"}
1039 def routesSize = routes.size()
1040 for (i in 0..routesSize-1) {
1041 buildHostRoutes += "<hostRoutes>"
1042 def route = routes[i]
1043 def routeXml = XmlUtil.serialize(route)
1044 List elementList = ["route-prefix", "next-hop"]
1045 for (element in elementList) {
1046 def xml= new XmlSlurper().parseText(routeXml)
1047 var = xml.'**'.find {it.name() == element}
1048 if (element == "route-prefix") {
1049 buildHostRoutes += "<prefix>"+var.toString()+"</prefix>"
1051 if (element == "next-hop") {
1052 buildHostRoutes += "<nextHop>"+var.toString()+"</nextHop>"
1055 buildHostRoutes += "</hostRoutes>"
1058 return buildHostRoutes
1062 // rebuild ctag-assignments
1063 def rebuildCtagAssignments(xmlInput) {
1064 def rebuildingCtagAssignments = ""
1065 if (xmlInput!=null) {
1066 def ctagAssignmentsData = new XmlSlurper().parseText(xmlInput)
1067 rebuildingCtagAssignments += "<ctag-assignments>"
1068 def ctagAssignments = ctagAssignmentsData.'**'.findAll {it.name() == "ctag-assignment"}
1069 def ctagAssignmentsSize = ctagAssignments.size()
1070 for (i in 0..ctagAssignmentsSize-1) {
1071 def ctagAssignment = ctagAssignments[i]
1072 def ctagAssignmentXml = XmlUtil.serialize(ctagAssignment)
1073 rebuildingCtagAssignments += "<ctag-assignment>"
1074 List elementList = ["vlan-id-inner", "resource-version"]
1075 rebuildingCtagAssignments += buildXMLElements(ctagAssignmentXml, "" , "", elementList)
1076 if (utils.nodeExists(ctagAssignmentXml, 'relationship')) {
1077 rebuildingCtagAssignments += rebuildRelationship(ctagAssignmentXml)
1079 rebuildingCtagAssignments += "</ctag-assignment>"
1081 rebuildingCtagAssignments += "</ctag-assignments>"
1083 return rebuildingCtagAssignments
1086 // rebuild 'relationship-list'
1087 def rebuildRelationship(xmlInput) {
1088 def rebuildingSubnets = ""
1089 if (xmlInput!=null) {
1090 def subnetsData = new XmlSlurper().parseText(xmlInput)
1091 rebuildingSubnets += "<relationship-list>"
1092 def relationships = subnetsData.'**'.findAll {it.name() == "relationship"}
1093 def relationshipsSize = relationships.size()
1094 for (i in 0..relationshipsSize-1) {
1095 def relationship = relationships[i]
1096 def relationshipXml = XmlUtil.serialize(relationship)
1097 rebuildingSubnets += "<relationship>"
1098 def relationshipList = ["related-to", "related-link"]
1099 rebuildingSubnets += buildSubNetworkElements(relationshipXml, "", relationshipList, "")
1100 if (utils.nodeExists(relationshipXml, 'relationship-data')) {
1101 def relationshipDataXmlData = new XmlSlurper().parseText(relationshipXml)
1102 def relationshipsData = relationshipDataXmlData.'**'.findAll {it.name() == "relationship-data"}
1103 def relationshipsDataSize = relationshipsData.size()
1104 for (j in 0..relationshipsDataSize-1) {
1105 def relationshipData = relationshipsData[j]
1106 def relationshipDataXml = XmlUtil.serialize(relationshipData)
1107 def relationshipDataList = ["relationship-key", "relationship-value"]
1108 rebuildingSubnets += buildXMLElements(relationshipDataXml, "", "relationship-data", relationshipDataList)
1111 if (utils.nodeExists(relationshipXml, 'related-to-property')) {
1112 def relationshipDataXmlData = new XmlSlurper().parseText(relationshipXml)
1113 def relationshipsData = relationshipDataXmlData.'**'.findAll {it.name() == "related-to-property"}
1114 def relationshipsDataSize = relationshipsData.size()
1115 for (j in 0..relationshipsDataSize-1) {
1116 def relationshipData = relationshipsData[j]
1117 def relationshipDataXml = XmlUtil.serialize(relationshipData)
1118 def relationshipDataList = ["property-key", "property-value"]
1119 rebuildingSubnets += buildXMLElements(relationshipDataXml, "", "related-to-property", relationshipDataList)
1123 rebuildingSubnets += "</relationship>"
1125 rebuildingSubnets += "</relationship-list>"
1127 return rebuildingSubnets
1130 def buildVlans(queryIdResponse) {
1131 def rebuildingSubnets = "<vlans>"
1132 def subnetsData = new XmlSlurper().parseText(queryIdResponse)
1135 def subnets = subnetsData.'**'.findAll {it.name() == "segmentation-assignments"}
1136 def subnetsSize = subnets.size()
1137 for (i in 0..subnetsSize-1) {
1138 def subnet = subnets[i]
1139 def subnetXml = XmlUtil.serialize(subnet)
1141 String vlan = utils.getNodeText(subnetXml, "segmentation-id")
1143 rebuildingSubnets += ","
1145 rebuildingSubnets += vlan
1147 } catch (Exception ex) {
1150 //rebuildingSubnets += "</subnets>"
1151 rebuildingSubnets += "</vlans>"
1153 return rebuildingSubnets
1156 /* Utility code to rebuild xml/elements in a list:
1157 * rebuild xml with 1) unbounded groups of elements; or
1158 * 2) one group of elements; or
1159 * 3) just one or more elements (in a list as argument)
1160 * @param xmlInput the XML document
1161 * @param parentName the parent name (ex: 'inputs')
1162 * @param childrenName the chilrendName (ex: 'entry' as unbounded/occurs>1)
1163 * @param elementList the element list of children (ex: 'key', 'value')
1164 * @return a string of rebuild xml
1169 * <ws:key>name</ws:key>
1170 * <ws:value>Edward</ws:value>
1173 * <ws:key>age</ws:key>
1174 * <ws:value>30</ws:value>
1177 * <ws:key>age</ws:key>
1178 * <ws:value>30</ws:value>
1182 * List elementList = ["key", "value"]
1183 * String rebuild = buildXMLElements(xmlInput, "inputs", "entry", elementList)
1185 * Ex 2: xmlInput // no parent tag
1186 * <ws:sdnc-request-header>
1187 * <ws:svc-request-id>fec8ec88-151a-45c9-ad60-8233e0fc8ff2</ws:svc-request-id>
1188 * <ws:svc-notification-url>https://localhost:8443/adapters/rest/SDNCNotify</ws:svc-notification-url>
1189 * <ws:svc-action>assign</ws:svc-action>
1190 * </ws:sdnc-request-header>
1192 * List elementList = ["svc-request-id", "svc-notification-url", "svc-action"]
1193 * String rebuild = buildXMLElements(xmlInput, "" , "sdnc-request-header", elementList) // no parent tag
1195 * Ex 3: xmlInput // elements one after another (with no parent & children tag)
1196 * <ws:test-id>myTestid</ws:test-id>
1197 * <ws:test-user>myUser</ws:test-user>
1199 * List elementList = ["test-id", "test-user"]
1200 * String rebuild = buildXMLElements(xmlInput, "" , "", elementList)
1203 def buildXMLElements(xmlInput, parentName, childrenName, elementList) {
1204 def varChildren = ""
1206 def xmlBuildUnbounded = ""
1207 if (parentName!="") {xmlBuildUnbounded += "<"+parentName+">" +'\n'}
1208 if (xmlInput != null) {
1209 def xml= new XmlSlurper().parseText(xmlInput)
1210 if (childrenName!="") {
1211 varChildren = xml.'**'.findAll {it.name() == childrenName}
1212 for (i in 0..varChildren.size()-1) {
1213 xmlBuildUnbounded += "<"+childrenName+">" +'\n'
1214 for (element in elementList) {
1215 var = varChildren[i].'*'.find {it.name() == element}
1217 xmlBuildUnbounded += "<"+element+">"+var.toString()+"</"+element+">" +'\n'
1220 xmlBuildUnbounded += "</"+childrenName+">" +'\n'
1223 for (element in elementList) {
1224 var = xml.'*'.find {it.name() == element}
1226 xmlBuildUnbounded += "<"+element+">"+var.toString()+"</"+element+">" +'\n'
1232 if (parentName!="") {xmlBuildUnbounded += "</"+parentName+">" +'\n'}
1233 return xmlBuildUnbounded
1236 def getFirstNodeXml(xmlInput, element){
1238 def nodeToSerialize = ""
1239 if (xmlInput != null) {
1240 def fxml= new XmlSlurper().parseText(xmlInput)
1241 if (utils.nodeExists(xmlInput, "payload")) {
1242 nodeToSerialize = fxml.'payload'.'l3-network'.'*'.find {it.name() == element}
1243 if (nodeToSerialize!=null) {
1244 nodeAsText = XmlUtil.serialize(nodeToSerialize)
1250 nodeToSerialize = fxml.'*'.find {it.name() == element}
1251 if (nodeToSerialize!=null) {
1252 nodeAsText = XmlUtil.serialize(nodeToSerialize)
1263 //TODO: This method still needs to be tested before using.
1266 * This method is similar to the gennetwork:ContrailNetworUpdateCompletedObject
1267 * BPEL method. It extracts all of the required subnet information
1268 * for each subnet listed with an orch status equal to the one provided
1269 * and puts the corresponding infomation with the appropriate node for
1270 * updating aai. The method sets the orch status for each subnet to active
1272 * @param subnetsXml the entire subnets xml
1273 * @param requestInput the request in the process
1274 * @param queryIdResponse the response of REST AAI query by Id
1275 * @param queryVpnBindingResponse the response of REST AAI query by vpn binding
1276 * @param routeCollection the collection of vpnBinding's 'global-route-target'
1277 * @return String request
1279 public String networkUpdateSubnetInfo(String subnetsXml, String networkResponseXml){
1282 StringBuilder sb = new StringBuilder()
1283 InputSource source = new InputSource(new StringReader(subnetsXml));
1284 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
1285 docFactory.setNamespaceAware(true)
1286 DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
1287 Document xml = docBuilder.parse(source)
1288 NodeList nodeList = xml.getElementsByTagNameNS("*", "subnet")
1289 for (int x = 0; x < nodeList.getLength(); x++) {
1290 Node node = nodeList.item(x)
1292 if (node.getNodeType() == Node.ELEMENT_NODE) {
1293 Element eElement = (Element) node
1294 String subnetOrchStatus = eElement.getElementsByTagNameNS("*", "orchestration-status").item(0).getTextContent()
1295 if(subnetOrchStatus.equals("pending-create")){
1297 String subnetId = eElement.getElementsByTagNameNS("*", "subnet-id").item(0).getTextContent()
1298 def netAddress = eElement.getElementsByTagNameNS("*", "network-start-address").item(0).getTextContent()
1299 def mask = eElement.getElementsByTagNameNS("*", "cidr-mask").item(0).getTextContent()
1300 def dhcpEnabledSubnet = eElement.getElementsByTagNameNS("*", "dhcp-enabled").item(0).getTextContent()
1301 def gatewayAddress = eElement.getElementsByTagNameNS("*", "gateway-address").item(0).getTextContent()
1302 def ipVersion = eElement.getElementsByTagNameNS("*", "ip-version").item(0).getTextContent()
1303 def relationshipList = eElement.getElementsByTagNameNS("*", "relationship-list").item(0).getTextContent() //TODO: test this
1304 String neutronSubnetId = extractNeutSubId(networkResponseXml, subnetId)
1307 <subnetId>${MsoUtils.xmlEscape(subnetId)}</subnetId>
1308 <neutron-subnet-id>${MsoUtils.xmlEscape(neutronSubnetId)}</neutron-subnet-id>
1309 <gateway-address>${MsoUtils.xmlEscape(gatewayAddress)}</gateway-address>
1310 <network-start-address>${MsoUtils.xmlEscape(netAddress)}</network-start-address>
1311 <cidr-mask>${MsoUtils.xmlEscape(mask)}</cidr-mask>
1312 <ip-Version>${MsoUtils.xmlEscape(ipVersion)}</ip-Version>
1313 <orchestration-status>active</orchestration-status>
1314 <dhcp-enabled>${MsoUtils.xmlEscape(dhcpEnabledSubnet)}</dhcp-enabled>
1315 <relationship-list>${relationshipList}</relationship-list>
1318 }else if(subnetOrchStatus.equals("pending-delete")){
1319 StringWriter writer = new StringWriter()
1320 Transformer transformer = TransformerFactory.newInstance().newTransformer()
1321 transformer.transform(new DOMSource(node), new StreamResult(writer))
1322 subnet = writer.toString()
1328 subnets = sb.append(subnet)
1331 subnets = utils.removeXmlPreamble(subnets)
1333 String subnetsList =
1344 * This method extracts the "value" node text for the the given subnet Id.
1346 * @param String inputSource - xml that contains the subnet id key and value
1347 * @param String subnetId - for which you want the value of
1349 * @return String value - node text of node named value associated with the given subnet id
1351 public String extractNeutSubId(String inputSource, String subnetId){
1354 InputSource source = new InputSource(new StringReader(inputSource));
1355 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
1356 docFactory.setNamespaceAware(true)
1357 DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
1358 Document xml = docBuilder.parse(source)
1359 NodeList nodeList = xml.getElementsByTagNameNS("*", "entry")
1360 for (int x = 0; x < nodeList.getLength(); x++) {
1361 Node node = nodeList.item(x)
1363 if (node.getNodeType() == Node.ELEMENT_NODE) {
1364 Element eElement = (Element) node
1365 String key = eElement.getElementsByTagNameNS("*", "key").item(0).getTextContent()
1366 if(key.equals(subnetId)){
1367 value = eElement.getElementsByTagNameNS("*", "value").item(0).getTextContent()
1374 public boolean isRollbackEnabled (DelegateExecution execution, String payloadXml) {
1376 def rollbackEnabled = false
1377 def rollbackValueSet = false
1378 if (utils.nodeExists(payloadXml, "backout-on-failure")) {
1379 String backoutValue = utils.getNodeText(payloadXml, "backout-on-failure")
1380 if (backoutValue != null && !backoutValue.isEmpty()) {
1381 if (backoutValue.equalsIgnoreCase("false")) {
1382 rollbackEnabled = false
1385 rollbackEnabled = true
1387 rollbackValueSet = true;
1391 if (!rollbackValueSet) {
1393 if (UrnPropertiesReader.getVariable("mso.rollback", execution) != null) {
1394 rollbackEnabled = UrnPropertiesReader.getVariable("mso.rollback", execution).toBoolean()
1397 return rollbackEnabled
1402 * This method extracts the version for the the given ip-version.
1404 * @param String ipvVersion - IP protocols version (ex: ipv4 or ipv6 or 4 or 6)
1405 * @return String version - digit version (ex: 4 or 6)
1408 public String getIpvVersion (String ipvVersion) {
1412 if (ipvVersion.isNumber()) {
1413 version = ipvVersion
1415 version = ipvVersion.substring(ipvVersion.indexOf("ipv")+3)
1416 if (!version.isNumber()) {
1417 version = ipvVersion
1420 } catch (Exception ex) {
1421 version = ipvVersion