2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Modifications Copyright (c) 2019 Samsung
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
23 package org.onap.so.bpmn.common.scripts
25 import org.onap.so.logger.ErrorCode
27 import java.text.SimpleDateFormat
29 import org.apache.commons.codec.binary.Base64
30 import org.apache.commons.lang3.StringEscapeUtils
31 import org.onap.so.bpmn.core.BPMNLogger
32 import org.onap.so.bpmn.core.xml.XmlTool
33 import org.onap.so.logger.MessageEnum
34 import org.slf4j.Logger
35 import org.slf4j.LoggerFactory
36 import org.onap.so.utils.CryptoUtils
38 import org.w3c.dom.Element
40 import groovy.util.slurpersupport.NodeChild
41 import groovy.xml.XmlUtil
44 private static final Logger logger = LoggerFactory.getLogger( MsoUtils.class);
46 def initializeEndPoints(execution){
47 // use this placeholder to initialize end points, if called independently, this need to be set
48 execution.setVariable("AAIEndPoint","http://localhost:28080/SoapUIMocks")
52 * Returns the unescaped contents of element
58 def getNodeText(xmlInput,element){
61 def xml= new XmlSlurper().parseText(xmlInput)
62 rtn= xml.'**'.find{node->node.name()==element}
69 def getMultNodes(xmlInput, element){
72 def xml= new XmlSlurper().parseText(xmlInput)
73 nodes = xml.'**'.findAll{ node-> node.name() == element }*.text()
78 * Note: this uses XmlParser instead of XmlSlurper, thus it is not as
79 * efficient because it instantiates the whole DOM tree.
82 * @return a list of Nodes, or {@code null} if <i>xmlInput</i> is {@code null}
84 def getMultNodeObjects(xmlInput, element){
87 def xml= new XmlParser().parseText(xmlInput)
88 nodes = xml.'**'.findAll{ node-> node.name() == element }
93 def getNodeXml(xmlInput,element){
94 return getNodeXml(xmlInput, element, true)
96 def getNodeXml(xmlInput,element,incPreamble){
97 def fxml= new XmlSlurper().parseText(xmlInput)
98 NodeChild nodeToSerialize = fxml.'**'.find {it.name() == element}
99 if(nodeToSerialize==null){
102 def nodeAsText = XmlUtil.serialize(nodeToSerialize)
104 nodeAsText = removeXmlPreamble(nodeAsText)
107 return unescapeNodeContents(nodeToSerialize, nodeAsText)
110 def unescapeNodeContents(NodeChild node, String text) {
111 if (!node.childNodes().hasNext()) {
112 return StringEscapeUtils.unescapeXml(text)
118 def nodeExists(xmlInput,element){
120 def fxml= new XmlSlurper().parseText(xmlInput)
121 def nodeToSerialize = fxml.'**'.find {it.name() == element}
122 return nodeToSerialize!=null
123 } catch(Exception e) {
129 /***** Utilities when using XmlParser *****/
132 * Convert a Node into a String by deserializing it and formatting it.
134 * @param node Node to be converted.
135 * @return the Node as a String.
137 def String nodeToString(Node node) {
138 def String nodeAsString = groovy.xml.XmlUtil.serialize(node)
139 nodeAsString = removeXmlPreamble(nodeAsString)
140 return formatXml(nodeAsString)
144 * Get the specified child Node of the specified parent. If there are
145 * multiple children of the same name, only the first one is returned.
146 * If there are no children with the specified name, 'null' is returned.
148 * @param parent Parent Node in which to find a child.
149 * @param childNodeName Name of the child Node to get.
150 * @return the (first) child Node with the specified name or 'null'
151 * if a child Node with the specified name does not exist.
153 def Node getChildNode(Node parent, String childNodeName) {
154 def NodeList nodeList = getIdenticalChildren(parent, childNodeName)
155 if (nodeList.size() == 0) {
158 return nodeList.get(0)
163 * Get the textual value of the specified child Node of the specified parent.
164 * If there are no children with the specified name, 'null' is returned.
166 * @param parent Parent Node in which to find a child.
167 * @param childNodeName Name of the child Node whose value to get.
168 * @return the textual value of child Node with the specified name or 'null'
169 * if a child Node with the specified name does not exist.
171 def String getChildNodeText(Node parent, String childNodeName) {
172 def Node childNode = getChildNode(parent, childNodeName)
173 if (childNode == null) {
176 return childNode.text()
181 * Get all of the child nodes from the specified parent that have the
182 * specified name. The returned NodeList could be empty.
184 * @param parent Parent Node in which to find children.
185 * @param childNodeName Name of the children to get.
186 * @return a NodeList of all the children from the parent with the specified
187 * name. The list could be empty.
189 def NodeList getIdenticalChildren(Node parent, String childNodeName) {
190 return (NodeList) parent.get(childNodeName)
193 /***** End of Utilities when using XmlParser *****/
196 /** these are covered under the common function above**/
197 def getSubscriberName(xmlInput,element){
200 def xml= new XmlSlurper().parseText(xmlInput)
201 rtn= xml.'**'.find{node->node.name()==element}.text()
205 def getTenantInformation(xmlInput,element){
206 def xml= new XmlSlurper().parseText(xmlInput)
207 def nodeToSerialize = xml.'**'.find {it.name() == 'service-information'}
208 def nodeAsText = XmlUtil.serialize(nodeToSerialize)
211 def getServiceInstanceId(xmlInput,element){
212 def xml= new XmlSlurper().parseText(xmlInput)
213 return ( xml.'**'.find{node->node.name()==element}.text() )
216 def searchResourceLink(xmlInput, resourceType){
217 def fxml= new XmlSlurper().parseText(xmlInput)
218 def element = fxml.'**'.find {it.'resource-type' == resourceType}
219 return (element == null) ? null : element.'resource-link'.text()
222 def searchMetaData(xmlInput, searchName, searchValue){
223 def fxml= new XmlSlurper().parseText(xmlInput)
224 def ret = fxml.'**'.find {it.metaname.text() == searchName && it.metaval.text() == searchValue}
226 return ret.parent().parent()
231 def searchMetaDataNode(fxml, searchName, searchValue){
232 def ret = fxml.'**'.find {it.metaname.text() == searchName && it.metaval.text() == searchValue}
234 return ret.parent().parent()
239 // for Trinity L3 add/delete bonding
240 def getPBGFList(isDebugLogEnabled, xmlInput){
241 log("DEBUG", "getPBGFList: xmlInput " + xmlInput,isDebugLogEnabled)
242 ArrayList myNodes = new ArrayList()
243 if(nodeExists(xmlInput,"nbnc-response-information")){
244 def respInfo=getNodeXml(xmlInput,"nbnc-response-information", false)
246 def fxml= new XmlSlurper().parseText(respInfo)
247 fxml.'virtual-datacenter-list'.each { vdc ->
248 //we only want to add two BGF per VDC, BGF1 and BGF2
249 def routerList = vdc.'router-list'.first()
250 routerList.each{ myList ->
251 def physNodes = myList.'**'.findAll {it.'border-element-tangibility'.text() =~ /PHYSICAL/}
257 def beid = nodeToAdd.'border-element-id'.text() +
258 " " + nodeToAdd.'border-element-type'.text() +
260 it.'border-element-id'.text() +
261 " " + it.'border-element-type'.text()
262 def mytag = nodeToAdd.'border-element-id'
263 mytag[0].replaceBody(beid)
266 def mytag = nodeToAdd.'vlan-id'
267 def ind = mytag.text().indexOf('.')
269 def vlan = mytag.text().substring(0,ind)
270 mytag[0].replaceBody(vlan)
272 myNodes.add(XmlUtil.serialize(nodeToAdd))
284 def getPBGFList(xmlInput){
285 getPBGFList("false", xmlInput)
288 def getMetaVal(node, name){
290 return node.'**'.find {it.metaname.text() == name}.metaval.text()
296 def log(logmode,logtxt,isDebugLogEnabled="false"){
297 if ("INFO"==logmode) {
298 logger.info(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, logtxt, "BPMN");
299 } else if ("WARN"==logmode) {
300 logger.warn ("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_WARNING.toString(), logtxt, "BPMN",
301 ErrorCode.UnknownError.getValue(), logtxt);
302 } else if ("ERROR"==logmode) {
303 logger.error("{} {} {} {} {}", MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), logtxt, "BPMN",
304 ErrorCode.UnknownError.getValue(), logtxt);
307 BPMNLogger.debug(isDebugLogEnabled, logtxt);
311 // headers: header - name-value
312 def getHeaderNameValue(xmlInput, nameAttribute){
315 def xml= new XmlSlurper().parseText(xmlInput)
316 rtn= xml.'**'.find {header->header.'@name'.text() == nameAttribute}.'@value'
322 * Gets the children of the specified element.
324 public String getChildNodes(xmlInput, element) {
325 def xml= new XmlSlurper().parseText(xmlInput)
326 def thisElement = xml.'**'.find {it.name() == element}
327 StringBuilder out = new StringBuilder()
328 if (thisElement != null) {
329 thisElement.children().each() {
330 String nodeAsText = removeXmlPreamble(XmlUtil.serialize(it))
331 if (out.length() > 0) {
332 out.append(System.lineSeparator())
334 out.append(nodeAsText)
337 return out.toString();
341 * Encodes a value so it can be used inside an XML text element.
343 * <b>Will double encode</b>
344 * @param s the string to encode
345 * @return the encoded string
347 public static String xmlEscape(Object value) {
348 return XmlTool.encode(value)
352 * Removes the preamble, if present, from an XML document.
353 * Also, for historical reasons, this also trims leading and trailing
354 * whitespace from the resulting document. TODO: remove the trimming
355 * and fix unit tests that depend on EXACT xml format.
356 * @param xml the XML document
357 * @return a possibly modified document
359 public String removeXmlPreamble(def xml) {
364 return XmlTool.removePreamble(xml).trim()
368 * Removes namespaces and namespace declarations from an XML document.
369 * @param xml the XML document
370 * @return a possibly modified document
372 public String removeXmlNamespaces(def xml) {
373 return XmlTool.removeNamespaces(xml);
377 * Use formatXml instead. Note: this method inserts an XML preamble.
380 def formatXML(xmlInput) {
383 if (xmlInput !=null) {
384 parseXml = new XmlParser().parseText(xmlInput)
385 formatXml = XmlUtil.serialize(parseXml)
390 * Reformats an XML document. The result will not contain an XML preamble
391 * or a trailing newline.
392 * @param xml the XML document
393 * @return a reformatted document
395 public String formatXml(def xml) {
396 return XmlTool.normalize(xml);
399 // build single elements
400 def buildElements(xmlInput, elementList, parentName) {
403 if (parentName != "") {
404 xmlBuild += "<tns2:"+parentName+">"
406 if (xmlInput != null) {
407 for (element in elementList) {
408 def xml= new XmlSlurper().parseText(xmlInput)
409 var = xml.'**'.find {it.name() == element}
411 xmlBuild += "<tns2:"+element+">"+var.toString()+"</tns2:"+element+">"
415 if (parentName != "") {
416 xmlBuild += "</tns2:"+parentName+">"
421 // build the Unbounded elements
422 def buildElementsUnbounded(xmlInput, elementList, parentName) {
425 def xmlBuildUnbounded = ""
426 if (xmlInput != null) {
427 def xml= new XmlSlurper().parseText(xmlInput)
428 varParents = xml.'**'.findAll {it.name() == parentName}
429 //println " Unbounded ${parentName} - varParent.Size() - " + varParents.size()
430 for (i in 0..varParents.size()-1) {
431 if (parentName != "") {
432 xmlBuildUnbounded += "<tns2:"+parentName+">"
434 for (element in elementList) {
435 var = varParents[i].'*'.find {it.name() == element}
437 xmlBuildUnbounded += "<tns2:"+element+">"+var.toString()+"</tns2:"+element+">"
438 //println " i = " + i + ", element: " + element + " = " + var.toString()
441 if (parentName != "") {
442 xmlBuildUnbounded += "</tns2:"+parentName+">"
446 return xmlBuildUnbounded
449 // Build l2-homing-information
450 def buildL2HomingInformation(xmlInput) {
451 def elementsL2HomingList = ["evc-name", "topology", "preferred-aic-clli","aic-version"]
452 def rebuildL2Home = ''
453 if (xmlInput != null) {
454 rebuildL2Home = buildElements(xmlInput, elementsL2HomingList, "l2-homing-information")
459 // Build internet-evc-access-information
460 def buildInternetEvcAccessInformation(xmlInput) {
461 def elementsInternetEvcAccessInformationList = ["internet-evc-speed-value", "internet-evc-speed-units", "ip-version"]
462 def rebuildInternetEvcAccess = ''
463 if (xmlInput != null) {
464 rebuildInternetEvcAccess = buildElements(xmlInput, elementsInternetEvcAccessInformationList, "internet-evc-access-information")
466 return rebuildInternetEvcAccess
469 // Build ucpe-vms-service-information
470 def buildUcpeVmsServiceInformation(xmlInput) {
471 def rebuildUcpeVmsServiceInformation = ''
472 if (xmlInput != null) {
473 def ucpeVmsServiceInformation = getNodeXml(xmlInput, "ucpe-vms-service-information").drop(38).trim()
474 rebuildUcpeVmsServiceInformation = "<tns2:ucpe-vms-service-information>"
475 // transport-service-information
476 rebuildUcpeVmsServiceInformation += "<tns2:transport-service-information>"
477 def transportServiceInformation = getNodeXml(ucpeVmsServiceInformation, "transport-service-information").drop(38).trim()
478 def elementsTransportServiceInformationList = ["transport-service-type"]
479 rebuildUcpeVmsServiceInformation += buildElements(transportServiceInformation, elementsTransportServiceInformationList, "")
481 def accessCircuitInfoList = ["access-circuit-id", "dual-mode"]
482 rebuildUcpeVmsServiceInformation += buildElementsUnbounded(transportServiceInformation, accessCircuitInfoList, "access-circuit-info")
483 } catch (Exception e) {
484 log("ERROR", " Optional - Exception ACCESS-CIRCUIT-INFO - 'access-circuit-info' ")
486 rebuildUcpeVmsServiceInformation += "</tns2:transport-service-information>"
488 def elementsUcpeInformationList = ["ucpe-host-name", "ucpe-activation-code", "out-of-band-management-modem" ]
489 rebuildUcpeVmsServiceInformation += buildElements(ucpeVmsServiceInformation, elementsUcpeInformationList, "ucpe-information")
491 rebuildUcpeVmsServiceInformation += "<tns2:vnf-list>"
492 def vnfListList = ["vnf-instance-id", "vnf-sequence-number", "vnf-type", "vnf-vendor", "vnf-model", "vnf-id", "prov-status", "operational-state", "orchestration-status", "equipment-role" ]
493 rebuildUcpeVmsServiceInformation += buildElementsUnbounded(ucpeVmsServiceInformation, vnfListList, "vnf-information")
494 rebuildUcpeVmsServiceInformation += "</tns2:vnf-list>"
495 rebuildUcpeVmsServiceInformation += "</tns2:ucpe-vms-service-information>"
497 log("DEBUG", " rebuildUcpeVmsServiceInformation - " + rebuildUcpeVmsServiceInformation)
498 return rebuildUcpeVmsServiceInformation
501 // Build internet-service-change-details
502 def buildInternetServiceChangeDetails(xmlInput) {
503 def rebuildInternetServiceChangeDetails = ""
504 if (xmlInput != null) {
506 def internetServiceChangeDetails = getNodeXml(xmlInput, "internet-service-change-details").drop(38).trim()
507 rebuildInternetServiceChangeDetails = "<tns:internet-service-change-details>"
508 rebuildInternetServiceChangeDetails += buildElements(internetServiceChangeDetails, ["internet-evc-speed-value"], "")
509 rebuildInternetServiceChangeDetails += buildElements(internetServiceChangeDetails, ["internet-evc-speed-units"], "")
510 rebuildInternetServiceChangeDetails += buildElements(internetServiceChangeDetails, ["v4-vr-lan-address"], "")
511 rebuildInternetServiceChangeDetails += buildElements(internetServiceChangeDetails, ["v4-vr-lan-prefix-length"], "")
513 def tProvidedV4LanPublicPrefixesChangesList = ["request-index", "v4-next-hop-address", "v4-lan-public-prefix", "v4-lan-public-prefix-length"]
514 rebuildInternetServiceChangeDetails += buildElementsUnbounded(internetServiceChangeDetails, tProvidedV4LanPublicPrefixesChangesList, "t-provided-v4-lan-public-prefixes")
515 } catch (Exception e) {
516 log("ERROR"," Optional - Exception in INTERNET-SERVICE-CHANGE-DETAILS 't-provided-v4-lan-public-prefixes ")
519 def tProvidedV6LanPublicPrefixesChangesList = ["request-index", "v6-next-hop-address", "v6-lan-public-prefix", "v6-lan-public-prefix-length"]
520 rebuildInternetServiceChangeDetails += buildElementsUnbounded(internetServiceChangeDetails, tProvidedV6LanPublicPrefixesChangesList, "t-provided-v6-lan-public-prefixes")
521 } catch (Exception e) {
522 log("ERROR"," Optional - Exception INTERNET-SERVICE-CHANGE-DETAILS 't-provided-v6-lan-public-prefixes ")
524 rebuildInternetServiceChangeDetails += "</tns:internet-service-change-details>"
525 } catch (Exception e) {
526 log("ERROR", " Optional - Exception INTERNET-SERVICE-CHANGE-DETAILS 'internet-service-change-details' ")
529 return rebuildInternetServiceChangeDetails
533 def buildVrLan(xmlInput) {
535 def rebuildVrLan = ''
536 if (xmlInput != null) {
538 rebuildVrLan = "<tns2:vr-lan>"
539 def vrLan = getNodeXml(xmlInput, "vr-lan").drop(38).trim()
540 rebuildVrLan += buildElements(vrLan, ["routing-protocol"], "")
543 def rebuildVrLanInterface = "<tns2:vr-lan-interface>"
544 def vrLanInterface = getNodeXml(vrLan, "vr-lan-interface").drop(38).trim()
545 rebuildVrLanInterface += buildVrLanInterfacePartial(vrLanInterface)
548 def dhcp = getNodeXml(vrLan, "dhcp").drop(38).trim()
549 def rebuildDhcp = buildDhcp(dhcp)
550 rebuildVrLanInterface += rebuildDhcp
553 def pat = getNodeXml(vrLan, "pat").drop(38).trim()
554 def rebuildPat = buildPat(pat)
555 rebuildVrLanInterface += rebuildPat
560 def nat = getNodeXml(vrLan, "nat").drop(38).trim()
561 rebuildNat = buildNat(nat)
562 } catch (Exception e) {
563 log("ERROR", " Optional - Exception 'nat' ")
565 rebuildVrLanInterface += rebuildNat
568 def firewallLite = getNodeXml(vrLan, "firewall-lite").drop(38).trim()
569 def rebuildFirewallLite = buildFirewallLite(firewallLite)
570 rebuildVrLanInterface += rebuildFirewallLite
573 def rebuildStaticRoutes = ""
575 def staticRoutes = getNodeXml(vrLan, "static-routes").drop(38).trim()
576 rebuildStaticRoutes = buildStaticRoutes(staticRoutes)
577 } catch (Exception e) {
578 log("ERROR", " Optional - Exception 'static-routes' ")
580 rebuildVrLanInterface += rebuildStaticRoutes
582 rebuildVrLan += rebuildVrLanInterface
583 rebuildVrLan += "</tns2:vr-lan-interface>"
584 rebuildVrLan += "</tns2:vr-lan>"
587 log("DEBUG", " rebuildVrLan - " + rebuildVrLan)
591 // Build vr-lan-interface
592 def buildVrLanInterfacePartial(xmlInput) {
593 def rebuildingVrLanInterface = ''
594 if (xmlInput != null) {
595 def vrLanInterfaceList = ["vr-designation", "v4-vr-lan-prefix", "v4-vr-lan-address", "v4-vr-lan-prefix-length", "v6-vr-lan-prefix", "v6-vr-lan-address", "v6-vr-lan-prefix-length", "v4-vce-loopback-address", "v6-vce-wan-address"]
596 rebuildingVrLanInterface += buildElements(xmlInput, vrLanInterfaceList, "")
597 rebuildingVrLanInterface += "<tns2:v4-public-lan-prefixes>"
599 def tProvidedV4LanPublicPrefixes = getNodeXml(xmlInput, "v4-public-lan-prefixes").drop(38).trim()
600 def tProvidedV4LanPublicPrefixesList = ["request-index", "v4-next-hop-address", "v4-lan-public-prefix", "v4-lan-public-prefix-length" ]
601 rebuildingVrLanInterface += buildElementsUnbounded(xmlInput, tProvidedV4LanPublicPrefixesList, "t-provided-v4-lan-public-prefixes")
602 } catch (Exception ex) {
603 log("ERROR", " Optional - Exception VR-LAN INTERFACE 'v4-public-lan-prefixes' ")
605 rebuildingVrLanInterface += "</tns2:v4-public-lan-prefixes>"
606 rebuildingVrLanInterface += "<tns2:v6-public-lan-prefixes>"
608 def tProvidedV6LanPublicPrefixes = getNodeXml(xmlInput, "v6-public-lan-prefixes").drop(38).trim()
609 def tProvidedV6LanPublicPrefixesList = ["request-index", "v6-next-hop-address", "v6-lan-public-prefix", "v6-lan-public-prefix-length" ]
610 rebuildingVrLanInterface += buildElementsUnbounded(xmlInput, tProvidedV6LanPublicPrefixesList, "t-provided-v6-lan-public-prefixes")
611 } catch (Exception e) {
612 log("ERROR", " Optional - Exception VR-LAN INTERFACE 'v6-public-lan-prefixes' ")
614 rebuildingVrLanInterface += "</tns2:v6-public-lan-prefixes>"
616 log("DEBUG", " rebuildingVrLanInterface - " + rebuildingVrLanInterface)
617 return rebuildingVrLanInterface
621 def buildDhcp(xmlInput) {
622 def rebuildingDhcp = ''
623 if (xmlInput != null) {
624 def dhcpData = new XmlSlurper().parseText(xmlInput)
625 rebuildingDhcp = "<tns2:dhcp>"
626 def dhcpList1 = ["v4-dhcp-server-enabled", "v6-dhcp-server-enabled", "use-v4-default-pool", "v4-dhcp-default-pool-prefix", "v4-dhcp-default-pool-prefix-length"]
627 rebuildingDhcp += buildElements(xmlInput, dhcpList1, "")
629 def excludedV4DhcpAddressesFromDefaultPoolList = ["excluded-v4-address"]
630 rebuildingDhcp += buildElementsUnbounded(xmlInput, excludedV4DhcpAddressesFromDefaultPoolList, "excluded-v4-dhcp-addresses-from-default-pool")
631 } catch (Exception e) {
632 log("ERROR", " Optional - Exception DHCP 'excluded-v4-dhcp-addresses-from-default-pool' ")
635 def v4DhcpPools = dhcpData.'**'.findAll {it.name() == "v4-dhcp-pools"}
636 def v4DhcpPoolsSize = v4DhcpPools.size()
637 // println " v4DhcpPoolsSize = " + v4DhcpPools.size()
638 for (i in 0..v4DhcpPoolsSize-1) {
639 def v4DhcpPool = v4DhcpPools[i]
640 def v4DhcpPoolXml = XmlUtil.serialize(v4DhcpPool)
641 rebuildingDhcp += "<tns2:v4-dhcp-pools>"
642 def v4DhcpPoolsList1 = ["v4-dhcp-pool-prefix", "v4-dhcp-pool-prefix-length" ]
643 rebuildingDhcp += buildElements(v4DhcpPoolXml, v4DhcpPoolsList1, "")
645 def excludedV4AddressesList = ["excluded-v4-address"]
646 rebuildingDhcp += buildElementsUnbounded(v4DhcpPoolXml, excludedV4AddressesList, "excluded-v4-addresses")
647 } catch (Exception e) {
648 log("ERROR", " Optional - Exception DHCP 'excluded-v4-addresses' ")
650 def v4DhcpPoolsList2 = ["v4-dhcp-relay-gateway-address", "v4-dhcp-relay-next-hop-address"]
651 rebuildingDhcp += buildElements(v4DhcpPoolXml, v4DhcpPoolsList2, "")
652 rebuildingDhcp += "</tns2:v4-dhcp-pools>"
654 } catch (Exception e) {
655 log("ERROR"," Optional - Exception DHCP 'v4-dhcp-pools' ")
657 def dhcpList2 = ["use-v6-default-pool", "v6-dhcp-default-pool-prefix", "v6-dhcp-default-pool-prefix-length"]
658 rebuildingDhcp += buildElements(xmlInput, dhcpList2, "")
660 def excludedV6DhcpAddressesFromDdefaultPoolList = ["excluded-v6-address"]
661 rebuildingDhcp += buildElementsUnbounded(xmlInput, excludedV6DhcpAddressesFromDdefaultPoolList, "excluded-v6-dhcp-addresses-from-default-pool")
662 } catch (Exception e) {
663 log("ERROR", " Optional - Exception DHCP 'excluded-v6-dhcp-addresses-from-default-pool' ")
666 def v6DhcpPools = dhcpData.'**'.findAll {it.name() == "v6-dhcp-pools"}
667 def v6DhcpPoolsSize = v6DhcpPools.size()
668 //println " v6DhcpPoolsSize = " + v6DhcpPools.size()
669 for (i in 0..v6DhcpPoolsSize-1) {
670 def v6DhcpPool = v6DhcpPools[i]
671 def v6DhcpPoolXml = XmlUtil.serialize(v6DhcpPool)
672 rebuildingDhcp += "<tns2:v6-dhcp-pools>"
673 def v6DhcpPoolsList1 = ["v6-dhcp-pool-prefix", "v6-dhcp-pool-prefix-length"]
674 rebuildingDhcp += buildElements(v6DhcpPoolXml, v6DhcpPoolsList1, "")
676 def excludedV6AddressesList = ["excluded-v6-address"]
677 rebuildingDhcp += buildElementsUnbounded(v6DhcpPoolXml, excludedV6AddressesList, "excluded-v6-addresses")
678 } catch (Exception e) {
679 log("ERROR", " Optional - Exception DHCP 'excluded-v6-addresses' ")
681 def v6DhcpPoolsList2 = ["v6-dhcp-relay-gateway-address", "v6-dhcp-relay-next-hop-address"]
682 rebuildingDhcp += buildElements(v6DhcpPoolXml, v6DhcpPoolsList2, "")
683 rebuildingDhcp += "</tns2:v6-dhcp-pools>"
685 } catch (Exception e) {
686 log("ERROR", " Optional - Exception DHCP 'v6-dhcp-pools' ")
688 rebuildingDhcp += "</tns2:dhcp>"
690 log("DEBUG", " rebuildingDhcp - " + rebuildingDhcp)
691 return rebuildingDhcp
695 def buildPat(xmlInput) {
696 def rebuildingPat = ''
697 if (xmlInput != null) {
698 rebuildingPat = "<tns2:pat>"
699 def patList = ["v4-pat-enabled", "use-v4-default-pool", "v4-pat-default-pool-prefix", "v4-pat-default-pool-prefix-length"]
700 rebuildingPat += buildElements(xmlInput, patList, "")
702 def v4PatPools = getNodeXml(xmlInput, "v4-pat-pools").drop(38).trim()
703 def v4PatPoolsList = ["v4-pat-pool-prefix", "v4-pat-pool-prefix-length", "v4-pat-pool-next-hop-address"]
704 rebuildingPat += buildElementsUnbounded(xmlInput, v4PatPoolsList, "v4-pat-pools")
705 } catch (Exception e) {
706 log("ERROR", " Optional - Exception 'v4-pat-pool-next-hop-address' ")
708 rebuildingPat += "</tns2:pat>"
710 log("DEBUG", " rebuildingPat - " + rebuildingPat)
715 def buildNat(xmlInput) {
716 def rebuildingNat = ''
717 if (xmlInput != null) {
718 rebuildingNat = "<tns2:nat>"
719 rebuildingNat += buildElements(xmlInput, ["v4-nat-enabled"], "")
721 def v4NatMappingEntries = getNodeXml(xmlInput, "v4-nat-mapping-entries").drop(38).trim()
722 def v4NatMappingEntriesList = ["v4-nat-internal", "v4-nat-next-hop-address", "v4-nat-external"]
723 rebuildingNat += buildElementsUnbounded(xmlInput, v4NatMappingEntriesList, "v4-nat-mapping-entries")
724 } catch (Exception e) {
725 log("ERROR", " Optional - Exception 'v4-nat-external' ")
727 rebuildingNat += "</tns2:nat>"
729 log("DEBUG", " rebuildingNat - " + rebuildingNat)
733 // Build firewall-lite
734 def buildFirewallLite(xmlInput) {
735 def rebuildingFirewallLite = ''
737 if (xmlInput != null) {
739 def firewallLiteData = new XmlSlurper().parseText(xmlInput)
740 rebuildingFirewallLite = "<tns2:firewall-lite>"
741 def firewallLiteList = ["stateful-firewall-lite-v4-enabled", "stateful-firewall-lite-v6-enabled"]
742 rebuildingFirewallLite += buildElements(xmlInput, firewallLiteList, "")
745 def v4FirewallPacketFilters = firewallLiteData.'**'.findAll {it.name() == "v4-firewall-packet-filters"}
746 def v4FirewallPacketFiltersSize = v4FirewallPacketFilters.size()
747 //println " v4FirewallPacketFiltersSize = " + v4FirewallPacketFilters.size()
748 for (i in 0..v4FirewallPacketFiltersSize-1) {
749 def v4FirewallPacketFilter = v4FirewallPacketFilters[i]
750 def v4FirewallPacketFilterXml = XmlUtil.serialize(v4FirewallPacketFilter)
751 rebuildingFirewallLite += "<tns2:v4-firewall-packet-filters>"
752 def v4FirewallPacketFiltersList = ["v4-firewall-prefix", "v4-firewall-prefix-length", "allow-icmp-ping"]
753 rebuildingFirewallLite += buildElements(v4FirewallPacketFilterXml, v4FirewallPacketFiltersList, "")
755 def udpPortsList = ["port-number"]
756 rebuildingFirewallLite += buildElementsUnbounded(v4FirewallPacketFilterXml, udpPortsList, "udp-ports")
757 } catch (Exception e) {
758 log("ERROR", " Optional - Exception FIREWALL-LITE v4 'udp-ports' ")
761 def tcpPortsList = ["port-number"]
762 rebuildingFirewallLite += buildElementsUnbounded(v4FirewallPacketFilterXml, tcpPortsList, "tcp-ports")
763 } catch (Exception e) {
764 log("ERROR", " Optional - Exception FIREWALL-LITE v4 'tcp-ports' ")
766 rebuildingFirewallLite += "</tns2:v4-firewall-packet-filters>"
768 } catch (Exception e) {
769 log("ERROR", " Optional - Exception FIREWALL-LITE 'v4-firewall-packet-filters' ")
773 def v6FirewallPacketFilters = firewallLiteData.'**'.findAll {it.name() == "v6-firewall-packet-filters"}
774 def v6FirewallPacketFiltersSize = v6FirewallPacketFilters.size()
775 //println " v6FirewallPacketFiltersSize = " + v6FirewallPacketFilters.size()
776 for (i in 0..v6FirewallPacketFiltersSize-1) {
777 def v6FirewallPacketFilter = v6FirewallPacketFilters[i]
778 def v6FirewallPacketFilterXml = XmlUtil.serialize(v6FirewallPacketFilter)
779 rebuildingFirewallLite += "<tns2:v6-firewall-packet-filters>"
780 def v6FirewallPacketFiltersList = ["v6-firewall-prefix", "v6-firewall-prefix-length", "allow-icmp-ping"]
781 rebuildingFirewallLite += buildElements(v6FirewallPacketFilterXml, v6FirewallPacketFiltersList, "")
783 def udpPortsList = ["port-number"]
784 rebuildingFirewallLite += buildElementsUnbounded(v6FirewallPacketFilterXml, udpPortsList, "udp-ports")
785 } catch (Exception e) {
786 log("ERROR", " Optional - Exception FIREWALL-LITE v6 'udp-ports' ")
789 def tcpPortsList = ["port-number"]
790 rebuildingFirewallLite += buildElementsUnbounded(v6FirewallPacketFilterXml, tcpPortsList, "tcp-ports")
791 } catch (Exception e) {
792 log("ERROR", " Optional - Exception FIREWALL-LITE v6 'tcp-ports' ")
794 rebuildingFirewallLite += "</tns2:v6-firewall-packet-filters>"
796 } catch (Exception e) {
797 log("ERROR", " Optional - Exception FIREWALL-LITE 'v6-firewall-packet-filters' ")
799 rebuildingFirewallLite+= "</tns2:firewall-lite>"
801 log("DEBUG", " rebuildingFirewallLite - " + rebuildingFirewallLite)
802 return rebuildingFirewallLite
805 def buildStaticRoutes(xmlInput) {
806 def rebuildingStaticRoutes = ''
807 if (xmlInput != null) {
808 rebuildingStaticRoutes = "<tns2:static-routes>"
809 def v4StaticRouteslist = ["v4-static-route-prefix","v4-static-route-prefix-length", "v4-next-hop-address"]
810 rebuildingStaticRoutes += buildElementsUnbounded(xmlInput, v4StaticRouteslist, "v4-static-routes")
811 def v6StaticRouteslist = ["v6-static-route-prefix","v6-static-route-prefix-length", "v6-next-hop-address"]
812 rebuildingStaticRoutes += buildElementsUnbounded(xmlInput, v6StaticRouteslist, "v6-static-routes")
813 rebuildingStaticRoutes += "</tns2:static-routes>"
815 log("DEBUG", " rebuildingStaticRoutes - " + rebuildingStaticRoutes)
816 return rebuildingStaticRoutes
819 public String generateCurrentTimeInUtc(){
820 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
821 sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
822 final String utcTime = sdf.format(new Date());
826 public String generateCurrentTimeInGMT(){
827 final SimpleDateFormat sdf = new SimpleDateFormat("E, d MMM yyyy h:m:s z");
828 sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
829 final String utcTime = sdf.format(new Date());
835 * @param encryptedAuth: encrypted credentials from urn properties
836 * @param msoKey: key to use to decrypt from urn properties
837 * @return base 64 encoded basic auth credentials
839 def getBasicAuth(encryptedAuth, msoKey){
840 if ((encryptedAuth == null || encryptedAuth.isEmpty()) || (msoKey == null || msoKey.isEmpty()))
843 def auth = decrypt(encryptedAuth, msoKey)
844 byte[] encoded = Base64.encodeBase64(auth.getBytes())
845 String encodedString = new String(encoded)
846 encodedString = "Basic " + encodedString
848 } catch (Exception ex) {
849 log("ERROR", "Unable to encode basic auth")
854 def encrypt(toEncrypt, msokey){
856 String result = CryptoUtils.encrypt(toEncrypt, msokey);
859 catch (Exception e) {
860 log("ERROR", "Failed to encrypt credentials")
864 def decrypt(toDecrypt, msokey){
866 String result = CryptoUtils.decrypt(toDecrypt, msokey);
869 catch (Exception e) {
870 log("ERROR", "Failed to decrypt credentials")
876 * Return URL with qualified host name (if any) or urn mapping
877 * @param String url from urn mapping
878 * @return String url with qualified host name
880 public String getQualifiedHostNameForCallback(String urnCallbackUrl) {
881 def callbackUrlToUse = urnCallbackUrl
883 //swap host name with qualified host name from the jboss properties
884 def qualifiedHostName = System.getProperty("jboss.qualified.host.name")
885 if(qualifiedHostName!=null){
886 log("DEBUG", "qualifiedHostName:\n" + qualifiedHostName)
887 callbackUrlToUse = callbackUrlToUse.replaceAll("(http://)(.*)(:28080*)", {orig, first, torepl, last -> "${first}${qualifiedHostName}${last}"})
890 log("DEBUG", "unable to grab qualified host name, using what's in urn properties for callbackurl. Exception was: " + e.printStackTrace())
892 return callbackUrlToUse
897 * Retrieves text context of the element if the element exists, returns empty string otherwise
898 * @param com.sun.org.apache.xerces.internal.dom.DeferredElementNSImpl element to parse
899 * param String tagName tagName
900 * @return String text content of the element
902 public String getElementText(Element element, String tagName) {
904 org.w3c.dom.NodeList nodeList = element.getElementsByTagNameNS("*", tagName)
905 if (nodeList != null && nodeList.length > 0) {
906 text = nodeList.item(0).getTextContent()
913 * Find the lowest unused module-index value in a given xml
915 public String getLowestUnusedIndex(String xml) {
916 if (xml == null || xml.isEmpty()) {
919 def moduleIndexList = getMultNodes(xml, "module-index")
920 if (moduleIndexList == null || moduleIndexList.size() == 0) {
924 def sortedModuleIndexList = moduleIndexList.sort{ a, b -> a as Integer <=> b as Integer}
926 for (i in 0..sortedModuleIndexList.size()-1) {
927 if (Integer.parseInt(sortedModuleIndexList[i]) != i) {
931 return sortedModuleIndexList.size().toString()
934 * This utility checks if there is transaction id already present in MDC.
935 * If found, it returns same else creates new, sets in MDC for future use before returning
936 * @return String RequestId in UUID format.
938 public String getRequestID()
940 String requestId = MDC.get("RequestId")
941 if(requestId == null || requestId.isEmpty())
943 requestId = java.util.UUID.randomUUID()
944 MDC.put("RequestId",requestId)
945 log("DEBUG","MsoUtils - Created new RequestId: " + requestId)
949 log("DEBUG","MsoUtils - Using existing RequestId: " + requestId)
956 * Remove all the empty nodes and attributes from the within the given node
958 * @return true if all empty nodes and attributes were removed.
960 public boolean cleanNode( Node node ) {
961 node.attributes().with { a ->
962 a.findAll { !it.value }.each { a.remove( it.key ) }
964 node.children().with { kids ->
965 kids.findAll { it instanceof Node ? !cleanNode( it ) : false }
966 .each { kids.remove( it ) }
968 node.attributes() || node.children() || node.text()
974 * @return String representation of xml after removing the empty nodes and attributes
976 public String cleanNode(String xmlString) {
977 def xml = new XmlParser(false, false).parseText(xmlString)
979 return XmlUtil.serialize(xml)