AT&T 1712 and 1802 release code
[so.git] / bpmn / MSOCommonBPMN / src / main / groovy / org / openecomp / mso / bpmn / common / scripts / NetworkUtils.groovy
index 3ff2863..f6b3654 100644 (file)
@@ -1,6 +1,6 @@
 /*-\r
  * ============LICENSE_START=======================================================\r
- * OPENECOMP - MSO\r
+ * ONAP - SO\r
  * ================================================================================\r
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
  * ================================================================================\r
@@ -33,7 +33,7 @@ import javax.xml.transform.dom.DOMSource
 import javax.xml.transform.stream.StreamResult\r
 \r
 import org.camunda.bpm.engine.delegate.BpmnError\r
-import org.camunda.bpm.engine.runtime.Execution\r
+import org.camunda.bpm.engine.delegate.DelegateExecution\r
 import org.w3c.dom.Document\r
 import org.w3c.dom.Element\r
 \r
@@ -43,7 +43,7 @@ import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource\r
 \r
 import org.camunda.bpm.engine.delegate.BpmnError\r
-import org.camunda.bpm.engine.runtime.Execution\r
+import org.camunda.bpm.engine.delegate.DelegateExecution\r
 import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor;\r
 import org.w3c.dom.Document\r
 import org.w3c.dom.Element\r
@@ -73,7 +73,7 @@ class NetworkUtils {
         * @param requestInput the request in the process\r
         * @param queryIdResponse the response of REST AAI query by Id\r
         * @param routeCollection the collection\r
-        * @param policyFqdns the policy \r
+        * @param policyFqdns the policy\r
         * @param tableCollection the collection\r
         * @param cloudRegionId the cloud-region-region\r
         * @return String request\r
@@ -84,12 +84,12 @@ class NetworkUtils {
                                String serviceInstanceId = ""\r
                                String sharedValue = ""\r
                                String externalValue = ""\r
-                       \r
+\r
                                if (source == "VID") {\r
                                        sharedValue = utils.getNodeText1(queryIdResponse, "is-shared-network") != null ? utils.getNodeText1(queryIdResponse, "is-shared-network") : "false"\r
                                        externalValue = utils.getNodeText1(queryIdResponse, "is-external-network") != null ? utils.getNodeText1(queryIdResponse, "is-external-network") : "false"\r
                                        serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id")\r
-                                       \r
+\r
                                } else { // source = 'PORTAL'\r
                                        sharedValue = getParameterValue(requestInput, "shared")\r
                                        externalValue = getParameterValue(requestInput, "external")\r
@@ -101,24 +101,28 @@ class NetworkUtils {
                                        String netParams = utils.getNodeXml(requestInput, "network-params", false).replace("tag0:","").replace(":tag0","")\r
                                        networkParams = buildParams(netParams)\r
                                }\r
-                                                                       \r
+\r
                                String failIfExists = "false"\r
                                // requestInput\r
                                String cloudRegion = cloudRegionId\r
                                String tenantId = utils.getNodeText1(requestInput, "tenant-id")\r
+\r
                                String networkType = ""\r
+                               String modelCustomizationUuid = ""\r
                                if (utils.nodeExists(requestInput, "networkModelInfo")) {\r
                                        String networkModelInfo = utils.getNodeXml(requestInput, "networkModelInfo", false).replace("tag0:","").replace(":tag0","")\r
                                        networkType = utils.getNodeText1(networkModelInfo, "modelName")\r
+                                       modelCustomizationUuid = utils.getNodeText1(networkModelInfo, "modelCustomizationUuid")\r
                                } else {\r
-                                   networkType = utils.getNodeText1(queryIdResponse, "network-type")\r
+                                       networkType = utils.getNodeText1(queryIdResponse, "network-type")\r
+                                       modelCustomizationUuid = utils.getNodeText1(requestInput, "modelCustomizationId")\r
                                }\r
-                               \r
+\r
                                // queryIdResponse\r
                                String networkName = utils.getNodeText1(queryIdResponse, "network-name")\r
                                String networkId = utils.getNodeText1(queryIdResponse, "network-id")\r
                                String networkTechnology = utils.getNodeText1(queryIdResponse, "network-technology")\r
-                               \r
+\r
                                // contrailNetwork - networkTechnology = 'Contrail' vs. 'AIC_SR_IOV')\r
                                String contrailNetwork = ""\r
                                if (networkTechnology.contains('Contrail') || networkTechnology.contains('contrail') || networkTechnology.contains('CONTRAIL')) {\r
@@ -131,7 +135,7 @@ class NetworkUtils {
                                                         </contrailNetwork>"""\r
                                        networkTechnology = "CONTRAIL"    // replace\r
                            }\r
-                                                               \r
+\r
                                // rebuild subnets\r
                                String subnets = ""\r
                                if (utils.nodeExists(queryIdResponse, "subnets")) {\r
@@ -140,10 +144,10 @@ class NetworkUtils {
                                }\r
 \r
                                String physicalNetworkName = ""\r
-                               physicalNetworkName = utils.getNodeText1(queryIdResponse, "physical-network-name") \r
-                               \r
+                               physicalNetworkName = utils.getNodeText1(queryIdResponse, "physical-network-name")\r
+\r
                                String vlansCollection = buildVlans(queryIdResponse)\r
-                               \r
+\r
                                String notificationUrl = ""                                   //TODO - is this coming from URN? What variable/value to use?\r
                                //String notificationUrl = execution.getVariable("URN_?????") //TODO - is this coming from URN? What variable/value to use?\r
 \r
@@ -165,7 +169,7 @@ class NetworkUtils {
                                                                        <skipAAI>true</skipAAI>\r
                                                                        <backout>${backoutOnFailure}</backout>\r
                                                                        <failIfExists>${failIfExists}</failIfExists>\r
-                                                                       ${networkParams}        \r
+                                                                       ${networkParams}\r
                                                                        <msoRequest>\r
                                                                                <requestId>${requestId}</requestId>\r
                                                                                <serviceInstanceId>${serviceInstanceId}</serviceInstanceId>\r
@@ -176,9 +180,9 @@ class NetworkUtils {
                                                                """.trim()\r
                }\r
                return createNetworkRequest\r
-               \r
+\r
        }\r
-       \r
+\r
        /**\r
         * This method returns the string for Network request\r
         * V2 for Contrail 3.x will populate cloud-region data in same cloudSiteId filed\r
@@ -197,18 +201,18 @@ class NetworkUtils {
                                String serviceInstanceId = ""\r
                                String sharedValue = ""\r
                                String externalValue = ""\r
-                       \r
+\r
                                if (source == "VID") {\r
                                        sharedValue = utils.getNodeText1(queryIdResponse, "is-shared-network") != null ? utils.getNodeText1(queryIdResponse, "is-shared-network") : "false"\r
                                        externalValue = utils.getNodeText1(queryIdResponse, "is-external-network") != null ? utils.getNodeText1(queryIdResponse, "is-external-network") : "false"\r
                                        serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id")\r
-                                       \r
+\r
                                } else { // source = 'PORTAL'\r
                                        sharedValue = getParameterValue(requestInput, "shared")\r
                                        externalValue = getParameterValue(requestInput, "external")\r
                                        serviceInstanceId = utils.getNodeText1(requestInput, "service-instance-id") != null ? utils.getNodeText1(requestInput, "service-instance-id") : ""\r
                                }\r
-                                                               \r
+\r
                                String failIfExists = "false"\r
                                // requestInput\r
                                String cloudRegion = cloudRegionId\r
@@ -226,9 +230,9 @@ class NetworkUtils {
                                        modelCustomizationUuid = utils.getNodeText1(networkModelInfo, "modelCustomizationUuid")\r
                                } else {\r
                                        networkType = utils.getNodeText1(queryIdResponse, "network-type")\r
+                                       modelCustomizationUuid = utils.getNodeText1(requestInput, "modelCustomizationId")\r
                                }\r
 \r
-\r
                                // rebuild subnets\r
                                String subnets = ""\r
                                if (utils.nodeExists(queryIdResponse, "subnets")) {\r
@@ -241,16 +245,16 @@ class NetworkUtils {
                                        String netParams = utils.getNodeXml(requestInput, "network-params", false).replace("tag0:","").replace(":tag0","")\r
                                        networkParams = buildParams(netParams)\r
                                }\r
-                                       \r
+\r
                                String networkStackId = utils.getNodeText1(queryIdResponse, "heat-stack-id")\r
                                if (networkStackId == 'null' || networkStackId == "" || networkStackId == null) {\r
                                        networkStackId = "force_update"\r
                                }\r
-                               \r
+\r
                                String physicalNetworkName = utils.getNodeText1(queryIdResponse, "physical-network-name")\r
                                String vlansCollection = buildVlans(queryIdResponse)\r
-                               \r
-                               updateNetworkRequest = \r
+\r
+                               updateNetworkRequest =\r
                          """<updateNetworkRequest>\r
                                                                <cloudSiteId>${cloudRegion}</cloudSiteId>\r
                                                                <tenantId>${tenantId}</tenantId>\r
@@ -276,7 +280,7 @@ class NetworkUtils {
                                                                <skipAAI>true</skipAAI>\r
                                                                <backout>${backoutOnFailure}</backout>\r
                                                                <failIfExists>${failIfExists}</failIfExists>\r
-                                                                       ${networkParams}        \r
+                                                                       ${networkParams}\r
 \r
                                                                <msoRequest>\r
                                                                  <requestId>${requestId}</requestId>\r
@@ -285,10 +289,10 @@ class NetworkUtils {
                                                                <messageId>${messageId}</messageId>\r
                                                                <notificationUrl></notificationUrl>\r
                                                        </updateNetworkRequest>""".trim()\r
-                                                  \r
+\r
                }\r
                return updateNetworkRequest\r
-               \r
+\r
        }\r
 \r
        /**\r
@@ -331,7 +335,7 @@ class NetworkUtils {
                                <heat-stack-id></heat-stack-id>\r
                                <vnf-type>${vnfType}</vnf-type>\r
                                <orchestration-status>Pending</orchestration-status>\r
-                               <vf-module-persona-model-customization-id>${modelCustomizationId}</vf-module-persona-model-customization-id>\r
+                               <vf-module-model-customization-id>${modelCustomizationId}</vf-module-model-customization-id>\r
                                <relationship-list>\r
                                   <relationship>\r
                                           <related-to>tenant</related-to>\r
@@ -353,9 +357,9 @@ class NetworkUtils {
 \r
                                return requestPayload\r
                        }\r
-       \r
+\r
        def String createCloudRegionVolumeRequest(groupId, volumeName, vnfType, vnfId, tenantId, cloudRegion, namespace, modelCustomizationId) {\r
-               \r
+\r
                String requestPayload =\r
                """<volume-group xmlns="${namespace}">\r
                        <volume-group-id>${groupId}</volume-group-id>\r
@@ -363,7 +367,7 @@ class NetworkUtils {
                        <heat-stack-id></heat-stack-id>\r
                        <vnf-type>${vnfType}</vnf-type>\r
                        <orchestration-status>Pending</orchestration-status>\r
-                       <vf-module-persona-model-customization-id>${modelCustomizationId}</vf-module-persona-model-customization-id>\r
+                       <vf-module-model-customization-id>${modelCustomizationId}</vf-module-model-customization-id>\r
                        <relationship-list>\r
                                <relationship>\r
                                   <related-to>generic-vnf</related-to>\r
@@ -389,7 +393,7 @@ class NetworkUtils {
                           </relationship>\r
                   </relationship-list>\r
                </volume-group>"""\r
-       \r
+\r
                return requestPayload\r
        }\r
 \r
@@ -420,7 +424,7 @@ class NetworkUtils {
                                        <vnf-type>${vnfType}</vnf-type>\r
                                        <orchestration-status>Active</orchestration-status>\r
                                        <resource-version>${resourceVersion}</resource-version>\r
-                                       <vf-module-persona-model-customization-id>${modelCustomizationId}</vf-module-persona-model-customization-id>\r
+                                       <vf-module-model-customization-id>${modelCustomizationId}</vf-module-model-customization-id>\r
                                        ${relationshipList}\r
                                 </volume-group>"""\r
                }\r
@@ -480,7 +484,7 @@ class NetworkUtils {
                        } else {\r
                           createNetworkContrailResponse = utils.getNodeXml(createNetworkResponse, "updateNetworkContrailResponse", false).replace("tag0:","").replace(":tag0","")\r
                        }\r
-                          \r
+\r
                        // rebuild network\r
                        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
                                                             "physical-network-name", "is-provider-network", "is-shared-network", "is-external-network"]\r
@@ -495,10 +499,14 @@ class NetworkUtils {
                        // rebuild 'segmentation-assignments'\r
                        def rebuildSegmentationAssignments = ""\r
                        if (utils.nodeExists(requeryIdAAIResponse, 'segmentation-assignments')) {\r
-                               List elementList = ["segmentation-id"]  \r
-                               rebuildSegmentationAssignments =  buildXMLElements(requeryIdAAIResponse, "", "segmentation-assignments", elementList)\r
+                               List elementList = ["segmentation-id", "resource-version"]\r
+                               if (utils.nodeExists(requeryIdAAIResponse, 'segmentation-assignment')) {  // new tag\r
+                                   rebuildSegmentationAssignments =  buildXMLElements(requeryIdAAIResponse, "segmentation-assignments", "segmentation-assignment", elementList)\r
+                               } else {\r
+                                  rebuildSegmentationAssignments =  buildXMLElements(requeryIdAAIResponse, "", "segmentation-assignments", elementList)\r
+                               }   \r
                        }\r
-                       \r
+\r
                        // rebuild 'ctag-assignments' / rebuildCtagAssignments\r
                        def rebuildCtagAssignmentsList = ""\r
                        if (utils.nodeExists(requeryIdAAIResponse, 'ctag-assignment')) {\r
@@ -538,8 +546,8 @@ class NetworkUtils {
                        return contrailNetworkCreatedUpdate\r
        }\r
 \r
-       \r
-       \r
+\r
+\r
        /**\r
         * This method returns the value for the name paramName.\r
         *   Ex:   <network-params>\r
@@ -594,20 +602,20 @@ class NetworkUtils {
 \r
        /**\r
         * This method returns the networkParams xml string.\r
-        *   Ex: input:  \r
+        *   Ex: input:\r
         *         <network-params>\r
         *            <param name="shared">1</param>\r
         *            <param name="external">0</external>\r
         *         </network-params>\r
-        *         \r
+        *\r
         *   Sample result:\r
         *         <networkParams>\r
      *            <shared>1</shared>\r
      *            <external>0</external>\r
      *         </networkParams>\r
-     *           \r
+     *\r
         */\r
