2 * ============LICENSE_START=======================================================
\r
4 * ================================================================================
\r
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
\r
6 * ================================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END=========================================================
\r
21 package org.openecomp.mso.bpmn.common.scripts;
\r
23 import org.apache.commons.lang3.*
\r
25 import groovy.xml.XmlUtil
\r
27 import javax.xml.parsers.DocumentBuilder
\r
28 import javax.xml.parsers.DocumentBuilderFactory
\r
29 import javax.xml.transform.Transformer
\r
30 import javax.xml.transform.TransformerFactory
\r
31 import javax.xml.transform.TransformerException
\r
32 import javax.xml.transform.dom.DOMSource
\r
33 import javax.xml.transform.stream.StreamResult
\r
35 import org.camunda.bpm.engine.delegate.BpmnError
\r
36 import org.camunda.bpm.engine.runtime.Execution
\r
37 import org.w3c.dom.Document
\r
38 import org.w3c.dom.Element
\r
40 import org.w3c.dom.NamedNodeMap
\r
41 import org.w3c.dom.Node
\r
42 import org.w3c.dom.NodeList;
\r
43 import org.xml.sax.InputSource
\r
45 import org.camunda.bpm.engine.delegate.BpmnError
\r
46 import org.camunda.bpm.engine.runtime.Execution
\r
47 import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor;
\r
48 import org.w3c.dom.Document
\r
49 import org.w3c.dom.Element
\r
50 import org.w3c.dom.NamedNodeMap
\r
51 import org.w3c.dom.Node
\r
52 import org.w3c.dom.NodeList;
\r
53 import org.xml.sax.InputSource
\r
57 * This groovy class supports the any Network processes that need the methods defined here.
\r
59 class NetworkUtils {
\r
61 public MsoUtils utils = new MsoUtils()
\r
62 private AbstractServiceTaskProcessor taskProcessor
\r
64 public NetworkUtils(AbstractServiceTaskProcessor taskProcessor) {
\r
65 this.taskProcessor = taskProcessor
\r
69 * This method returns the string for Network request
\r
70 * V2 for Contrail 3.x will populate cloud-region data in same cloudSiteId filed
\r
71 * Network adapter will handle it properly
\r
72 * @param requestId either 'request-id' or 'mso-request-id'
\r
73 * @param requestInput the request in the process
\r
74 * @param queryIdResponse the response of REST AAI query by Id
\r
75 * @param routeCollection the collection
\r
76 * @param policyFqdns the policy
\r
77 * @param tableCollection the collection
\r
78 * @param cloudRegionId the cloud-region-region
\r
79 * @return String request
\r
81 def CreateNetworkRequestV2(execution, requestId, messageId, requestInput, queryIdResponse, routeCollection, policyFqdns, tableCollection, cloudRegionId, backoutOnFailure, source) {
\r
82 String createNetworkRequest = null
\r
83 if(requestInput!=null && queryIdResponse!=null) {
\r
84 String serviceInstanceId = ""
\r
85 String sharedValue = ""
\r
86 String externalValue = ""
\r
88 if (source == "VID") {
\r
89 sharedValue = utils.getNodeText1(queryIdResponse, "is-shared-network") != null ? utils.getNodeText1(queryIdResponse, "is-shared-network") : "false"
\r
90 externalValue = utils.getNodeText1(queryIdResponse, "is-external-network") != null ? utils.getNodeText1(queryIdResponse, "is-external-network") : "false"
\r
91 serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id")
\r
93 } else { // source = 'PORTAL'
\r
94 sharedValue = getParameterValue(requestInput, "shared")
\r
95 externalValue = getParameterValue(requestInput, "external")
\r
96 serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id") != null ? utils.getNodeText1(requestInput, "service-instance-id") : ""
\r
99 String networkParams = ""
\r
100 if (utils.nodeExists(requestInput, "network-params")) {
\r
101 String netParams = utils.getNodeXml(requestInput, "network-params", false).replace("tag0:","").replace(":tag0","")
\r
102 networkParams = buildParams(netParams)
\r
105 String failIfExists = "false"
\r
107 String cloudRegion = cloudRegionId
\r
108 String tenantId = utils.getNodeText1(requestInput, "tenant-id")
\r
109 String networkType = ""
\r
110 if (utils.nodeExists(requestInput, "networkModelInfo")) {
\r
111 String networkModelInfo = utils.getNodeXml(requestInput, "networkModelInfo", false).replace("tag0:","").replace(":tag0","")
\r
112 networkType = utils.getNodeText1(networkModelInfo, "modelName")
\r
114 networkType = utils.getNodeText1(queryIdResponse, "network-type")
\r
118 String networkName = utils.getNodeText1(queryIdResponse, "network-name")
\r
119 String networkId = utils.getNodeText1(queryIdResponse, "network-id")
\r
120 String networkTechnology = utils.getNodeText1(queryIdResponse, "network-technology")
\r
122 // contrailNetwork - networkTechnology = 'Contrail' vs. 'AIC_SR_IOV')
\r
123 String contrailNetwork = ""
\r
124 if (networkTechnology.contains('Contrail') || networkTechnology.contains('contrail') || networkTechnology.contains('CONTRAIL')) {
\r
125 contrailNetwork = """<contrailNetwork>
\r
126 <shared>${sharedValue}</shared>
\r
127 <external>${externalValue}</external>
\r
131 </contrailNetwork>"""
\r
132 networkTechnology = "CONTRAIL" // replace
\r
136 String subnets = ""
\r
137 if (utils.nodeExists(queryIdResponse, "subnets")) {
\r
138 def subnetsGroup = utils.getNodeXml(queryIdResponse, "subnets", false)
\r
139 subnets = buildSubnets(subnetsGroup)
\r
142 String physicalNetworkName = ""
\r
143 physicalNetworkName = utils.getNodeText1(queryIdResponse, "physical-network-name")
\r
145 String vlansCollection = buildVlans(queryIdResponse)
\r
147 String notificationUrl = "" //TODO - is this coming from URN? What variable/value to use?
\r
148 //String notificationUrl = execution.getVariable("URN_?????") //TODO - is this coming from URN? What variable/value to use?
\r
150 createNetworkRequest = """
\r
151 <createNetworkRequest>
\r
152 <cloudSiteId>${cloudRegion}</cloudSiteId>
\r
153 <tenantId>${tenantId}</tenantId>
\r
154 <networkId>${networkId}</networkId>
\r
155 <networkName>${networkName}</networkName>
\r
156 <networkType>${networkType}</networkType>
\r
157 <modelCustomizationUuid>${modelCustomizationUuid}</modelCustomizationUuid>
\r
158 <networkTechnology>${networkTechnology}</networkTechnology>
\r
159 <providerVlanNetwork>
\r
160 <physicalNetworkName>${physicalNetworkName}</physicalNetworkName >
\r
162 </providerVlanNetwork>
\r
165 <skipAAI>true</skipAAI>
\r
166 <backout>${backoutOnFailure}</backout>
\r
167 <failIfExists>${failIfExists}</failIfExists>
\r
170 <requestId>${requestId}</requestId>
\r
171 <serviceInstanceId>${serviceInstanceId}</serviceInstanceId>
\r
173 <messageId>${messageId}</messageId>
\r
174 <notificationUrl>${notificationUrl}</notificationUrl>
\r
175 </createNetworkRequest>
\r
178 return createNetworkRequest
\r
183 * This method returns the string for Network request
\r
184 * V2 for Contrail 3.x will populate cloud-region data in same cloudSiteId filed
\r
185 * Network adapter will handle it properly
\r
186 * @param requestId either 'request-id' or 'mso-request-id'
\r
187 * @param requestInput the request in the process
\r
188 * @param queryIdResponse the response of REST AAI query by Id
\r
189 * @param routeCollection the collection
\r
190 * @param policyFqdns the policy
\r
191 * @param cloudRegionId the cloud-region-region
\r
192 * @return String request
\r
194 def UpdateNetworkRequestV2(execution, requestId, messageId, requestInput, queryIdResponse, routeCollection, policyFqdns, tableCollection, cloudRegionId, backoutOnFailure, source) {
\r
195 String updateNetworkRequest = null
\r
196 if(requestInput!=null && queryIdResponse!=null) {
\r
197 String serviceInstanceId = ""
\r
198 String sharedValue = ""
\r
199 String externalValue = ""
\r
201 if (source == "VID") {
\r
202 sharedValue = utils.getNodeText1(queryIdResponse, "is-shared-network") != null ? utils.getNodeText1(queryIdResponse, "is-shared-network") : "false"
\r
203 externalValue = utils.getNodeText1(queryIdResponse, "is-external-network") != null ? utils.getNodeText1(queryIdResponse, "is-external-network") : "false"
\r
204 serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id")
\r
206 } else { // source = 'PORTAL'
\r
207 sharedValue = getParameterValue(requestInput, "shared")
\r
208 externalValue = getParameterValue(requestInput, "external")
\r
209 serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id") != null ? utils.getNodeText1(requestInput, "service-instance-id") : ""
\r
212 String failIfExists = "false"
\r
214 String cloudRegion = cloudRegionId
\r
215 String tenantId = utils.getNodeText1(requestInput, "tenant-id")
\r
218 String networkName = utils.getNodeText1(queryIdResponse, "network-name")
\r
219 String networkId = utils.getNodeText1(queryIdResponse, "network-id")
\r
221 String networkType = ""
\r
222 String modelCustomizationUuid = ""
\r
223 if (utils.nodeExists(requestInput, "networkModelInfo")) {
\r
224 String networkModelInfo = utils.getNodeXml(requestInput, "networkModelInfo", false).replace("tag0:","").replace(":tag0","")
\r
225 networkType = utils.getNodeText1(networkModelInfo, "modelName")
\r
226 modelCustomizationUuid = utils.getNodeText1(networkModelInfo, "modelCustomizationUuid")
\r
228 networkType = utils.getNodeText1(queryIdResponse, "network-type")
\r
233 String subnets = ""
\r
234 if (utils.nodeExists(queryIdResponse, "subnets")) {
\r
235 def subnetsGroup = utils.getNodeXml(queryIdResponse, "subnets", false)
\r
236 subnets = buildSubnets(subnetsGroup)
\r
239 String networkParams = ""
\r
240 if (utils.nodeExists(requestInput, "network-params")) {
\r
241 String netParams = utils.getNodeXml(requestInput, "network-params", false).replace("tag0:","").replace(":tag0","")
\r
242 networkParams = buildParams(netParams)
\r
245 String networkStackId = utils.getNodeText1(queryIdResponse, "heat-stack-id")
\r
246 if (networkStackId == 'null' || networkStackId == "" || networkStackId == null) {
\r
247 networkStackId = "force_update"
\r
250 String physicalNetworkName = utils.getNodeText1(queryIdResponse, "physical-network-name")
\r
251 String vlansCollection = buildVlans(queryIdResponse)
\r
253 updateNetworkRequest =
\r
254 """<updateNetworkRequest>
\r
255 <cloudSiteId>${cloudRegion}</cloudSiteId>
\r
256 <tenantId>${tenantId}</tenantId>
\r
257 <networkId>${networkId}</networkId>
\r
258 <networkStackId>${networkStackId}</networkStackId>
\r
259 <networkName>${networkName}</networkName>
\r
260 <networkType>${networkType}</networkType>
\r
261 <modelCustomizationUuid>${modelCustomizationUuid}</modelCustomizationUuid>
\r
262 <networkTypeVersion/>
\r
263 <networkTechnology>CONTRAIL</networkTechnology>
\r
264 <providerVlanNetwork>
\r
265 <physicalNetworkName>${physicalNetworkName}</physicalNetworkName>
\r
267 </providerVlanNetwork>
\r
269 <shared>${sharedValue}</shared>
\r
270 <external>${externalValue}</external>
\r
276 <skipAAI>true</skipAAI>
\r
277 <backout>${backoutOnFailure}</backout>
\r
278 <failIfExists>${failIfExists}</failIfExists>
\r
282 <requestId>${requestId}</requestId>
\r
283 <serviceInstanceId>${serviceInstanceId}</serviceInstanceId>
\r
285 <messageId>${messageId}</messageId>
\r
286 <notificationUrl></notificationUrl>
\r
287 </updateNetworkRequest>""".trim()
\r
290 return updateNetworkRequest
\r
295 * This method returns the string for Create Volume Request payload
\r
296 * @param groupId the volume-group-id
\r
297 * @param volumeName the volume-group-name
\r
298 * @param vnfType the vnf-type
\r
299 * @param tenantId the value of relationship-key 'tenant.tenant-id'
\r
300 * @return String request payload
\r
302 def String CreateNetworkVolumeRequest(groupId, volumeName, vnfType, tenantId) {
\r
304 String requestPayload =
\r
305 """<volume-group xmlns="http://org.openecomp.mso/v6">
\r
306 <volume-group-id>${groupId}</volume-group-id>
\r
307 <volume-group-name>${volumeName}</volume-group-name>
\r
308 <heat-stack-id></heat-stack-id>
\r
309 <vnf-type>${vnfType}</vnf-type>
\r
310 <orchestration-status>Pending</orchestration-status>
\r
311 <relationship-list>
\r
313 <related-to>tenant</related-to>
\r
314 <relationship-data>
\r
315 <relationship-key>tenant.tenant-id</relationship-key>
\r
316 <relationship-value>${tenantId}</relationship-value>
\r
317 </relationship-data>
\r
319 </relationship-list>
\r
322 return requestPayload
\r
325 def String createCloudRegionVolumeRequest(groupId, volumeName, vnfType, tenantId, cloudRegion, namespace, modelCustomizationId) {
\r
327 String requestPayload =
\r
328 """<volume-group xmlns="${namespace}">
\r
329 <volume-group-id>${groupId}</volume-group-id>
\r
330 <volume-group-name>${volumeName}</volume-group-name>
\r
331 <heat-stack-id></heat-stack-id>
\r
332 <vnf-type>${vnfType}</vnf-type>
\r
333 <orchestration-status>Pending</orchestration-status>
\r
334 <vf-module-persona-model-customization-id>${modelCustomizationId}</vf-module-persona-model-customization-id>
\r
335 <relationship-list>
\r
337 <related-to>tenant</related-to>
\r
338 <relationship-data>
\r
339 <relationship-key>tenant.tenant-id</relationship-key>
\r
340 <relationship-value>${tenantId}</relationship-value>
\r
341 </relationship-data>
\r
342 <relationship-data>
\r
343 <relationship-key>cloud-region.cloud-owner</relationship-key>
\r
344 <relationship-value>att-aic</relationship-value>
\r
345 </relationship-data>
\r
346 <relationship-data>
\r
347 <relationship-key>cloud-region.cloud-region-id</relationship-key>
\r
348 <relationship-value>${cloudRegion}</relationship-value>
\r
349 </relationship-data>
\r
351 </relationship-list>
\r
354 return requestPayload
\r
357 def String createCloudRegionVolumeRequest(groupId, volumeName, vnfType, vnfId, tenantId, cloudRegion, namespace, modelCustomizationId) {
\r
359 String requestPayload =
\r
360 """<volume-group xmlns="${namespace}">
\r
361 <volume-group-id>${groupId}</volume-group-id>
\r
362 <volume-group-name>${volumeName}</volume-group-name>
\r
363 <heat-stack-id></heat-stack-id>
\r
364 <vnf-type>${vnfType}</vnf-type>
\r
365 <orchestration-status>Pending</orchestration-status>
\r
366 <vf-module-persona-model-customization-id>${modelCustomizationId}</vf-module-persona-model-customization-id>
\r
367 <relationship-list>
\r
369 <related-to>generic-vnf</related-to>
\r
370 <relationship-data>
\r
371 <relationship-key>generic-vnf.vnf-id</relationship-key>
\r
372 <relationship-value>${vnfId}</relationship-value>
\r
373 </relationship-data>
\r
376 <related-to>tenant</related-to>
\r
377 <relationship-data>
\r
378 <relationship-key>tenant.tenant-id</relationship-key>
\r
379 <relationship-value>${tenantId}</relationship-value>
\r
380 </relationship-data>
\r
381 <relationship-data>
\r
382 <relationship-key>cloud-region.cloud-owner</relationship-key>
\r
383 <relationship-value>att-aic</relationship-value>
\r
384 </relationship-data>
\r
385 <relationship-data>
\r
386 <relationship-key>cloud-region.cloud-region-id</relationship-key>
\r
387 <relationship-value>${cloudRegion}</relationship-value>
\r
388 </relationship-data>
\r
390 </relationship-list>
\r
393 return requestPayload
\r
398 * This method returns the string for Update Volume Request payload
\r
399 * @param requeryAAIVolGrpNameResponse the response of query volume group name (in AAI)
\r
400 * @param heatStackId the value of heat stack id
\r
401 * @return String request payload
\r
403 def String updateCloudRegionVolumeRequest(requeryAAIVolGrpNameResponse, heatStackId, namespace, modelCustomizationId) {
\r
404 String requestPayload = ""
\r
405 if (requeryAAIVolGrpNameResponse != null) {
\r
406 def groupId = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-id")
\r
407 def volumeName = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-name")
\r
408 def vnfType = utils.getNodeText(requeryAAIVolGrpNameResponse, "vnf-type")
\r
409 def resourceVersion = utils.getNodeText(requeryAAIVolGrpNameResponse, "resource-version")
\r
410 def relationshipList = ""
\r
411 if (utils.nodeExists(requeryAAIVolGrpNameResponse, "relationship")) {
\r
412 relationshipList = rebuildRelationship(requeryAAIVolGrpNameResponse)
\r
416 """<volume-group xmlns="${namespace}">
\r
417 <volume-group-id>${groupId}</volume-group-id>
\r
418 <volume-group-name>${volumeName}</volume-group-name>
\r
419 <heat-stack-id>${heatStackId}</heat-stack-id>
\r
420 <vnf-type>${vnfType}</vnf-type>
\r
421 <orchestration-status>Active</orchestration-status>
\r
422 <resource-version>${resourceVersion}</resource-version>
\r
423 <vf-module-persona-model-customization-id>${modelCustomizationId}</vf-module-persona-model-customization-id>
\r
424 ${relationshipList}
\r
428 return requestPayload
\r
433 * This method returns the string for Update Volume Request payload
\r
434 * @param requeryAAIVolGrpNameResponse the response of query volume group name (in AAI)
\r
435 * @param heatStackId the value of heat stack id
\r
436 * @return String request payload
\r
438 def String UpdateNetworkVolumeRequest(requeryAAIVolGrpNameResponse, heatStackId) {
\r
439 String requestPayload = ""
\r
440 if (requeryAAIVolGrpNameResponse != null) {
\r
441 def groupId = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-id")
\r
442 def volumeName = utils.getNodeText(requeryAAIVolGrpNameResponse, "volume-group-name")
\r
443 def vnfType = utils.getNodeText(requeryAAIVolGrpNameResponse, "vnf-type")
\r
444 def resourceVersion = utils.getNodeText(requeryAAIVolGrpNameResponse, "resource-version")
\r
445 def relationshipList = ""
\r
446 if (utils.nodeExists(requeryAAIVolGrpNameResponse, "relationship")) {
\r
447 relationshipList = rebuildRelationship(requeryAAIVolGrpNameResponse)
\r
451 """<volume-group xmlns="http://org.openecomp.mso/v6">
\r
452 <volume-group-id>${groupId}</volume-group-id>
\r
453 <volume-group-name>${volumeName}</volume-group-name>
\r
454 <heat-stack-id>${heatStackId}</heat-stack-id>
\r
455 <vnf-type>${vnfType}</vnf-type>
\r
456 <orchestration-status>Active</orchestration-status>
\r
457 <resource-version>${resourceVersion}</resource-version>
\r
458 ${relationshipList}
\r
462 return requestPayload
\r
466 * This method returns the string for Create Contrail Network payload
\r
467 * @param requeryIdAAIResponse the response from AAI query by id
\r
468 * @param createNetworkResponse the response of create network
\r
469 * @return String contrailNetworkCreatedUpdate
\r
471 def ContrailNetworkCreatedUpdate(requeryIdAAIResponse, createNetworkResponse, schemaVersion) {
\r
473 String contrailNetworkCreatedUpdate = ""
\r
474 if(requeryIdAAIResponse!=null && createNetworkResponse!=null) {
\r
476 def l3Network = utils.getNodeXml(requeryIdAAIResponse, "l3-network", false).replace("tag0:","").replace(":tag0","")
\r
477 def createNetworkContrailResponse = ""
\r
478 if (utils.nodeExists(createNetworkResponse, 'createNetworkResponse')) {
\r
479 createNetworkContrailResponse = utils.getNodeXml(createNetworkResponse, "createNetworkResponse", false).replace("tag0:","").replace(":tag0","")
\r
481 createNetworkContrailResponse = utils.getNodeXml(createNetworkResponse, "updateNetworkContrailResponse", false).replace("tag0:","").replace(":tag0","")
\r
485 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",
\r
486 "physical-network-name", "is-provider-network", "is-shared-network", "is-external-network"]
\r
487 String rebuildNetworkElements = buildNetworkElements(l3Network, createNetworkContrailResponse, networkList)
\r
489 // rebuild 'subnets'
\r
490 def rebuildSubnetList = ""
\r
491 if (utils.nodeExists(requeryIdAAIResponse, 'subnet')) {
\r
492 rebuildSubnetList = buildSubnets(requeryIdAAIResponse, createNetworkResponse)
\r
495 // rebuild 'segmentation-assignments'
\r
496 def rebuildSegmentationAssignments = ""
\r
497 if (utils.nodeExists(requeryIdAAIResponse, 'segmentation-assignments')) {
\r
498 List elementList = ["segmentation-id"]
\r
499 rebuildSegmentationAssignments = buildXMLElements(requeryIdAAIResponse, "", "segmentation-assignments", elementList)
\r
502 // rebuild 'ctag-assignments' / rebuildCtagAssignments
\r
503 def rebuildCtagAssignmentsList = ""
\r
504 if (utils.nodeExists(requeryIdAAIResponse, 'ctag-assignment')) {
\r
505 rebuildCtagAssignmentsList = rebuildCtagAssignments(requeryIdAAIResponse)
\r
508 // rebuild 'relationship'
\r
509 def relationshipList = ""
\r
510 if (utils.nodeExists(requeryIdAAIResponse, 'relationship-list')) {
\r
511 String rootRelationshipData = getFirstNodeXml(requeryIdAAIResponse, "relationship-list").drop(38).trim().replace("tag0:","").replace(":tag0","")
\r
512 if (utils.nodeExists(rootRelationshipData, 'relationship')) {
\r
513 relationshipList = rebuildRelationship(rootRelationshipData)
\r
517 //Check for optional contrail network fqdn within CreateNetworkResponse
\r
518 String contrailNetworkFQDN
\r
519 if(utils.nodeExists(createNetworkResponse, "contrail-network-fqdn")){
\r
520 contrailNetworkFQDN = utils.getNodeXml(createNetworkResponse, "contrail-network-fqdn")
\r
521 contrailNetworkFQDN = utils.removeXmlNamespaces(contrailNetworkFQDN)
\r
522 contrailNetworkFQDN = utils.removeXmlPreamble(contrailNetworkFQDN)
\r
524 contrailNetworkFQDN = ""
\r
527 contrailNetworkCreatedUpdate =
\r
528 """<l3-network xmlns="${schemaVersion}">
\r
529 ${rebuildNetworkElements}
\r
530 ${rebuildSubnetList}
\r
531 ${rebuildSegmentationAssignments}
\r
532 ${rebuildCtagAssignmentsList}
\r
533 ${relationshipList}
\r
534 ${contrailNetworkFQDN}
\r
535 </l3-network>""".trim()
\r
538 return contrailNetworkCreatedUpdate
\r
544 * This method returns the value for the name paramName.
\r
545 * Ex: <network-params>
\r
546 * <param name="shared">1</param>
\r
547 * <param name="external">0</external>
\r
548 * </network-params>
\r
550 * @param xmlInput the XML document
\r
551 * @param paramName the param name (ex: 'shared')
\r
552 * @return a param value for 'shared' (ex: '1')
\r
554 def getParameterValue(xmlInput, paramName) {
\r
556 if(xmlInput!=null){
\r
557 def xml= new XmlSlurper().parseText(xmlInput)
\r
558 rtn= xml.'**'.find {param->param.'@name'.text() == paramName}
\r
568 * This method returns the name of param if found/match with paramName.
\r
569 * Ex: <network-params>
\r
570 * <param name="shared">1</param>
\r
571 * <param name="external">0</external>
\r
572 * </network-params>
\r
574 * @param xmlInput the XML document
\r
575 * @param paramName the param name (ex: 'shared', )
\r
576 * @return a param name for 'shared' (ex: 'shared' if found)
\r
578 def getParameterName(xmlInput, paramName) {
\r
580 if(xmlInput!=null){
\r
581 def xml= new XmlSlurper().parseText(xmlInput)
\r
583 rtn= xml.'**'.find {param->param.'@name' == paramName}.'@name'
\r
584 } catch (Exception ex) {
\r
588 if (rtn==null || rtn=="") {
\r
596 * This method returns the networkParams xml string.
\r
599 * <param name="shared">1</param>
\r
600 * <param name="external">0</external>
\r
601 * </network-params>
\r
605 * <shared>1</shared>
\r
606 * <external>0</external>
\r
611 def buildParams(networkParams) {
\r
613 def netParams = new XmlParser().parseText(networkParams)
\r
615 def paramsList = netParams.'**'.findAll {param->param.'@name'}.'@name'
\r
616 if (paramsList.size() > 0) {
\r
617 build += "<networkParams>"
\r
618 for (i in 0..paramsList.size()-1) {
\r
619 def name = netParams.'**'.find {param->param.'@name' == paramsList[i]}.'@name'
\r
620 def value= netParams.'**'.find {param->param.'@name' == paramsList[i]}.text()
\r
621 build += "<${name}>${value}</${name}>"
\r
623 build += "</networkParams>"
\r
626 } catch (Exception ex) {
\r
627 println ' buildParams error - ' + ex.getMessage()
\r
633 def getVlans(xmlInput) {
\r
635 if (xmlInput!=null) {
\r
636 def vlansList = getListWithElements(xmlInput, 'vlans')
\r
637 def vlansListSize = vlansList.size()
\r
638 if (vlansListSize > 0) {
\r
639 for (i in 0..vlansListSize-1) {
\r
640 rtn += '<vlans>'+vlansList[i]+'</vlans>'
\r
650 * This method returns the uri value for the vpn bindings.
\r
651 * Return the a list of value of vpn binding in the <related-link> string.
\r
653 * <relationship-list>
\r
655 * <related-to>vpn-binding</related-to>
\r
656 * <related-link>https://aai-app-e2e.test.openecomp.com:8443/aai/v6/network/vpn-bindings/vpn-binding/85f015d0-2e32-4c30-96d2-87a1a27f8017/</related-link>
\r
657 * <relationship-data>
\r
658 * <relationship-key>vpn-binding.vpn-id</relationship-key>
\r
659 * <relationship-value>85f015d0-2e32-4c30-96d2-87a1a27f8017</relationship-value>
\r
660 * </relationship-data>
\r
663 * <related-to>vpn-binding</related-to>
\r
664 * <related-link>https://aai-ext1.test.openecomp.com:8443/aai/v6/network/vpn-bindings/vpn-binding/24a4b507-853a-4a38-99aa-05fcc54be24d/</related-link>
\r
665 * <relationship-data>
\r
666 * <relationship-key>vpn-binding.vpn-id</relationship-key>
\r
667 * <relationship-value>24a4b507-853a-4a38-99aa-05fcc54be24d</relationship-value>
\r
668 * </relationship-data>
\r
669 * <related-to-property>
\r
670 * <property-key>vpn-binding.vpn-name</property-key>
\r
671 * <property-value>oam_protected_net_6_MTN5_msotest1</property-value>
\r
672 * </related-to-property>
\r
674 * @param xmlInput the XML document
\r
675 * @return a list of vpn binding values
\r
676 * 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/']
\r
679 def getVnfBindingObject(xmlInput) {
\r
682 if (xmlInput!=null) {
\r
683 def relationshipList = getListWithElements(xmlInput, 'relationship')
\r
684 def relationshipListSize = relationshipList.size()
\r
685 if (relationshipListSize > 0) {
\r
686 for (i in 0..relationshipListSize-1) {
\r
687 def relationshipXml = XmlUtil.serialize(relationshipList[i])
\r
688 if (utils.getNodeText(relationshipXml, 'related-to') == "vpn-binding") {
\r
689 def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
\r
690 if (relatedLink != null || relatedLink != "") {
\r
691 rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
\r
700 * similar to VNF bindings method
\r
701 * @param xmlInput the XML document
\r
702 * @return a list of network policy values
\r
703 * 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']
\r
706 def getNetworkPolicyObject(xmlInput) {
\r
709 if (xmlInput!=null) {
\r
710 def relationshipList = getListWithElements(xmlInput, 'relationship')
\r
711 def relationshipListSize = relationshipList.size()
\r
712 if (relationshipListSize > 0) {
\r
713 for (i in 0..relationshipListSize-1) {
\r
714 def relationshipXml = XmlUtil.serialize(relationshipList[i])
\r
715 if (utils.getNodeText(relationshipXml, 'related-to') == "network-policy") {
\r
716 def relatedLink = utils.getNodeText(relationshipXml, 'related-link')
\r
717 if (relatedLink != null || relatedLink != "") {
\r
718 rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
\r
728 * similar to network policymethod
\r
729 * @param xmlInput the XML document
\r
730 * @return a list of network policy values
\r
731 * ex: ['aai/v$/network/route-table-references/route-table-reference/refFQDN1', 'aai/v$/network/route-table-references/route-table-reference/refFQDN2']
\r
734 def getNetworkTableRefObject(xmlInput) {
\r
737 if (xmlInput!=null) {
\r
738 def relationshipList = getListWithElements(xmlInput, 'relationship')
\r
739 def relationshipListSize = relationshipList.size()
\r
740 if (relationshipListSize > 0) {
\r
741 for (i in 0..relationshipListSize-1) {
\r
742 def relationshipXml = XmlUtil.serialize(relationshipList[i])
\r
743 if (utils.getNodeText(relationshipXml, 'related-to') == "route-table-reference") {
\r
744 def relatedLink = utils.getNodeText1(relationshipXml, 'related-link')
\r
745 if (relatedLink != null || relatedLink != "") {
\r
746 rtn.add(relatedLink.substring(relatedLink.indexOf("/aai/"), relatedLink.length()))
\r
756 * similar to network policymethod
\r
757 * @param xmlInput the XML document
\r
758 * @return a list of IDs for related VNF instances
\r
761 def getRelatedVnfIdList(xmlInput) {
\r
764 if (xmlInput!=null) {
\r
765 def relationshipList = getListWithElements(xmlInput, 'relationship')
\r
766 def relationshipListSize = relationshipList.size()
\r
767 if (relationshipListSize > 0) {
\r
768 for (i in 0..relationshipListSize-1) {
\r
769 def relationshipXml = XmlUtil.serialize(relationshipList[i])
\r
770 if (utils.getNodeText(relationshipXml, 'related-to') == "generic-vnf") {
\r
771 def relatedLink = utils.getNodeText1(relationshipXml, 'related-link')
\r
772 if (relatedLink != null || relatedLink != "") {
\r
773 if (relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()).contains('/')) {
\r
774 rtn.add(relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()-1))
\r
776 rtn.add(relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()))
\r
788 * similar to network policymethod
\r
789 * @param xmlInput the XML document
\r
790 * @return a list of IDs for related Network instances
\r
793 def getRelatedNetworkIdList(xmlInput) {
\r
796 if (xmlInput!=null) {
\r
797 def relationshipList = getListWithElements(xmlInput, 'relationship')
\r
798 def relationshipListSize = relationshipList.size()
\r
799 if (relationshipListSize > 0) {
\r
800 for (i in 0..relationshipListSize-1) {
\r
801 def relationshipXml = XmlUtil.serialize(relationshipList[i])
\r
802 if (utils.getNodeText(relationshipXml, 'related-to') == "l3-network") {
\r
803 def relatedLink = utils.getNodeText1(relationshipXml, 'related-link')
\r
804 if (relatedLink != null || relatedLink != "") {
\r
805 if (relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()).contains('/')) {
\r
806 rtn.add(relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()-1))
\r
808 rtn.add(relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()))
\r
819 def isVfRelationshipExist(xmlInput) {
\r
820 Boolean rtn = false
\r
821 if (xmlInput!=null) {
\r
822 def relationshipList = getListWithElements(xmlInput, 'relationship')
\r
823 def relationshipListSize = relationshipList.size()
\r
824 if (relationshipListSize > 0) {
\r
825 for (i in 0..relationshipListSize-1) {
\r
826 def relationshipXml = XmlUtil.serialize(relationshipList[i])
\r
827 if (utils.getNodeText(relationshipXml, 'related-to') == "vf-module") {
\r
837 def getCloudRegion(xmlInput) {
\r
838 String lcpCloudRegion = ""
\r
839 if (xmlInput!=null) {
\r
840 def relationshipList = getListWithElements(xmlInput, 'relationship')
\r
841 def relationshipListSize = relationshipList.size()
\r
842 if (relationshipListSize > 0) {
\r
843 for (i in 0..relationshipListSize-1) {
\r
844 def relationshipXml = XmlUtil.serialize(relationshipList[i])
\r
845 if (utils.getNodeText(relationshipXml, 'related-to') == "cloud-region") {
\r
846 def relatedLink = utils.getNodeText1(relationshipXml, 'related-link')
\r
847 if (relatedLink != null || relatedLink != "") {
\r
848 lcpCloudRegion = relatedLink.substring(relatedLink.indexOf("/att-aic/")+9, relatedLink.length())
\r
849 if (lcpCloudRegion.contains('/')) {
\r
850 lcpCloudRegion = relatedLink.substring(relatedLink.indexOf("/att-aic/")+9, relatedLink.length()-1)
\r
857 return lcpCloudRegion
\r
860 def getTenantId(xmlInput) {
\r
861 String tenantId = ""
\r
862 if (xmlInput!=null) {
\r
863 def relationshipList = getListWithElements(xmlInput, 'relationship')
\r
864 def relationshipListSize = relationshipList.size()
\r
865 if (relationshipListSize > 0) {
\r
866 for (i in 0..relationshipListSize-1) {
\r
867 def relationshipXml = XmlUtil.serialize(relationshipList[i])
\r
868 if (utils.getNodeText(relationshipXml, 'related-to') == "tenant") {
\r
869 def relatedLink = utils.getNodeText1(relationshipXml, 'related-link')
\r
870 if (relatedLink != null || relatedLink != "") {
\r
871 tenantId = relatedLink.substring(relatedLink.indexOf("/tenant/")+8, relatedLink.length())
\r
872 if (tenantId.contains('/')) {
\r
873 tenantId = relatedLink.substring(relatedLink.indexOf("/tenant/")+8, relatedLink.length()-1)
\r
883 def isInstanceValueMatch(linkResource, globalSubscriberId, serviceType) {
\r
884 Boolean rtn = false
\r
886 String globalSubscriberIdLink = linkResource.substring(linkResource.indexOf("/customer/")+10, linkResource.indexOf("/service-subscriptions"))
\r
887 String serviceTypeLink = linkResource.substring(linkResource.indexOf("/service-subscription/")+22, linkResource.indexOf("/service-instances"))
\r
888 if (globalSubscriberIdLink == globalSubscriberId) {
\r
891 if (serviceTypeLink == serviceType) {
\r
896 } catch (Exception ex) {
\r
897 println 'Exception - ' + ex.getMessage()
\r
903 def getListWithElements(xmlInput, groupName) {
\r
905 if (xmlInput != null) {
\r
906 def relationshipData = new XmlSlurper().parseText(xmlInput)
\r
907 rtn = relationshipData.'**'.findAll {it.name() == groupName}
\r
913 // build network single elements
\r
914 def buildNetworkElements(l3Network, createNetworkContrailResponse, networkList) {
\r
915 def replaceNetworkId = ""
\r
916 def replaceNeutronNetworkId = ""
\r
917 def replaceContrailNetworkFqdn = ""
\r
918 if (l3Network != null && createNetworkContrailResponse != null) {
\r
919 if (utils.nodeExists(l3Network, 'heat-stack-id')) {
\r
920 replaceNetworkId = utils.getNodeText(l3Network, 'heat-stack-id')
\r
922 if (utils.nodeExists(createNetworkContrailResponse, 'networkStackId')) {
\r
923 replaceNetworkId = utils.getNodeText(createNetworkContrailResponse, 'networkStackId')
\r
926 if (utils.nodeExists(l3Network, 'neutron-network-id')) {
\r
927 replaceNeutronNetworkId = utils.getNodeText(l3Network, 'neutron-network-id')
\r
929 if (utils.nodeExists(createNetworkContrailResponse, 'neutronNetworkId')) {
\r
930 replaceNeutronNetworkId = utils.getNodeText(createNetworkContrailResponse, 'neutronNetworkId')
\r
933 if (utils.nodeExists(l3Network, 'contrail-network-fqdn')) {
\r
934 replaceContrailNetworkFqdn = utils.getNodeText(l3Network, 'contrail-network-fqdn')
\r
936 if (utils.nodeExists(createNetworkContrailResponse, 'networkFqdn')) {
\r
937 replaceContrailNetworkFqdn = utils.getNodeText(createNetworkContrailResponse, 'networkFqdn')
\r
943 def xmlNetwork = ""
\r
944 if (l3Network != null) {
\r
945 for (element in networkList) {
\r
946 def xml= new XmlSlurper().parseText(l3Network)
\r
947 var = xml.'**'.find {it.name() == element}
\r
949 if (element=="orchestration-status") {
\r
950 if (var.toString() == 'pending-create' || var.toString() == 'PendingCreate') {
\r
951 xmlNetwork += "<"+element+">"+"Created"+"</"+element+">"
\r
952 } else { //pending-update or PendingUpdate
\r
953 xmlNetwork += "<"+element+">"+"Active"+"</"+element+">"
\r
957 if (element=="heat-stack-id") {
\r
958 if (replaceNetworkId != "") {
\r
959 xmlNetwork += "<"+element+">"+replaceNetworkId+"</"+element+">"
\r
962 if (element=="neutron-network-id") {
\r
963 if (replaceNeutronNetworkId != "") {
\r
964 xmlNetwork += "<"+element+">"+replaceNeutronNetworkId+"</"+element+">"
\r
967 if (element=="contrail-network-fqdn") {
\r
968 if (replaceContrailNetworkFqdn != "") {
\r
969 xmlNetwork += "<"+element+">"+replaceContrailNetworkFqdn+"</"+element+">"
\r
974 if (element=="orchestration-status") {
\r
975 if (element=="orchestration-status") {
\r
976 if (var.toString() == 'pending-create' || var.toString() == 'PendingCreate') {
\r
977 xmlNetwork += "<"+element+">"+"Created"+"</"+element+">"
\r
978 } else { //pending-update or PendingUpdate
\r
979 xmlNetwork += "<"+element+">"+"Active"+"</"+element+">"
\r
983 xmlNetwork += "<"+element+">"+var.toString()+"</"+element+">"
\r
992 def buildSubnets(requeryIdAAIResponse, createNetworkResponse) {
\r
993 def rebuildingSubnets = ""
\r
994 if (requeryIdAAIResponse != null && utils.nodeExists(requeryIdAAIResponse, 'subnets')) {
\r
995 def subnetIdMapValue = ""
\r
996 def subnetsGroup = utils.getNodeXml(requeryIdAAIResponse, "subnets", false)
\r
997 def subnetsData = new XmlSlurper().parseText(subnetsGroup)
\r
998 rebuildingSubnets += "<subnets>"
\r
1000 def subnets = subnetsData.'**'.findAll {it.name() == "subnet"}
\r
1001 def subnetsSize = subnets.size()
\r
1002 for (i in 0..subnetsSize-1) {
\r
1003 def subnet = subnets[i]
\r
1004 def subnetXml = XmlUtil.serialize(subnet)
\r
1005 def orchestrationStatus = utils.getNodeText1(subnetXml, "orchestration-status")
\r
1006 if (orchestrationStatus == "PendingDelete" || orchestrationStatus == "pending-delete") {
\r
1007 // skip, do not include in processing, remove!!!
\r
1009 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"]
\r
1010 rebuildingSubnets += buildSubNetworkElements(subnetXml, createNetworkResponse, subnetList, "subnet")
\r
1013 if (utils.nodeExists(subnetsData, 'relationship')) {
\r
1014 rebuildingSubnets = rebuildRelationship(requeryIdAAIResponse)
\r
1017 } catch (Exception ex) {
\r
1020 rebuildingSubnets += "</subnets>"
\r
1023 return rebuildingSubnets
\r
1026 def buildSubnets(queryIdResponse) {
\r
1027 def rebuildingSubnets = ""
\r
1028 def subnetsData = new XmlSlurper().parseText(queryIdResponse)
\r
1029 //rebuildingSubnets += "<subnets>"
\r
1031 def subnets = subnetsData.'**'.findAll {it.name() == "subnet"}
\r
1032 def subnetsSize = subnets.size()
\r
1033 for (i in 0..subnetsSize-1) {
\r
1034 def subnet = subnets[i]
\r
1035 def subnetXml = XmlUtil.serialize(subnet)
\r
1036 def orchestrationStatus = utils.getNodeText1(subnetXml, "orchestration-status")
\r
1037 if (orchestrationStatus == "pending-delete" || orchestrationStatus == "PendingDelete") {
\r
1038 // skip, do not include in processing, remove!!!
\r
1040 def subnetList = ["dhcp-start", "dhcp-end", "network-start-address", "cidr-mask", "dhcp-enabled", "gateway-address", "ip-version", "subnet-id", "subnet-name"]
\r
1041 rebuildingSubnets += buildSubNetworkElements(subnetXml, subnetList, "subnets")
\r
1042 //rebuildingSubnets += buildSubNetworkElements(subnetXml, subnetList, "")
\r
1044 } catch (Exception ex) {
\r
1047 //rebuildingSubnets += "</subnets>"
\r
1049 return rebuildingSubnets
\r
1053 // build subnet sub-network single elements
\r
1054 def buildSubNetworkElements(subnetXml, createNetworkResponse, elementList, parentName) {
\r
1057 if (parentName != "") {
\r
1058 xmlBuild += "<"+parentName+">"
\r
1060 if (subnetXml != null) {
\r
1061 for (element in elementList) {
\r
1062 def xml= new XmlSlurper().parseText(subnetXml)
\r
1063 var = xml.'**'.find {it.name() == element}
\r
1064 if (var != null) {
\r
1065 if (element=="orchestration-status") {
\r
1066 if(var.toString() == 'pending-create' || var.toString() == 'PendingCreate') {
\r
1067 xmlBuild += "<"+element+">"+"Created"+"</"+element+">"
\r
1068 } else { // pending-update or PendingUpdate'
\r
1069 xmlBuild += "<"+element+">"+"Active"+"</"+element+">"
\r
1071 } else { // "subnet-id", "neutron-subnet-id"
\r
1072 if (element=="subnet-id") {
\r
1073 if (utils.nodeExists(createNetworkResponse, "subnetMap")) {
\r
1074 xmlBuild += "<"+element+">"+var.toString()+"</"+element+">"
\r
1075 String neutronSubnetId = extractNeutSubId(createNetworkResponse, var.toString())
\r
1076 xmlBuild += "<neutron-subnet-id>"+neutronSubnetId+"</neutron-subnet-id>"
\r
1079 if (element=="neutron-subnet-id") {
\r
1082 xmlBuild += "<"+element+">"+var.toString()+"</"+element+">"
\r
1090 if (parentName != "") {
\r
1091 xmlBuild += "</"+parentName+">"
\r
1096 // build subnet sub-network single elements
\r
1097 def buildSubNetworkElements(subnetXml, elementList, parentName) {
\r
1100 if (parentName != "") {
\r
1101 xmlBuild += "<"+parentName+">"
\r
1103 if (subnetXml != null) {
\r
1104 def networkStartAddress = ""
\r
1105 for (element in elementList) {
\r
1106 def xml= new XmlSlurper().parseText(subnetXml)
\r
1107 var = xml.'**'.find {it.name() == element}
\r
1108 if (element == "dhcp-start") {
\r
1109 xmlBuild += "<allocationPools>"
\r
1110 if (var.toString() == 'null') {
\r
1111 xmlBuild += "<start>"+""+"</start>"
\r
1113 xmlBuild += "<start>"+var.toString()+"</start>"
\r
1116 if (element == "dhcp-end") {
\r
1117 if (var.toString() == 'null') {
\r
1118 xmlBuild += "<end>"+""+"</end>"
\r
1120 xmlBuild += "<end>"+var.toString()+"</end>"
\r
1122 xmlBuild += "</allocationPools>"
\r
1124 if (element == "network-start-address" || element == "cidr-mask") {
\r
1125 if (element == "network-start-address") {
\r
1126 networkStartAddress = var.toString()
\r
1128 if (element == "cidr-mask") {
\r
1129 xmlBuild += "<cidr>"+networkStartAddress+"/"+var.toString()+"</cidr>"
\r
1132 if (element == "dhcp-enabled") {
\r
1133 xmlBuild += "<enableDHCP>"+var.toString()+"</enableDHCP>"
\r
1135 if (element == "gateway-address") {
\r
1136 xmlBuild += "<gatewayIp>"+var.toString()+"</gatewayIp>"
\r
1138 if (element == "ip-version") {
\r
1139 xmlBuild += "<ipVersion>"+var.toString()+"</ipVersion>"
\r
1141 if (element == "subnet-id") {
\r
1142 xmlBuild += "<subnetId>"+var.toString()+"</subnetId>"
\r
1144 if ((element == "subnet-name") && (var != null)) {
\r
1145 xmlBuild += "<subnetName>"+var.toString()+"</subnetName>"
\r
1149 if (parentName != "") {
\r
1150 xmlBuild += "</"+parentName+">"
\r
1155 // rebuild ctag-assignments
\r
1156 def rebuildCtagAssignments(xmlInput) {
\r
1157 def rebuildingCtagAssignments = ""
\r
1158 if (xmlInput!=null) {
\r
1159 def ctagAssignmentsData = new XmlSlurper().parseText(xmlInput)
\r
1160 rebuildingCtagAssignments += "<ctag-assignments>"
\r
1161 def ctagAssignments = ctagAssignmentsData.'**'.findAll {it.name() == "ctag-assignment"}
\r
1162 def ctagAssignmentsSize = ctagAssignments.size()
\r
1163 for (i in 0..ctagAssignmentsSize-1) {
\r
1164 def ctagAssignment = ctagAssignments[i]
\r
1165 def ctagAssignmentXml = XmlUtil.serialize(ctagAssignment)
\r
1166 rebuildingCtagAssignments += "<ctag-assignment>"
\r
1167 List elementList = ["vlan-id-inner", "resource-version"]
\r
1168 rebuildingCtagAssignments += buildXMLElements(ctagAssignmentXml, "" , "", elementList)
\r
1169 if (utils.nodeExists(ctagAssignmentXml, 'relationship')) {
\r
1170 rebuildingCtagAssignments += rebuildRelationship(ctagAssignmentXml)
\r
1172 rebuildingCtagAssignments += "</ctag-assignment>"
\r
1174 rebuildingCtagAssignments += "</ctag-assignments>"
\r
1176 return rebuildingCtagAssignments
\r
1179 // rebuild 'relationship-list'
\r
1180 def rebuildRelationship(xmlInput) {
\r
1181 def rebuildingSubnets = ""
\r
1182 if (xmlInput!=null) {
\r
1183 def subnetsData = new XmlSlurper().parseText(xmlInput)
\r
1184 rebuildingSubnets += "<relationship-list>"
\r
1185 def relationships = subnetsData.'**'.findAll {it.name() == "relationship"}
\r
1186 def relationshipsSize = relationships.size()
\r
1187 for (i in 0..relationshipsSize-1) {
\r
1188 def relationship = relationships[i]
\r
1189 def relationshipXml = XmlUtil.serialize(relationship)
\r
1190 rebuildingSubnets += "<relationship>"
\r
1191 def relationshipList = ["related-to", "related-link"]
\r
1192 rebuildingSubnets += buildSubNetworkElements(relationshipXml, "", relationshipList, "")
\r
1193 if (utils.nodeExists(relationshipXml, 'relationship-data')) {
\r
1194 def relationshipDataXmlData = new XmlSlurper().parseText(relationshipXml)
\r
1195 def relationshipsData = relationshipDataXmlData.'**'.findAll {it.name() == "relationship-data"}
\r
1196 def relationshipsDataSize = relationshipsData.size()
\r
1197 for (j in 0..relationshipsDataSize-1) {
\r
1198 def relationshipData = relationshipsData[j]
\r
1199 def relationshipDataXml = XmlUtil.serialize(relationshipData)
\r
1200 def relationshipDataList = ["relationship-key", "relationship-value"]
\r
1201 rebuildingSubnets += buildXMLElements(relationshipDataXml, "", "relationship-data", relationshipDataList)
\r
1204 if (utils.nodeExists(relationshipXml, 'related-to-property')) {
\r
1205 def relationshipDataXmlData = new XmlSlurper().parseText(relationshipXml)
\r
1206 def relationshipsData = relationshipDataXmlData.'**'.findAll {it.name() == "related-to-property"}
\r
1207 def relationshipsDataSize = relationshipsData.size()
\r
1208 for (j in 0..relationshipsDataSize-1) {
\r
1209 def relationshipData = relationshipsData[j]
\r
1210 def relationshipDataXml = XmlUtil.serialize(relationshipData)
\r
1211 def relationshipDataList = ["property-key", "property-value"]
\r
1212 rebuildingSubnets += buildXMLElements(relationshipDataXml, "", "related-to-property", relationshipDataList)
\r
1216 rebuildingSubnets += "</relationship>"
\r
1218 rebuildingSubnets += "</relationship-list>"
\r
1220 return rebuildingSubnets
\r
1223 def buildVlans(queryIdResponse) {
\r
1224 def rebuildingSubnets = "<vlans>"
\r
1225 def subnetsData = new XmlSlurper().parseText(queryIdResponse)
\r
1228 def subnets = subnetsData.'**'.findAll {it.name() == "segmentation-assignments"}
\r
1229 def subnetsSize = subnets.size()
\r
1230 for (i in 0..subnetsSize-1) {
\r
1231 def subnet = subnets[i]
\r
1232 def subnetXml = XmlUtil.serialize(subnet)
\r
1234 String vlan = utils.getNodeText1(subnetXml, "segmentation-id")
\r
1236 rebuildingSubnets += ","
\r
1238 rebuildingSubnets += vlan
\r
1240 } catch (Exception ex) {
\r
1243 //rebuildingSubnets += "</subnets>"
\r
1244 rebuildingSubnets += "</vlans>"
\r
1246 return rebuildingSubnets
\r
1249 /* Utility code to rebuild xml/elements in a list:
\r
1250 * rebuild xml with 1) unbounded groups of elements; or
\r
1251 * 2) one group of elements; or
\r
1252 * 3) just one or more elements (in a list as argument)
\r
1253 * @param xmlInput the XML document
\r
1254 * @param parentName the parent name (ex: 'inputs')
\r
1255 * @param childrenName the chilrendName (ex: 'entry' as unbounded/occurs>1)
\r
1256 * @param elementList the element list of children (ex: 'key', 'value')
\r
1257 * @return a string of rebuild xml
\r
1262 * <ws:key>name</ws:key>
\r
1263 * <ws:value>Edward</ws:value>
\r
1266 * <ws:key>age</ws:key>
\r
1267 * <ws:value>30</ws:value>
\r
1270 * <ws:key>age</ws:key>
\r
1271 * <ws:value>30</ws:value>
\r
1275 * List elementList = ["key", "value"]
\r
1276 * String rebuild = buildXMLElements(xmlInput, "inputs", "entry", elementList)
\r
1278 * Ex 2: xmlInput // no parent tag
\r
1279 * <ws:sdnc-request-header>
\r
1280 * <ws:svc-request-id>fec8ec88-151a-45c9-ad60-8233e0fc8ff2</ws:svc-request-id>
\r
1281 * <ws:svc-notification-url>https://msojra.mtsnj.aic.cip.openecomp.com:8443/adapters/rest/SDNCNotify</ws:svc-notification-url>
\r
1282 * <ws:svc-action>assign</ws:svc-action>
\r
1283 * </ws:sdnc-request-header>
\r
1285 * List elementList = ["svc-request-id", "svc-notification-url", "svc-action"]
\r
1286 * String rebuild = buildXMLElements(xmlInput, "" , "sdnc-request-header", elementList) // no parent tag
\r
1288 * Ex 3: xmlInput // elements one after another (with no parent & children tag)
\r
1289 * <ws:test-id>myTestid</ws:test-id>
\r
1290 * <ws:test-user>myUser</ws:test-user>
\r
1292 * List elementList = ["test-id", "test-user"]
\r
1293 * String rebuild = buildXMLElements(xmlInput, "" , "", elementList)
\r
1296 def buildXMLElements(xmlInput, parentName, childrenName, elementList) {
\r
1297 def varChildren = ""
\r
1299 def xmlBuildUnbounded = ""
\r
1300 if (parentName!="") {xmlBuildUnbounded += "<"+parentName+">" +'\n'}
\r
1301 if (xmlInput != null) {
\r
1302 def xml= new XmlSlurper().parseText(xmlInput)
\r
1303 if (childrenName!="") {
\r
1304 varChildren = xml.'**'.findAll {it.name() == childrenName}
\r
1305 for (i in 0..varChildren.size()-1) {
\r
1306 xmlBuildUnbounded += "<"+childrenName+">" +'\n'
\r
1307 for (element in elementList) {
\r
1308 var = varChildren[i].'*'.find {it.name() == element}
\r
1309 if (var != null) {
\r
1310 xmlBuildUnbounded += "<"+element+">"+var.toString()+"</"+element+">" +'\n'
\r
1313 xmlBuildUnbounded += "</"+childrenName+">" +'\n'
\r
1316 for (element in elementList) {
\r
1317 var = xml.'*'.find {it.name() == element}
\r
1318 if (var != null) {
\r
1319 xmlBuildUnbounded += "<"+element+">"+var.toString()+"</"+element+">" +'\n'
\r
1325 if (parentName!="") {xmlBuildUnbounded += "</"+parentName+">" +'\n'}
\r
1326 return xmlBuildUnbounded
\r
1329 def getFirstNodeXml(xmlInput, element){
\r
1330 def nodeAsText = ""
\r
1331 def nodeToSerialize = ""
\r
1332 if (xmlInput != null) {
\r
1333 def fxml= new XmlSlurper().parseText(xmlInput)
\r
1334 if (utils.nodeExists(xmlInput, "payload")) {
\r
1335 nodeToSerialize = fxml.'payload'.'l3-network'.'*'.find {it.name() == element}
\r
1336 if (nodeToSerialize!=null) {
\r
1337 nodeAsText = XmlUtil.serialize(nodeToSerialize)
\r
1343 nodeToSerialize = fxml.'*'.find {it.name() == element}
\r
1344 if (nodeToSerialize!=null) {
\r
1345 nodeAsText = XmlUtil.serialize(nodeToSerialize)
\r
1356 //TODO: This method still needs to be tested before using.
\r
1359 * This method is similar to the gennetwork:ContrailNetworUpdateCompletedObject
\r
1360 * BPEL method. It extracts all of the required subnet information
\r
1361 * for each subnet listed with an orch status equal to the one provided
\r
1362 * and puts the corresponding infomation with the appropriate node for
\r
1363 * updating aai. The method sets the orch status for each subnet to active
\r
1365 * @param subnetsXml the entire subnets xml
\r
1366 * @param requestInput the request in the process
\r
1367 * @param queryIdResponse the response of REST AAI query by Id
\r
1368 * @param queryVpnBindingResponse the response of REST AAI query by vpn binding
\r
1369 * @param routeCollection the collection of vpnBinding's 'global-route-target'
\r
1370 * @return String request
\r
1372 public String networkUpdateSubnetInfo(String subnetsXml, String networkResponseXml){
\r
1374 String subnets = ""
\r
1375 StringBuilder sb = new StringBuilder()
\r
1376 InputSource source = new InputSource(new StringReader(subnetsXml));
\r
1377 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
\r
1378 docFactory.setNamespaceAware(true)
\r
1379 DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
\r
1380 Document xml = docBuilder.parse(source)
\r
1381 NodeList nodeList = xml.getElementsByTagNameNS("*", "subnet")
\r
1382 for (int x = 0; x < nodeList.getLength(); x++) {
\r
1383 Node node = nodeList.item(x)
\r
1384 String subnet = ""
\r
1385 if (node.getNodeType() == Node.ELEMENT_NODE) {
\r
1386 Element eElement = (Element) node
\r
1387 String subnetOrchStatus = eElement.getElementsByTagNameNS("*", "orchestration-status").item(0).getTextContent()
\r
1388 if(subnetOrchStatus.equals("pending-create")){
\r
1390 String subnetId = eElement.getElementsByTagNameNS("*", "subnet-id").item(0).getTextContent()
\r
1391 def netAddress = eElement.getElementsByTagNameNS("*", "network-start-address").item(0).getTextContent()
\r
1392 def mask = eElement.getElementsByTagNameNS("*", "cidr-mask").item(0).getTextContent()
\r
1393 def dhcpEnabledSubnet = eElement.getElementsByTagNameNS("*", "dhcp-enabled").item(0).getTextContent()
\r
1394 def gatewayAddress = eElement.getElementsByTagNameNS("*", "gateway-address").item(0).getTextContent()
\r
1395 def ipVersion = eElement.getElementsByTagNameNS("*", "ip-version").item(0).getTextContent()
\r
1396 def relationshipList = eElement.getElementsByTagNameNS("*", "relationship-list").item(0).getTextContent() //TODO: test this
\r
1397 String neutronSubnetId = extractNeutSubId(networkResponseXml, subnetId)
\r
1400 <subnetId>${subnetId}</subnetId>
\r
1401 <neutron-subnet-id>${neutronSubnetId}</neutron-subnet-id>
\r
1402 <gateway-address>${gatewayAddress}</gateway-address>
\r
1403 <network-start-address>${netAddress}</network-start-address>
\r
1404 <cidr-mask>${mask}</cidr-mask>
\r
1405 <ip-Version>${ipVersion}</ip-Version>
\r
1406 <orchestration-status>active</orchestration-status>
\r
1407 <dhcp-enabled>${dhcpEnabledSubnet}</dhcp-enabled>
\r
1408 <relationship-list>${relationshipList}</relationship-list>
\r
1411 }else if(subnetOrchStatus.equals("pending-delete")){
\r
1412 StringWriter writer = new StringWriter()
\r
1413 Transformer transformer = TransformerFactory.newInstance().newTransformer()
\r
1414 transformer.transform(new DOMSource(node), new StreamResult(writer))
\r
1415 subnet = writer.toString()
\r
1421 subnets = sb.append(subnet)
\r
1424 subnets = utils.removeXmlPreamble(subnets)
\r
1426 String subnetsList =
\r
1431 return subnetsList
\r
1437 * This method extracts the "value" node text for the the given subnet Id.
\r
1439 * @param String inputSource - xml that contains the subnet id key and value
\r
1440 * @param String subnetId - for which you want the value of
\r
1442 * @return String value - node text of node named value associated with the given subnet id
\r
1444 public String extractNeutSubId(String inputSource, String subnetId){
\r
1447 InputSource source = new InputSource(new StringReader(inputSource));
\r
1448 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
\r
1449 docFactory.setNamespaceAware(true)
\r
1450 DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
\r
1451 Document xml = docBuilder.parse(source)
\r
1452 NodeList nodeList = xml.getElementsByTagNameNS("*", "entry")
\r
1453 for (int x = 0; x < nodeList.getLength(); x++) {
\r
1454 Node node = nodeList.item(x)
\r
1455 String subnet = ""
\r
1456 if (node.getNodeType() == Node.ELEMENT_NODE) {
\r
1457 Element eElement = (Element) node
\r
1458 String key = eElement.getElementsByTagNameNS("*", "key").item(0).getTextContent()
\r
1459 if(key.equals(subnetId)){
\r
1460 value = eElement.getElementsByTagNameNS("*", "value").item(0).getTextContent()
\r
1467 public boolean isRollbackEnabled (Execution execution, String payloadXml) {
\r
1469 def rollbackEnabled = false
\r
1470 def rollbackValueSet = false
\r
1471 if (utils.nodeExists(payloadXml, "backout-on-failure")) {
\r
1472 String backoutValue = utils.getNodeText1(payloadXml, "backout-on-failure")
\r
1473 if (backoutValue != null && !backoutValue.isEmpty()) {
\r
1474 if (backoutValue.equalsIgnoreCase("false")) {
\r
1475 rollbackEnabled = false
\r
1478 rollbackEnabled = true
\r
1480 rollbackValueSet = true;
\r
1484 if (!rollbackValueSet) {
\r
1485 if (execution.getVariable("URN_mso_rollback") != null) {
\r
1486 rollbackEnabled = execution.getVariable("URN_mso_rollback").toBoolean()
\r
1489 return rollbackEnabled
\r