-       \r
+\r
        def buildParams(networkParams) {\r
                def build = ""\r
                        def netParams = new XmlParser().parseText(networkParams)\r
@@ -621,15 +629,15 @@ class NetworkUtils {
                                                build += "<${name}>${value}</${name}>"\r
                                        }\r
                                        build += "</networkParams>"\r
-                               }       \r
-                          \r
+                               }\r
+\r
                        } catch (Exception ex) {\r
                                println ' buildParams error - ' + ex.getMessage()\r
                                build = ""\r
-                       }       \r
+                       }\r
                return build\r
        }\r
-       \r
+\r
        def getVlans(xmlInput) {\r
                def rtn = ""\r
                if (xmlInput!=null) {\r
@@ -751,7 +759,7 @@ class NetworkUtils {
                }\r
                return rtn\r
        }\r
-       \r
+\r
        /**\r
         * similar to network policymethod\r
        * @param xmlInput the XML document\r
@@ -775,7 +783,6 @@ class NetworkUtils {
                                                 } else {\r
                                                     rtn.add(relatedLink.substring(relatedLink.indexOf("/generic-vnf/")+13, relatedLink.length()))\r
                                                 }\r
-\r
                                          }\r
                                   }\r
                                }\r
@@ -783,7 +790,7 @@ class NetworkUtils {
                }\r
                return rtn\r
        }\r
-       \r
+\r
        /**\r
         * similar to network policymethod\r
        * @param xmlInput the XML document\r
@@ -807,7 +814,6 @@ class NetworkUtils {
                                                 } else {\r
                                                     rtn.add(relatedLink.substring(relatedLink.indexOf("/l3-network/")+12, relatedLink.length()))\r
                                                 }\r
-\r
                                          }\r
                                   }\r
                                }\r
@@ -815,7 +821,7 @@ class NetworkUtils {
                }\r
                return rtn\r
        }\r
-       \r
+\r
        def isVfRelationshipExist(xmlInput) {\r
                Boolean rtn = false\r
                if (xmlInput!=null) {\r
@@ -824,7 +830,7 @@ class NetworkUtils {
                        if (relationshipListSize > 0) {\r
                                for (i in 0..relationshipListSize-1) {\r
                                   def relationshipXml = XmlUtil.serialize(relationshipList[i])\r
-                                  if (utils.getNodeText(relationshipXml, 'related-to') == "vf-module") { \r
+                                  if (utils.getNodeText(relationshipXml, 'related-to') == "vf-module") {\r
                                             rtn = true\r
                                   }\r
                                }\r
@@ -856,7 +862,7 @@ class NetworkUtils {
                }\r
                return lcpCloudRegion\r
        }\r
-       \r
+\r
        def getTenantId(xmlInput) {\r
                String tenantId = ""\r
                if (xmlInput!=null) {\r
@@ -879,27 +885,27 @@ class NetworkUtils {
                }\r
                return tenantId\r
        }\r
-       \r
+\r
        def isInstanceValueMatch(linkResource, globalSubscriberId, serviceType) {\r
                Boolean rtn = false\r
                try {\r
                        String globalSubscriberIdLink = linkResource.substring(linkResource.indexOf("/customer/")+10, linkResource.indexOf("/service-subscriptions"))\r
                        String serviceTypeLink = linkResource.substring(linkResource.indexOf("/service-subscription/")+22, linkResource.indexOf("/service-instances"))\r
-                       if (globalSubscriberIdLink == globalSubscriberId) { \r
+                       if (globalSubscriberIdLink == globalSubscriberId) {\r
                                        rtn = true\r
                        } else {\r
                                if (serviceTypeLink == serviceType) {\r
                                        rtn = true\r
                                }\r
                        }\r
-                       \r
+\r
                } catch (Exception ex) {\r
                    println 'Exception - ' + ex.getMessage()\r
                        return false\r
                }\r
         return rtn\r
        }\r
-       \r
+\r
        def getListWithElements(xmlInput, groupName) {\r
                def rtn = ""\r
                if (xmlInput != null) {\r
@@ -953,7 +959,6 @@ class NetworkUtils {
                                                        xmlNetwork += "<"+element+">"+"Active"+"</"+element+">"\r
                                            }\r
                                        }       \r
-\r
                                        if (element=="heat-stack-id") {\r
                                                if (replaceNetworkId != "") {\r
                                                        xmlNetwork += "<"+element+">"+replaceNetworkId+"</"+element+">"\r
@@ -984,7 +989,6 @@ class NetworkUtils {
                                        }\r
                                }       \r
                         }\r
-\r
                }\r
                return xmlNetwork\r
        }\r
@@ -1006,9 +1010,9 @@ class NetworkUtils {
                                   if (orchestrationStatus == "PendingDelete" || orchestrationStatus == "pending-delete") {\r
                                           // skip, do not include in processing, remove!!!\r
                                   } else {\r
-                                     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
+                                     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", "ip-assignment-direction", "host-routes"]\r
                                      rebuildingSubnets += buildSubNetworkElements(subnetXml, createNetworkResponse, subnetList, "subnet")\r
-                                  }\r
+                                  }      \r
                                }\r
                                if (utils.nodeExists(subnetsData, 'relationship')) {\r
                                        rebuildingSubnets = rebuildRelationship(requeryIdAAIResponse)\r
@@ -1037,10 +1041,11 @@ class NetworkUtils {
                           if (orchestrationStatus == "pending-delete" || orchestrationStatus == "PendingDelete") {\r
                                   // skip, do not include in processing, remove!!!\r
                           } else {\r
-                                       def subnetList = ["dhcp-start", "dhcp-end", "network-start-address", "cidr-mask", "dhcp-enabled", "gateway-address", "ip-version", "subnet-id", "subnet-name"]\r
+                                       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"]\r
                                        rebuildingSubnets += buildSubNetworkElements(subnetXml, subnetList, "subnets")\r
                                        //rebuildingSubnets += buildSubNetworkElements(subnetXml, subnetList, "")\r
-                          }                    }\r
+                          }    \r
+                       }\r
                } catch (Exception ex) {\r
                   //\r
                } finally {\r
@@ -1062,7 +1067,7 @@ class NetworkUtils {
                          def xml= new XmlSlurper().parseText(subnetXml)\r
                          var = xml.'**'.find {it.name() == element}\r
                          if (var != null) {\r
-                                if (element=="orchestration-status") {\r
+                                if (element=="orchestration-status") {\r
                                        if(var.toString() == 'pending-create' || var.toString() == 'PendingCreate') {   \r
                                                xmlBuild += "<"+element+">"+"Created"+"</"+element+">"\r
                                        } else { // pending-update or PendingUpdate'\r
@@ -1079,7 +1084,14 @@ class NetworkUtils {
                                             if (element=="neutron-subnet-id") {\r
                                // skip\r
                                                 } else {\r
-                                                   xmlBuild += "<"+element+">"+var.toString()+"</"+element+">"\r
+                                                        if (element=="host-routes") {\r
+                                                                if (subnetXml.contains("host-routes")) {\r
+                                                                        List elementRoute = ["host-route-id", "route-prefix", "next-hop", "next-hop-type", "resource-version"]\r
+                                                                        xmlBuild += buildXMLElements(subnetXml, "host-routes", "host-route", elementRoute)\r
+                                                                }\r
+                                                        } else {         \r
+                                                               xmlBuild += "<"+element+">"+var.toString()+"</"+element+">"\r
+                                                        }        \r
                                                 }\r
                                         }\r
                                 }\r
@@ -1136,7 +1148,8 @@ class NetworkUtils {
                                        xmlBuild += "<gatewayIp>"+var.toString()+"</gatewayIp>"\r
                                }\r
                                if (element == "ip-version") {\r
-                                       xmlBuild += "<ipVersion>"+var.toString()+"</ipVersion>"\r
+                                       String ipVersion = getIpvVersion(var.toString())\r
+                                       xmlBuild += "<ipVersion>"+ipVersion+"</ipVersion>"\r
                                }\r
                                if (element == "subnet-id") {\r
                                        xmlBuild += "<subnetId>"+var.toString()+"</subnetId>"\r
@@ -1144,6 +1157,17 @@ class NetworkUtils {
                                if ((element == "subnet-name") && (var != null)) {\r
                                        xmlBuild += "<subnetName>"+var.toString()+"</subnetName>"\r
                                }\r
+                               if ((element == "ip-assignment-direction") && (var != null)) {\r
+                                       xmlBuild += "<addrFromStart>"+var.toString()+"</addrFromStart>"\r
+                               }\r
+                               if (element == "host-routes") {\r
+                                       def routes = ""\r
+                                       if (subnetXml.contains("host-routes")) {\r
+                                               routes = buildHostRoutes(subnetXml)\r
+                                       }\r
+                                       xmlBuild += routes \r
+                               }       \r
+                               \r
                        }\r
                }\r
                if (parentName != "") {\r
@@ -1152,6 +1176,38 @@ class NetworkUtils {
                return xmlBuild\r
        }\r
 \r
+       // rebuild host-routes\r
+       def buildHostRoutes(subnetXml) {\r
+               List  routeElementList = ["host-route-id", "route-prefix", "next-hop", "next-hop-type", "resource-version"]\r
+               def hostRoutes = buildXMLElements(subnetXml, "host-routes", "host-route", routeElementList)\r
+               def buildHostRoutes = ""\r
+               def var = ""\r
+               if (hostRoutes!=null) {\r
+                       def routesData = new XmlSlurper().parseText(hostRoutes)\r
+                       def routes = routesData.'**'.findAll {it.name() == "host-route"}\r
+                       def routesSize = routes.size()\r
+                       for (i in 0..routesSize-1) {\r
+                          buildHostRoutes += "<hostRoutes>"\r
+                          def route = routes[i]\r
+                          def routeXml = XmlUtil.serialize(route)\r
+                          List  elementList = ["route-prefix", "next-hop"]\r
+                          for (element in elementList) {\r
+                                  def xml= new XmlSlurper().parseText(routeXml)\r
+                                  var = xml.'**'.find {it.name() == element}\r
+                                  if (element == "route-prefix") {\r
+                                          buildHostRoutes += "<prefix>"+var.toString()+"</prefix>"\r
+                                  }\r
+                                  if (element == "next-hop") {\r
+                                          buildHostRoutes += "<nextHop>"+var.toString()+"</nextHop>"\r
+                                  }\r
+                          }\r
+                          buildHostRoutes += "</hostRoutes>"\r
+                       }   \r
+               }               \r
+               return buildHostRoutes          \r
+               \r
+       }\r
+       \r
        // rebuild ctag-assignments\r
        def rebuildCtagAssignments(xmlInput) {\r
                def rebuildingCtagAssignments = ""\r
@@ -1219,7 +1275,7 @@ class NetworkUtils {
                }\r
                return rebuildingSubnets\r
        }\r
-       \r
+\r
        def buildVlans(queryIdResponse) {\r
                def rebuildingSubnets = "<vlans>"\r
                def subnetsData = new XmlSlurper().parseText(queryIdResponse)\r
@@ -1230,7 +1286,7 @@ class NetworkUtils {
                        for (i in 0..subnetsSize-1) {\r
                           def subnet = subnets[i]\r
                           def subnetXml = XmlUtil.serialize(subnet)\r
-                          \r
+\r
                           String vlan = utils.getNodeText1(subnetXml, "segmentation-id")\r
                           if (i>0){\r
                                   rebuildingSubnets += ","\r
@@ -1464,8 +1520,8 @@ class NetworkUtils {
                                return value\r
                        }\r
 \r
-       public boolean isRollbackEnabled (Execution execution, String payloadXml) {\r
-               \r
+       public boolean isRollbackEnabled (DelegateExecution execution, String payloadXml) {\r
+\r
                def rollbackEnabled = false\r
                def rollbackValueSet = false\r
                if (utils.nodeExists(payloadXml, "backout-on-failure")) {\r
@@ -1480,12 +1536,38 @@ class NetworkUtils {
                                rollbackValueSet = true;\r
                        }\r
                }\r
-               \r
+\r
                if (!rollbackValueSet) {\r
                        if (execution.getVariable("URN_mso_rollback") != null) {\r
                            rollbackEnabled = execution.getVariable("URN_mso_rollback").toBoolean()\r
-                       }   \r
+                       }\r
                }\r
                return rollbackEnabled\r
        }\r
+       \r
+       \r
+       /**\r
+        * This method extracts the version for the the given ip-version.\r
+        *\r
+        * @param String ipvVersion - IP protocols version (ex: ipv4 or ipv6 or 4 or 6)\r
+        * @return String version - digit version (ex: 4 or 6)\r
+        */\r
+       \r
+       public String getIpvVersion (String ipvVersion) {\r
+               \r
+               String version = ""\r
+               try {\r
+                       if (ipvVersion.isNumber()) {\r
+                               version = ipvVersion\r
+                       } else {\r
+                               version = ipvVersion.substring(ipvVersion.indexOf("ipv")+3)\r
+                               if (!version.isNumber()) {\r
+                                       version = ipvVersion\r
+                               }\r
+                       }\r
+               } catch (Exception ex) {\r
+                       version = ipvVersion  \r
+               }\r
+               return version\r
+       }\r
 }\r