Containerization feature of SO
[so.git] / bpmn / MSOCommonBPMN / src / main / groovy / org / onap / so / bpmn / common / scripts / VfModuleBase.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.bpmn.common.scripts;
22
23 import java.io.ObjectInputStream.BlockDataInputStream
24
25 import java.io.ObjectInputStream.BlockDataInputStream
26
27 //import groovy.util.Node;
28
29 import javax.xml.parsers.DocumentBuilder
30 import javax.xml.parsers.DocumentBuilderFactory
31
32 import org.apache.commons.lang3.*
33 import org.w3c.dom.Document
34 import org.w3c.dom.Element
35 import org.w3c.dom.Node
36 import org.w3c.dom.NodeList
37 import org.xml.sax.InputSource
38 import org.onap.so.logger.MessageEnum
39 import org.onap.so.logger.MsoLogger
40
41
42
43
44 public abstract class VfModuleBase extends AbstractServiceTaskProcessor {
45         private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VfModuleBase.class);
46
47         
48         protected XmlParser xmlParser = new XmlParser()
49         
50         /**
51          * Get the XmlParser.
52          * 
53          * @return the XmlParser.
54          */
55         protected XmlParser getXmlParser() {
56                 return xmlParser
57         }
58         
59         /**
60          * Find the VF Module with specified ID in the specified Generic VF.  If no such
61          * VF Module is found, null is returned.
62          * 
63          * @param genericVnf The Generic VNF in which to search for the specified VF Moduel.
64          * @param vfModuleId The ID of the VF Module for which to search.
65          * @return a VFModule object for the found VF Module or null if no VF Module is found.
66          */
67         protected VfModule findVfModule(String genericVnf, String vfModuleId) {
68                 
69                 def genericVnfNode = xmlParser.parseText(genericVnf)
70                 def vfModulesNode = utils.getChildNode(genericVnfNode, 'vf-modules')
71                 if (vfModulesNode == null) {
72                         return null
73                 }
74                 def vfModuleList = utils.getIdenticalChildren(vfModulesNode, 'vf-module')
75                 for (vfModuleNode in vfModuleList) {
76                         def vfModuleIdNode = utils.getChildNode(vfModuleNode, 'vf-module-id')
77                         if ((vfModuleIdNode != null) && (vfModuleIdNode.text().equals(vfModuleId))) {
78                                 return new VfModule(vfModuleNode, (vfModuleList.size() == 1))
79                         }
80                 }
81                 return null
82         }
83         
84         /**
85          * Transform all '*_network' parameter specifications from the incoming '*-params' root
86          * element to a corresponding list of 'vnf-networks' specifications (typically used when
87          * invoking the VNF Rest Adpater). Each element in '*-params' whose name attribute ends
88          * with '_network' is used to create an 'vnf-networks' element.
89          * 
90          * @param paramsNode A Node representing a '*-params' element.
91          * @return a String of 'vnf-networks' elements, one for each 'param' element whose name
92          * attribute ends with '_network'.
93          */
94         protected String transformNetworkParamsToVnfNetworks(String paramsRootXml) {
95                 if ((paramsRootXml == null) || (paramsRootXml.isEmpty())) {
96                         return ''
97                 }
98                 def String vnfNetworks = ''
99                 try {
100                         paramsRootXml = utils.removeXmlNamespaces(paramsRootXml)
101                         def paramsNode = xmlParser.parseText(paramsRootXml)
102                         def params = utils.getIdenticalChildren(paramsNode, 'param')
103                         for (param in params) {
104                                 def String attrName = (String) param.attribute('name')
105                                 if (attrName.endsWith('_network')) {
106                                         def networkRole = attrName.substring(0, (attrName.length()-'_network'.length()))
107                                         def networkName = param.text()
108                                         String vnfNetwork = """
109                                                 <vnf-networks>
110                                                         <network-role>${MsoUtils.xmlEscape(networkRole)}</network-role>
111                                                         <network-name>${MsoUtils.xmlEscape(networkName)}</network-name>
112                                                 </vnf-networks>
113                                         """
114                                         vnfNetworks = vnfNetworks + vnfNetwork
115                                 }
116                         }
117                 } catch (Exception e) {
118                         msoLogger.warn(MessageEnum.BPMN_GENERAL_WARNING, 'Exception transforming network params to vnfNetworks', "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, 'Exception is: \n' + e);
119                 }
120                 return vnfNetworks
121         }
122         
123         /**
124          * Transform the parameter specifications from the incoming '*-params' root element to
125          * a corresponding list of 'entry's (typically used when invoking the VNF Rest Adpater).
126          * Each element in '*-params' is used to create an 'entry' element.
127          *
128          * @param paramsNode A Node representing a '*-params' element.
129          * @return a String of 'entry' elements, one for each 'param' element.
130          */
131         protected String transformParamsToEntries(String paramsRootXml) {
132                 if ((paramsRootXml == null) || (paramsRootXml.isEmpty())) {
133                         return ''
134                 }
135                 def String entries = ''
136                 try {
137                         paramsRootXml = utils.removeXmlNamespaces(paramsRootXml)
138                         def paramsNode = xmlParser.parseText(paramsRootXml)
139                         def params = utils.getIdenticalChildren(paramsNode, 'param')
140                         for (param in params) {
141                                 def key = (String) param.attribute('name')
142                                 if (key == null) {
143                                         key = ''
144                                 }
145                                 def value = (String) param.text()
146                                 String entry = """
147                                         <entry>
148                                                 <key>${MsoUtils.xmlEscape(key)}</key>
149                                                 <value>${MsoUtils.xmlEscape(value)}</value>
150                                         </entry>
151                                 """
152                                 entries = entries + entry
153                         }
154                 } catch (Exception e) {
155                         msoLogger.warn(MessageEnum.BPMN_GENERAL_WARNING, 'Exception transforming params to entries', "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, 'Exception transforming params to entries', e);
156                 }
157                 return entries
158         }
159         
160         /**
161          * Transform the parameter specifications from the incoming '*-params' root element to
162          * a corresponding list of 'entry's (typically used when invoking the VNF Rest Adpater).
163          * Each element in '*-params' is used to create an 'entry' element.
164          *
165          * @param paramsNode A Node representing a '*-params' element.
166          * @return a String of 'entry' elements, one for each 'param' element.
167          */
168         protected String transformVolumeParamsToEntries(String paramsRootXml) {
169                 if ((paramsRootXml == null) || (paramsRootXml.isEmpty())) {
170                         return ''
171                 }
172                 def String entries = ''
173                 try {
174                         paramsRootXml = utils.removeXmlNamespaces(paramsRootXml)
175                         def paramsNode = xmlParser.parseText(paramsRootXml)
176                         def params = utils.getIdenticalChildren(paramsNode, 'param')
177                         for (param in params) {
178                                 def key = (String) param.attribute('name')
179                                 if (key == null) {
180                                         key = ''
181                                 }
182                                 if ( !(key in ['vnf_id', 'vnf_name', 'vf_module_id', 'vf_module_name'])) {
183                                         def value = (String) param.text()
184                                         String entry = """
185                                                 <entry>
186                                                         <key>${MsoUtils.xmlEscape(key)}</key>
187                                                         <value>${MsoUtils.xmlEscape(value)}</value>
188                                                 </entry>
189                                         """
190                                         entries = entries + entry
191                                 }
192                         }
193                 } catch (Exception e) {
194                         msoLogger.warn(MessageEnum.BPMN_GENERAL_WARNING, 'Exception transforming params to entries', "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, 'Exception transforming params to entries', e);
195                 }
196                 return entries
197         }
198         
199         /**
200          * Extract the Tenant Id from the Volume Group information returned by AAI.
201          * 
202          * @param volumeGroupXml Volume Group XML returned by AAI.
203          * @return the Tenant Id extracted from the Volume Group information. 'null' is returned if
204          * the Tenant Id is missing or could not otherwise be extracted.
205          */
206         protected String getTenantIdFromVolumeGroup(String volumeGroupXml) {
207                 def groovy.util.Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)
208                 def groovy.util.Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')
209                 if (relationshipList != null) {
210                         def groovy.util.NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')
211                         for (groovy.util.Node relationship in relationships) {
212                                 def groovy.util.Node relatedTo = utils.getChildNode(relationship, 'related-to')
213                                 if ((relatedTo != null) && (relatedTo.text().equals('tenant'))) {
214                                         def groovy.util.NodeList relationshipDataList = utils.getIdenticalChildren(relationship, 'relationship-data')
215                                         for (groovy.util.Node relationshipData in relationshipDataList) {
216                                                 def groovy.util.Node relationshipKey = utils.getChildNode(relationshipData, 'relationship-key')
217                                                 if ((relationshipKey != null) && (relationshipKey.text().equals('tenant.tenant-id'))) {
218                                                         def groovy.util.Node relationshipValue = utils.getChildNode(relationshipData, 'relationship-value')
219                                                         if (relationshipValue != null) {
220                                                                 return relationshipValue.text()
221                                                         }
222                                                 }
223                                         }
224                                 }
225                         }
226                 }
227                 return null
228         }
229         
230         
231         /*
232          * Parses VNF parameters passed in on the incoming requests and SDNC parameters returned from SDNC get response
233          * and puts them into the format expected by VNF adapter.
234          * @param vnfParamsMap -  map of VNF parameters passed in the request body
235          * @param sdncGetResponse - response string from SDNC GET topology request
236          * @param vnfId
237          * @param vnfName
238          * @param vfModuleId
239          * @param vfModuleName
240          * @param vfModuleIndex - can be null
241          * @return a String of key/value entries for vfModuleParams
242          */
243           
244          
245          protected String buildVfModuleParams(Map<String, String> vnfParamsMap, String sdncGetResponse, String vnfId, String vnfName,
246                 String vfModuleId, String vfModuleName, String vfModuleIndex, String environmentContext, String workloadContext) {
247                 
248                 //Get SDNC Response Data
249                 
250                 String data = utils.getNodeXml(sdncGetResponse, "response-data")
251
252                 String serviceData = utils.getNodeXml(data, "service-data")
253                 serviceData = utils.removeXmlPreamble(serviceData)
254                 serviceData = utils.removeXmlNamespaces(serviceData)
255                 String vnfRequestInfo = utils.getNodeXml(serviceData, "vnf-request-information")
256                 String oldVnfId = utils.getNodeXml(vnfRequestInfo, "vnf-id")
257                 oldVnfId = utils.removeXmlPreamble(oldVnfId)
258                 oldVnfId = utils.removeXmlNamespaces(oldVnfId)
259                 serviceData = serviceData.replace(oldVnfId, "")
260                 def vnfId1 = utils.getNodeText(serviceData, "vnf-id")
261                 
262                 Map<String, String> paramsMap = new HashMap<String, String>()
263                 
264                 if (vfModuleIndex != null) {
265                         paramsMap.put("vf_module_index", "${vfModuleIndex}")
266                 }
267
268                 // Add-on data
269                 paramsMap.put("vnf_id", "${vnfId}")
270                 paramsMap.put("vnf_name", "${vnfName}")
271                 paramsMap.put("vf_module_id", "${vfModuleId}")
272                 paramsMap.put("vf_module_name", "${vfModuleName}")
273                 paramsMap.put("environment_context", "${environmentContext}")
274                 paramsMap.put("workload_context", "${workloadContext}")
275                 
276                 InputSource source = new InputSource(new StringReader(data));
277                 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
278                 docFactory.setNamespaceAware(true)
279                 DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
280                 Document responseXml = docBuilder.parse(source)
281
282
283                 // Availability Zones Data
284                 
285                 NodeList aZonesList = responseXml.getElementsByTagNameNS("*", "availability-zones")
286                 String aZonePosition = "0"
287                 for (int z = 0; z < aZonesList.getLength(); z++) {
288                         Node node = aZonesList.item(z)
289                         if (node.getNodeType() == Node.ELEMENT_NODE) {
290                                 Element eElement = (Element) node
291                                 String aZoneValue = utils.getElementText(eElement, "availability-zone")
292                                 aZonePosition = z.toString()
293                                 paramsMap.put("availability_zone_${aZonePosition}", "${aZoneValue}")
294                         }
295                 }
296
297                 // Map of network-roles and network-tags from vm-networks
298                 
299                 NodeList vmNetworksListGlobal = responseXml.getElementsByTagNameNS("*", "vm-networks")
300                 Map<String, String> networkRoleMap = new HashMap<String, String>()
301                 for(int n = 0; n < vmNetworksListGlobal.getLength(); n++){
302                         Node nodeNetworkKey = vmNetworksListGlobal.item(n)
303                         if (nodeNetworkKey.getNodeType() == Node.ELEMENT_NODE) {
304                                 Element eElementNetworkKey = (Element) nodeNetworkKey
305                                 String networkRole = utils.getElementText(eElementNetworkKey, "network-role")
306                                 String networkRoleValue = utils.getElementText(eElementNetworkKey, "network-role-tag")
307                                 if (networkRoleValue.isEmpty()) {
308                                         networkRoleValue = networkRole
309                                 }
310                                 networkRoleMap.put(networkRole, networkRoleValue)                               
311                         }
312                 }               
313
314                 // VNF Networks Data
315                 
316                 StringBuilder sbNet = new StringBuilder()
317                 
318                 NodeList vnfNetworkList = responseXml.getElementsByTagNameNS("*", "vnf-networks")
319                 for (int x = 0; x < vnfNetworkList.getLength(); x++) {
320                         Node node = vnfNetworkList.item(x)
321                         if (node.getNodeType() == Node.ELEMENT_NODE) {
322                                 Element eElement = (Element) node
323                                 String vnfNetworkKey = utils.getElementText(eElement, "network-role-tag")
324                                 String networkRole = utils.getElementText(eElement, "network-role")
325                                 if (vnfNetworkKey.isEmpty()) {
326                                         vnfNetworkKey = networkRoleMap.get(networkRole)
327                                         if (vnfNetworkKey == null || vnfNetworkKey.isEmpty()) {
328                                                 vnfNetworkKey = networkRole
329                                         }                                       
330                                 }                               
331                                 String vnfNetworkNeutronIdValue = utils.getElementText(eElement, "neutron-id")
332                                 String vnfNetworkNetNameValue = utils.getElementText(eElement, "network-name")
333                                 String vnfNetworkSubNetIdValue = utils.getElementText(eElement, "subnet-id")
334                                 String vnfNetworkV6SubNetIdValue = utils.getElementText(eElement, "ipv6-subnet-id")
335                                 String vnfNetworkNetFqdnValue = utils.getElementText(eElement, "contrail-network-fqdn")
336                                 paramsMap.put("${vnfNetworkKey}_net_id", "${vnfNetworkNeutronIdValue}")
337                                 paramsMap.put("${vnfNetworkKey}_net_name", "${vnfNetworkNetNameValue}")
338                                 paramsMap.put("${vnfNetworkKey}_subnet_id", "${vnfNetworkSubNetIdValue}")
339                                 paramsMap.put("${vnfNetworkKey}_v6_subnet_id", "${vnfNetworkV6SubNetIdValue}")
340                                 paramsMap.put("${vnfNetworkKey}_net_fqdn", "${vnfNetworkNetFqdnValue}")
341                                 
342                                 NodeList sriovVlanFilterList = eElement.getElementsByTagNameNS("*","sriov-vlan-filter-list")
343                                 StringBuffer sriovFilterBuf = new StringBuffer()
344                                 String values = ""
345                                 for(int i = 0; i < sriovVlanFilterList.getLength(); i++){
346                                         Node node1 = sriovVlanFilterList.item(i)
347                                         if (node1.getNodeType() == Node.ELEMENT_NODE) {
348                                                 Element eElement1 = (Element) node1
349                                                 String value = utils.getElementText(eElement1, "sriov-vlan-filter")
350                                                 if (i != sriovVlanFilterList.getLength() - 1) {
351                                                         values = sriovFilterBuf.append(value + ",")
352                                                 }
353                                                 else {
354                                                         values = sriovFilterBuf.append(value);
355                                                 }
356                                         }
357                                 }
358                                 if (!values.isEmpty()) {
359                                                 paramsMap.put("${vnfNetworkKey}_ATT_VF_VLAN_FILTER", "${values}")
360                                         }
361                                 }
362                 }
363
364                 // VNF-VMS Data
365                 
366                 def key
367                 def value
368                 def networkKey
369                 def networkValue
370                 def floatingIPKey
371                 def floatingIPKeyValue
372                 def floatingIPV6Key
373                 def floatingIPV6KeyValue
374                 StringBuilder sb = new StringBuilder()
375
376                 NodeList vmsList = responseXml.getElementsByTagNameNS("*","vnf-vms")
377                 for (int x = 0; x < vmsList.getLength(); x++) {
378                         Node node = vmsList.item(x)
379                         if (node.getNodeType() == Node.ELEMENT_NODE) {
380                                 Element eElement = (Element) node
381                                 key = utils.getElementText(eElement, "vm-type")
382                                 String values
383                                 String position = "0"
384                                 StringBuilder sb1 = new StringBuilder()
385                                 NodeList valueList = eElement.getElementsByTagNameNS("*","vm-names")
386                                 NodeList vmNetworksList = eElement.getElementsByTagNameNS("*","vm-networks")
387                                 for(int i = 0; i < valueList.getLength(); i++){
388                                         Node node1 = valueList.item(i)
389                                         if (node1.getNodeType() == Node.ELEMENT_NODE) {
390                                                 Element eElement1 = (Element) node1
391                                                 value = utils.getElementText(eElement1, "vm-name")
392                                                 if (i != valueList.getLength() - 1) {
393                                                         values = sb1.append(value + ",")
394                                                 }
395                                                 else {
396                                                         values = sb1.append(value);
397                                                 }
398                                                 position = i.toString()
399                                                 paramsMap.put("${key}_name_${position}", "${value}")
400                                         }
401                                 }
402                                 for(int n = 0; n < vmNetworksList.getLength(); n++){
403                                         String floatingIpKeyValueStr = ""
404                                         String floatingIpV6KeyValueStr = ""
405                                         Node nodeNetworkKey = vmNetworksList.item(n)
406                                         if (nodeNetworkKey.getNodeType() == Node.ELEMENT_NODE) {
407                                                 Element eElementNetworkKey = (Element) nodeNetworkKey
408                                                 String ipAddressValues
409                                                 String ipV6AddressValues
410                                                 String networkPosition = "0"
411                                                 StringBuilder sb2 = new StringBuilder()
412                                                 StringBuilder sb3 = new StringBuilder()
413                                                 StringBuilder sb4 = new StringBuilder()
414                                                 networkKey = utils.getElementText(eElementNetworkKey, "network-role-tag")
415                                                 if (networkKey.isEmpty()) {
416                                                         networkKey = utils.getElementText(eElementNetworkKey, "network-role")
417                                                 }
418                                                 floatingIPKey = key + '_' + networkKey + '_floating_ip'
419                                                 floatingIPKeyValue = utils.getElementText(eElementNetworkKey, "floating-ip")
420                                                 if(!floatingIPKeyValue.isEmpty()){
421                                                         paramsMap.put("$floatingIPKey", "$floatingIPKeyValue")
422                                                 }
423                                                 floatingIPV6Key = key + '_' + networkKey + '_floating_v6_ip'
424                                                 floatingIPV6KeyValue = utils.getElementText(eElementNetworkKey, "floating-ip-v6")
425                                                 if(!floatingIPV6KeyValue.isEmpty()){
426                                                         paramsMap.put("$floatingIPV6Key", "$floatingIPV6KeyValue")
427                                                 }
428                                                 NodeList networkIpsList = eElementNetworkKey.getElementsByTagNameNS("*","network-ips")
429                                                 for(int a = 0; a < networkIpsList.getLength(); a++){
430                                                         Node ipAddress = networkIpsList.item(a)
431                                                         if (ipAddress.getNodeType() == Node.ELEMENT_NODE) {
432                                                                 Element eElementIpAddress = (Element) ipAddress
433                                                                 String ipAddressValue = utils.getElementText(eElementIpAddress, "ip-address")
434                                                                 if (a != networkIpsList.getLength() - 1) {
435                                                                         ipAddressValues = sb2.append(ipAddressValue + ",")
436                                                                 }
437                                                                 else {
438                                                                         ipAddressValues = sb2.append(ipAddressValue);
439                                                                 }
440                                                                 networkPosition = a.toString()
441                                                                 paramsMap.put("${key}_${networkKey}_ip_${networkPosition}", "${ipAddressValue}")
442                                                         }
443                                                 }
444                                                 
445                                                 paramsMap.put("${key}_${networkKey}_ips", "${ipAddressValues}")
446                                                 
447                                                 NodeList interfaceRoutePrefixesList = eElementNetworkKey.getElementsByTagNameNS("*","interface-route-prefixes")
448                                                 String interfaceRoutePrefixValues = sb3.append("[")
449                                                 
450                                                 for(int a = 0; a < interfaceRoutePrefixesList.getLength(); a++){
451                                                         Node interfaceRoutePrefix = interfaceRoutePrefixesList.item(a)
452                                                         if (interfaceRoutePrefix.getNodeType() == Node.ELEMENT_NODE) {
453                                                                 Element eElementInterfaceRoutePrefix = (Element) interfaceRoutePrefix
454                                                                 String interfaceRoutePrefixValue = utils.getElementText(eElementInterfaceRoutePrefix, "interface-route-prefix-cidr")
455                                                                 if (interfaceRoutePrefixValue == null || interfaceRoutePrefixValue.isEmpty()) {
456                                                                         interfaceRoutePrefixValue = utils.getElementText(eElementInterfaceRoutePrefix, "interface-route-prefix")
457                                                                 }
458                                                                 if (a != interfaceRoutePrefixesList.getLength() - 1) {
459                                                                         interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}" + ",")
460                                                                 }
461                                                                 else {
462                                                                         interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}")
463                                                                 }
464                                                         }
465                                                 }
466                                                 interfaceRoutePrefixValues = sb3.append("]")
467                                                 if (interfaceRoutePrefixesList.getLength() > 0) {
468                                                         paramsMap.put("${key}_${networkKey}_route_prefixes", "${interfaceRoutePrefixValues}")
469                                                 }
470                                                 
471                                                 NodeList networkIpsV6List = eElementNetworkKey.getElementsByTagNameNS("*","network-ips-v6")
472                                                 for(int a = 0; a < networkIpsV6List.getLength(); a++){
473                                                         Node ipV6Address = networkIpsV6List.item(a)
474                                                         if (ipV6Address.getNodeType() == Node.ELEMENT_NODE) {
475                                                                 Element eElementIpV6Address = (Element) ipV6Address
476                                                                 String ipV6AddressValue = utils.getElementText(eElementIpV6Address, "ip-address-ipv6")
477                                                                 if (a != networkIpsV6List.getLength() - 1) {
478                                                                         ipV6AddressValues = sb4.append(ipV6AddressValue + ",")
479                                                                 }
480                                                                 else {
481                                                                         ipV6AddressValues = sb4.append(ipV6AddressValue);
482                                                                 }
483                                                                 networkPosition = a.toString()
484                                                                 paramsMap.put("${key}_${networkKey}_v6_ip_${networkPosition}", "${ipV6AddressValue}")
485                                                         }
486                                                 }
487                                                 paramsMap.put("${key}_${networkKey}_v6_ips", "${ipV6AddressValues}")
488                                         }
489                                 }
490                                 paramsMap.put("${key}_names", "${values}")
491                         }
492                 }
493         //SDNC Response Params
494                 String sdncResponseParams = ""
495                 List<String> sdncResponseParamsToSkip = ["vnf_id", "vf_module_id", "vnf_name", "vf_module_name"]
496                 String vnfParamsChildNodes = utils.getChildNodes(data, "vnf-parameters")
497                 if(vnfParamsChildNodes == null || vnfParamsChildNodes.length() < 1){
498                         // No SDNC params
499                 }else{
500                         NodeList paramsList = responseXml.getElementsByTagNameNS("*", "vnf-parameters")
501                         for (int z = 0; z < paramsList.getLength(); z++) {
502                                 Node node = paramsList.item(z)
503                                 Element eElement = (Element) node
504                                 String vnfParameterName = utils.getElementText(eElement, "vnf-parameter-name")
505                                 if (!sdncResponseParamsToSkip.contains(vnfParameterName)) {
506                                         String vnfParameterValue = utils.getElementText(eElement, "vnf-parameter-value")
507                                         paramsMap.put("${vnfParameterName}", "${vnfParameterValue}")
508                                 }
509                         }
510                 }
511                 
512                 // Parameters received from the request should overwrite any parameters received from SDNC
513                 if (vnfParamsMap != null) {
514                         for (Map.Entry<String, String> entry : vnfParamsMap.entrySet()) {
515                                 String vnfKey = entry.getKey()
516                                 String vnfValue = entry.getValue()
517                                 paramsMap.put("$vnfKey", "$vnfValue")
518                         }
519                 }
520                 
521                 StringBuilder sbParams = new StringBuilder()
522                 def vfModuleParams = ""
523                 for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
524                         String paramsXml
525                         String paramName = entry.getKey()
526                         String paramValue = entry.getValue()
527                         paramsXml =
528                                         """<entry>
529                                                         <key>${MsoUtils.xmlEscape(paramName)}</key>
530                                                         <value>${MsoUtils.xmlEscape(paramValue)}</value>
531                                                 </entry>
532                                                 """
533         
534                         vfModuleParams = sbParams.append(paramsXml)
535                 }
536                 
537                 return vfModuleParams
538         
539         }
540         
541                         
542                         /*
543                          * Parses VNF parameters passed in on the incoming requests and SDNC parameters returned from SDNC get response
544                          * for both VNF and VF Module
545                          * and puts them into the format expected by VNF adapter.
546                          * @param vnfParamsMap -  map of VNF parameters passed in the request body
547                          * @param vnfSdncGetResponse - response string from SDNC GET VNF topology request
548                          * @param vfmoduleSdncGetResponse - response string from SDNC GET VF Module topology request
549                          * @param vnfId
550                          * @param vnfName
551                          * @param vfModuleId
552                          * @param vfModuleName
553                          * @param vfModuleIndex - can be null
554                          * @return a String of key/value entries for vfModuleParams
555                          */                       
556                          
557                          protected String buildVfModuleParamsFromCombinedTopologies(Map<String, String> vnfParamsMap, String vnfSdncGetResponse, String vfmoduleSdncGetResponse, String vnfId, String vnfName,
558                                         String vfModuleId, String vfModuleName, String vfModuleIndex, String environmentContext, String workloadContext) {
559                                         
560                                         // Set up initial parameters
561                                         
562                                         Map<String, String> paramsMap = new HashMap<String, String>()
563                                         
564                                         if (vfModuleIndex != null) {
565                                                 paramsMap.put("vf_module_index", "${vfModuleIndex}")
566                                         }
567                 
568                                         // Add-on data
569                                         paramsMap.put("vnf_id", "${vnfId}")
570                                         paramsMap.put("vnf_name", "${vnfName}")
571                                         paramsMap.put("vf_module_id", "${vfModuleId}")
572                                         paramsMap.put("vf_module_name", "${vfModuleName}")
573                                         paramsMap.put("environment_context","${environmentContext}")            
574                                         paramsMap.put("workload_context", "${workloadContext}")                 
575                                         
576                                         //Get SDNC Response Data for VNF
577                                         
578                                         String vnfData = utils.getNodeXml(vnfSdncGetResponse, "response-data")
579                 
580                                         String vnfTopology = utils.getNodeXml(vnfData, "vnf-topology")
581                                         vnfTopology = utils.removeXmlPreamble(vnfTopology)
582                                         vnfTopology = utils.removeXmlNamespaces(vnfTopology)
583                                                                                 
584                                         InputSource sourceVnf = new InputSource(new StringReader(vnfData));
585                                         DocumentBuilderFactory docFactoryVnf = DocumentBuilderFactory.newInstance();
586                                         docFactoryVnf.setNamespaceAware(true)
587                                         DocumentBuilder docBuilderVnf = docFactoryVnf.newDocumentBuilder()
588                                         Document responseXmlVnf = docBuilderVnf.parse(sourceVnf)
589                                 
590                                         // Availability Zones Data
591                                         
592                                         NodeList aZonesList = responseXmlVnf.getElementsByTagNameNS("*", "availability-zones")
593                                         String aZonePosition = "0"
594                                         for (int z = 0; z < aZonesList.getLength(); z++) {
595                                                 Node node = aZonesList.item(z)
596                                                 if (node.getNodeType() == Node.ELEMENT_NODE) {
597                                                         Element eElement = (Element) node
598                                                         String aZoneValue = utils.getElementText(eElement, "availability-zone")
599                                                         aZonePosition = z.toString()
600                                                         paramsMap.put("availability_zone_${aZonePosition}", "${aZoneValue}")
601                                                 }
602                                         }
603                 
604                                         //Get SDNC Response Data for VF Module
605                                         
606                                         String vfModuleData = utils.getNodeXml(vfmoduleSdncGetResponse, "response-data")
607                 
608                                         String vfModuleTopology = utils.getNodeXml(vfModuleData, "vf-module-topology")
609                                         vfModuleTopology = utils.removeXmlPreamble(vfModuleTopology)
610                                         vfModuleTopology = utils.removeXmlNamespaces(vfModuleTopology)
611                                         String vfModuleTopologyIdentifier = utils.getNodeXml(vfModuleTopology, "vf-module-topology-identifier")
612                                         
613                                         InputSource sourceVfModule = new InputSource(new StringReader(vfModuleData));
614                                         DocumentBuilderFactory docFactoryVfModule = DocumentBuilderFactory.newInstance();
615                                         docFactoryVfModule.setNamespaceAware(true)
616                                         DocumentBuilder docBuilderVfModule = docFactoryVfModule.newDocumentBuilder()
617                                         Document responseXmlVfModule = docBuilderVfModule.parse(sourceVfModule)
618                                         
619                                         // Map of network-roles and network-tags from vm-networks
620                                         
621                                         NodeList vmNetworksListGlobal = responseXmlVfModule.getElementsByTagNameNS("*", "vm-networks")
622                                         Map<String, String> networkRoleMap = new HashMap<String, String>()
623                                         for(int n = 0; n < vmNetworksListGlobal.getLength(); n++){
624                                                 Node nodeNetworkKey = vmNetworksListGlobal.item(n)
625                                                 if (nodeNetworkKey.getNodeType() == Node.ELEMENT_NODE) {
626                                                         Element eElementNetworkKey = (Element) nodeNetworkKey
627                                                         String networkRole = utils.getElementText(eElementNetworkKey, "network-role")
628                                                         String networkRoleValue = utils.getElementText(eElementNetworkKey, "network-role-tag")
629                                                         if (networkRoleValue.isEmpty()) {
630                                                                 networkRoleValue = networkRole
631                                                         }
632                                                         networkRoleMap.put(networkRole, networkRoleValue)
633                                                 }
634                                         }                       
635                 
636                                         // VNF Networks Data
637                                         
638                                         StringBuilder sbNet = new StringBuilder()
639                                         
640                                         NodeList vnfNetworkList = responseXmlVnf.getElementsByTagNameNS("*", "vnf-networks")
641                                         for (int x = 0; x < vnfNetworkList.getLength(); x++) {
642                                                 Node node = vnfNetworkList.item(x)
643                                                 if (node.getNodeType() == Node.ELEMENT_NODE) {
644                                                         Element eElement = (Element) node
645                                                         String vnfNetworkKey = utils.getElementText(eElement, "network-role-tag")
646                                                         String networkRole = utils.getElementText(eElement, "network-role")
647                                                         if (vnfNetworkKey.isEmpty()) {
648                                                                 vnfNetworkKey = networkRoleMap.get(networkRole)
649                                                                 if (vnfNetworkKey == null || vnfNetworkKey.isEmpty()) {
650                                                                         vnfNetworkKey = networkRole
651                                                                 }                                       
652                                                         }       
653                                                         String vnfNetworkNeutronIdValue = utils.getElementText(eElement, "neutron-id")
654                                                         String vnfNetworkNetNameValue = utils.getElementText(eElement, "network-name")
655                                                         String vnfNetworkSubNetIdValue = utils.getElementText(eElement, "subnet-id")
656                                                         String vnfNetworkV6SubNetIdValue = utils.getElementText(eElement, "ipv6-subnet-id")
657                                                         String vnfNetworkNetFqdnValue = utils.getElementText(eElement, "contrail-network-fqdn")
658                                                         paramsMap.put("${vnfNetworkKey}_net_id", "${vnfNetworkNeutronIdValue}")
659                                                         paramsMap.put("${vnfNetworkKey}_net_name", "${vnfNetworkNetNameValue}")
660                                                         paramsMap.put("${vnfNetworkKey}_subnet_id", "${vnfNetworkSubNetIdValue}")
661                                                         paramsMap.put("${vnfNetworkKey}_v6_subnet_id", "${vnfNetworkV6SubNetIdValue}")
662                                                         paramsMap.put("${vnfNetworkKey}_net_fqdn", "${vnfNetworkNetFqdnValue}")
663                                                         
664                                                         NodeList sriovVlanFilterList = eElement.getElementsByTagNameNS("*","sriov-vlan-filter-list")
665                                                         StringBuffer sriovFilterBuf = new StringBuffer()
666                                                         String values = ""
667                                                         for(int i = 0; i < sriovVlanFilterList.getLength(); i++){
668                                                                 Node node1 = sriovVlanFilterList.item(i)
669                                                                 if (node1.getNodeType() == Node.ELEMENT_NODE) {
670                                                                         Element eElement1 = (Element) node1
671                                                                         String value = utils.getElementText(eElement1, "sriov-vlan-filter")
672                                                                         if (i != sriovVlanFilterList.getLength() - 1) {
673                                                                                 values = sriovFilterBuf.append(value + ",")
674                                                                         }
675                                                                         else {
676                                                                                 values = sriovFilterBuf.append(value);
677                                                                         }
678                                                                 }
679                                                         }
680                                                         if (!values.isEmpty()) {
681                                                                         paramsMap.put("${vnfNetworkKey}_ATT_VF_VLAN_FILTER", "${values}")
682                                                                 }
683                                                         }
684                                         }
685                                         
686                 
687                                 
688                                         // VMS Data
689                                         
690                                         def key
691                                         def value
692                                         def networkKey
693                                         def networkValue
694                                         def floatingIPKey
695                                         def floatingIPKeyValue
696                                         def floatingIPV6Key
697                                         def floatingIPV6KeyValue
698                                         StringBuilder sb = new StringBuilder()
699                 
700                                         NodeList vmsList = responseXmlVfModule.getElementsByTagNameNS("*","vm")
701                                         for (int x = 0; x < vmsList.getLength(); x++) {
702                                                 Node node = vmsList.item(x)
703                                                 if (node.getNodeType() == Node.ELEMENT_NODE) {
704                                                         Element eElement = (Element) node
705                                                         key = utils.getElementText(eElement, "vm-type")
706                                                         String values
707                                                         String position = "0"
708                                                         StringBuilder sb1 = new StringBuilder()
709                                                         NodeList valueList = eElement.getElementsByTagNameNS("*","vm-names")
710                                                         NodeList vmNetworksList = eElement.getElementsByTagNameNS("*","vm-networks")
711                                                         for(int i = 0; i < valueList.getLength(); i++){
712                                                                 Node node1 = valueList.item(i)
713                                                                 if (node1.getNodeType() == Node.ELEMENT_NODE) {
714                                                                         Element eElement1 = (Element) node1
715                                                                         value = utils.getElementText(eElement1, "vm-name")
716                                                                         if (i != valueList.getLength() - 1) {
717                                                                                 values = sb1.append(value + ",")
718                                                                         }
719                                                                         else {
720                                                                                 values = sb1.append(value);
721                                                                         }
722                                                                         position = i.toString()
723                                                                         paramsMap.put("${key}_name_${position}", "${value}")
724                                                                 }
725                                                         }
726                                                         for(int n = 0; n < vmNetworksList.getLength(); n++){
727                                                                 String floatingIpKeyValueStr = ""
728                                                                 String floatingIpV6KeyValueStr = ""
729                                                                 Node nodeNetworkKey = vmNetworksList.item(n)
730                                                                 if (nodeNetworkKey.getNodeType() == Node.ELEMENT_NODE) {
731                                                                         Element eElementNetworkKey = (Element) nodeNetworkKey
732                                                                         String ipAddressValues
733                                                                         String ipV6AddressValues
734                                                                         String networkPosition = "0"
735                                                                         StringBuilder sb2 = new StringBuilder()
736                                                                         StringBuilder sb3 = new StringBuilder()
737                                                                         StringBuilder sb4 = new StringBuilder()
738                                                                         networkKey = utils.getElementText(eElementNetworkKey, "network-role-tag")
739                                                                         if (networkKey.isEmpty()) {
740                                                                                 networkKey = utils.getElementText(eElementNetworkKey, "network-role")
741                                                                         }
742                                                                         floatingIPKey = key + '_' + networkKey + '_floating_ip'
743                                                                         floatingIPKeyValue = utils.getElementText(eElementNetworkKey, "floating-ip")
744                                                                         if(!floatingIPKeyValue.isEmpty()){
745                                                                                 paramsMap.put("$floatingIPKey", "$floatingIPKeyValue")
746                                                                         }
747                                                                         floatingIPV6Key = key + '_' + networkKey + '_floating_v6_ip'
748                                                                         floatingIPV6KeyValue = utils.getElementText(eElementNetworkKey, "floating-ip-v6")
749                                                                         if(!floatingIPV6KeyValue.isEmpty()){
750                                                                                 paramsMap.put("$floatingIPV6Key", "$floatingIPV6KeyValue")
751                                                                         }
752                                                                         NodeList networkIpsList = eElementNetworkKey.getElementsByTagNameNS("*","network-ips")
753                                                                         for(int a = 0; a < networkIpsList.getLength(); a++){
754                                                                                 Node ipAddress = networkIpsList.item(a)
755                                                                                 if (ipAddress.getNodeType() == Node.ELEMENT_NODE) {
756                                                                                         Element eElementIpAddress = (Element) ipAddress
757                                                                                         String ipAddressValue = utils.getElementText(eElementIpAddress, "ip-address")
758                                                                                         if (a != networkIpsList.getLength() - 1) {
759                                                                                                 ipAddressValues = sb2.append(ipAddressValue + ",")
760                                                                                         }
761                                                                                         else {
762                                                                                                 ipAddressValues = sb2.append(ipAddressValue);
763                                                                                         }
764                                                                                         networkPosition = a.toString()
765                                                                                         paramsMap.put("${key}_${networkKey}_ip_${networkPosition}", "${ipAddressValue}")
766                                                                                 }
767                                                                         }
768                                                                         
769                                                                         paramsMap.put("${key}_${networkKey}_ips", "${ipAddressValues}")
770                                                                         
771                                                                         NodeList interfaceRoutePrefixesList = eElementNetworkKey.getElementsByTagNameNS("*","interface-route-prefixes")
772                                                                         String interfaceRoutePrefixValues = sb3.append("[")
773                                                                         
774                                                                         for(int a = 0; a < interfaceRoutePrefixesList.getLength(); a++){
775                                                                                 Node interfaceRoutePrefix = interfaceRoutePrefixesList.item(a)
776                                                                                 if (interfaceRoutePrefix.getNodeType() == Node.ELEMENT_NODE) {
777                                                                                         Element eElementInterfaceRoutePrefix = (Element) interfaceRoutePrefix
778                                                                                         String interfaceRoutePrefixValue = utils.getElementText(eElementInterfaceRoutePrefix, "interface-route-prefix-cidr")
779                                                                                         if (interfaceRoutePrefixValue == null || interfaceRoutePrefixValue.isEmpty()) {
780                                                                                                 interfaceRoutePrefixValue = utils.getElementText(eElementInterfaceRoutePrefix, "interface-route-prefix")
781                                                                                         }
782                                                                                         if (a != interfaceRoutePrefixesList.getLength() - 1) {
783                                                                                                 interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}" + ",")
784                                                                                         }
785                                                                                         else {
786                                                                                                 interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}")
787                                                                                         }
788                                                                                 }
789                                                                         }
790                                                                         interfaceRoutePrefixValues = sb3.append("]")
791                                                                         if (interfaceRoutePrefixesList.getLength() > 0) {
792                                                                                 paramsMap.put("${key}_${networkKey}_route_prefixes", "${interfaceRoutePrefixValues}")
793                                                                         }
794                                                                         
795                                                                         NodeList networkIpsV6List = eElementNetworkKey.getElementsByTagNameNS("*","network-ips-v6")
796                                                                         for(int a = 0; a < networkIpsV6List.getLength(); a++){
797                                                                                 Node ipV6Address = networkIpsV6List.item(a)
798                                                                                 if (ipV6Address.getNodeType() == Node.ELEMENT_NODE) {
799                                                                                         Element eElementIpV6Address = (Element) ipV6Address
800                                                                                         String ipV6AddressValue = utils.getElementText(eElementIpV6Address, "ip-address-ipv6")
801                                                                                         if (a != networkIpsV6List.getLength() - 1) {
802                                                                                                 ipV6AddressValues = sb4.append(ipV6AddressValue + ",")
803                                                                                         }
804                                                                                         else {
805                                                                                                 ipV6AddressValues = sb4.append(ipV6AddressValue);
806                                                                                         }
807                                                                                         networkPosition = a.toString()
808                                                                                         paramsMap.put("${key}_${networkKey}_v6_ip_${networkPosition}", "${ipV6AddressValue}")
809                                                                                 }
810                                                                         }
811                                                                         paramsMap.put("${key}_${networkKey}_v6_ips", "${ipV6AddressValues}")
812                                                                 }
813                                                         }
814                                                         paramsMap.put("${key}_names", "${values}")
815                                                 }
816                                         }
817                                 //SDNC Response Params
818                                         List<String> sdncResponseParamsToSkip = ["vnf_id", "vf_module_id", "vnf_name", "vf_module_name"]
819                                         
820                                         String vnfParamsChildNodes = utils.getChildNodes(vnfData, "param")
821                                         if(vnfParamsChildNodes == null || vnfParamsChildNodes.length() < 1){
822                                                 // No SDNC params for VNF
823                                         }else{
824                                                 NodeList paramsList = responseXmlVnf.getElementsByTagNameNS("*", "param")
825                                                 for (int z = 0; z < paramsList.getLength(); z++) {
826                                                         Node node = paramsList.item(z)
827                                                         Element eElement = (Element) node
828                                                         String vnfParameterName = utils.getElementText(eElement, "name")
829                                                         if (!sdncResponseParamsToSkip.contains(vnfParameterName)) {
830                                                                 String vnfParameterValue = utils.getElementText(eElement, "value")
831                                                                 paramsMap.put("${vnfParameterName}", "${vnfParameterValue}")
832                                                         }
833                                                 }
834                                         }
835                                         
836                                         String vfModuleParamsChildNodes = utils.getChildNodes(vfModuleData, "param")
837                                         if(vfModuleParamsChildNodes == null || vfModuleParamsChildNodes.length() < 1){
838                                                 // No SDNC params for VF Module
839                                         }else{
840                                                 NodeList paramsList = responseXmlVfModule.getElementsByTagNameNS("*", "param")
841                                                 for (int z = 0; z < paramsList.getLength(); z++) {
842                                                         Node node = paramsList.item(z)
843                                                         Element eElement = (Element) node
844                                                         String vnfParameterName = utils.getElementText(eElement, "name")
845                                                         if (!sdncResponseParamsToSkip.contains(vnfParameterName)) {
846                                                                 String vnfParameterValue = utils.getElementText(eElement, "value")
847                                                                 paramsMap.put("${vnfParameterName}", "${vnfParameterValue}")
848                                                         }
849                                                 }
850                                         }
851                                         
852                                 // Parameters received from the request should overwrite any parameters received from SDNC
853                                 if (vnfParamsMap != null) {
854                                         for (Map.Entry<String, String> entry : vnfParamsMap.entrySet()) {
855                                                 String vnfKey = entry.getKey()
856                                                 String vnfValue = entry.getValue()
857                                                 paramsMap.put("$vnfKey", "$vnfValue")
858                                         }
859                                 }
860                                 
861                                 StringBuilder sbParams = new StringBuilder()
862                                 def vfModuleParams = ""
863                                 for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
864                                         String paramsXml
865                                         String paramName = entry.getKey()
866                                         String paramValue = entry.getValue()
867                                         paramsXml =
868                                                         """<entry>
869                                                 <key>${MsoUtils.xmlEscape(paramName)}</key>
870                                                 <value>${MsoUtils.xmlEscape(paramValue)}</value>
871                                         </entry>
872                                         """
873                 
874                                         vfModuleParams = sbParams.append(paramsXml)
875                                 }
876                                 
877                                 return vfModuleParams
878                                 
879                         }
880         
881
882         /*
883          * VBNG specific method that parses VNF parameters passed in on the 
884          * incoming requests and SDNC parameters returned from SDNC get response
885          * and puts them into the format expected by VNF adapter.
886          * @param vnfParamsMap -  map of VNF parameters passed in the request body
887          * @param sdncGetResponse - response string from SDNC GET topology request
888          * @param vnfId
889          * @param vnfName
890          * @param vfModuleId
891          * @param vfModuleName
892          * @return a String of key/value entries for vfModuleParams
893          */
894         
895         protected String buildVfModuleParamsVbng(String vnfParams, String sdncGetResponse, String vnfId, String vnfName,
896                         String vfModuleId, String vfModuleName) {
897                                 
898                 //Get SDNC Response Data
899                                 
900                 String data = utils.getNodeXml(sdncGetResponse, "response-data")
901         
902                 
903         
904                 // Add-on data
905                 String vnfInfo =
906                         """<entry>
907                                 <key>vnf_id</key>
908                                 <value>${MsoUtils.xmlEscape(vnfId)}</value>
909                         </entry>
910                         <entry>
911                                 <key>vnf_name</key>
912                                 <value>${MsoUtils.xmlEscape(vnfName)}</value>
913                         </entry>
914                         <entry>
915                                 <key>vf_module_id</key>
916                                 <value>${MsoUtils.xmlEscape(vfModuleId)}</value>
917                         </entry>
918                         <entry>
919                                 <key>vf_module_name</key>
920                                 <value>${MsoUtils.xmlEscape(vfModuleName)}</value>
921                         </entry>"""
922         
923                 msoLogger.debug("vnfInfo: " + vnfInfo)
924                 InputSource source = new InputSource(new StringReader(data));
925                 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
926                 docFactory.setNamespaceAware(true)
927                 DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
928                 Document responseXml = docBuilder.parse(source)
929         
930         
931                 // Availability Zones Data
932                 String aZones = ""
933                 StringBuilder sbAZone = new StringBuilder()
934                 NodeList aZonesList = responseXml.getElementsByTagNameNS("*", "availability-zones")
935                 String aZonePosition = "0"
936                 for (int z = 0; z < aZonesList.getLength(); z++) {
937                         Node node = aZonesList.item(z)
938                         if (node.getNodeType() == Node.ELEMENT_NODE) {
939                                 Element eElement = (Element) node
940                                 String aZoneValue = utils.getElementText(eElement, "availability-zone")
941                                 aZonePosition = z.toString()
942                                 String aZoneXml =
943                                         """<entry>
944                                                 <key>availability_zone_${MsoUtils.xmlEscape(aZonePosition)}</key>
945                                                 <value>${MsoUtils.xmlEscape(aZoneValue)}</value>
946                                         </entry>"""
947                                 aZones = sbAZone.append(aZoneXml)
948                         }
949                 }
950         
951                 // Map of network-roles and network-tags from vm-networks
952                 
953                 NodeList vmNetworksListGlobal = responseXml.getElementsByTagNameNS("*", "vm-networks")
954                 Map<String, String> networkRoleMap = new HashMap<String, String>()
955                 for(int n = 0; n < vmNetworksListGlobal.getLength(); n++){
956                         Node nodeNetworkKey = vmNetworksListGlobal.item(n)
957                         if (nodeNetworkKey.getNodeType() == Node.ELEMENT_NODE) {
958                                 Element eElementNetworkKey = (Element) nodeNetworkKey
959                                 String networkRole = utils.getElementText(eElementNetworkKey, "network-role")
960                                 String networkRoleValue = utils.getElementText(eElementNetworkKey, "network-role-tag")
961                                 if (networkRoleValue.isEmpty()) {
962                                         networkRoleValue = networkRole
963                                 }
964                                 networkRoleMap.put(networkRole, networkRoleValue)
965                         }
966                 }
967         
968                 // VNF Networks Data
969                 String vnfNetworkNetId = ""
970                 String vnfNetworkNetName = ""
971                 String vnfNetworkSubNetId = ""
972                 String vnfNetworkV6SubNetId = ""
973                 String vnfNetworkNetFqdn = ""
974                 String vnfNetworksSriovVlanFilters = ""
975                 StringBuilder sbNet = new StringBuilder()
976                 StringBuilder sbNet2 = new StringBuilder()
977                 StringBuilder sbNet3 = new StringBuilder()
978                 StringBuilder sbNet4 = new StringBuilder()
979                 StringBuilder sbNet5 = new StringBuilder()
980                 StringBuilder sbNet6 = new StringBuilder()
981                 NodeList vnfNetworkList = responseXml.getElementsByTagNameNS("*", "vnf-networks")
982                 for (int x = 0; x < vnfNetworkList.getLength(); x++) {
983                         Node node = vnfNetworkList.item(x)
984                         if (node.getNodeType() == Node.ELEMENT_NODE) {
985                                 Element eElement = (Element) node
986                                 String vnfNetworkKey = utils.getElementText(eElement, "network-role-tag")
987                                 String networkRole = utils.getElementText(eElement, "network-role")
988                                 if (vnfNetworkKey.isEmpty()) {
989                                         vnfNetworkKey = networkRoleMap.get(networkRole)
990                                         if (vnfNetworkKey == null || vnfNetworkKey.isEmpty()) {
991                                                 vnfNetworkKey = networkRole
992                                         }                                       
993                                 }
994                                 String vnfNetworkNeutronIdValue = utils.getElementText(eElement, "neutron-id")
995                                 String vnfNetworkNetNameValue = utils.getElementText(eElement, "network-name")
996                                 String vnfNetworkSubNetIdValue = utils.getElementText(eElement, "subnet-id")
997                                 String vnfNetworkV6SubNetIdValue = utils.getElementText(eElement, "ipv6-subnet-id")
998                                 String vnfNetworkNetFqdnValue = utils.getElementText(eElement, "contrail-network-fqdn")
999                                 String vnfNetworkNetIdXml =
1000                                                 """<entry>
1001                                                         <key>${MsoUtils.xmlEscape(vnfNetworkKey)}_net_id</key>
1002                                                         <value>${MsoUtils.xmlEscape(vnfNetworkNeutronIdValue)}</value>
1003                                                 </entry>"""
1004                                 vnfNetworkNetId = sbNet.append(vnfNetworkNetIdXml)
1005                                 String vnfNetworkNetNameXml =
1006                                                 """<entry>
1007                                                 <key>${MsoUtils.xmlEscape(vnfNetworkKey)}_net_name</key>
1008                                                 <value>${MsoUtils.xmlEscape(vnfNetworkNetNameValue)}</value>
1009                                 </entry>"""
1010                                 vnfNetworkNetName = sbNet2.append(vnfNetworkNetNameXml)
1011                                 String vnfNetworkSubNetIdXml =
1012                                                 """<entry>
1013                                                 <key>${MsoUtils.xmlEscape(vnfNetworkKey)}_subnet_id</key>
1014                                                 <value>${MsoUtils.xmlEscape(vnfNetworkSubNetIdValue)}</value>
1015                                 </entry>"""
1016                                 vnfNetworkSubNetId = sbNet3.append(vnfNetworkSubNetIdXml)
1017                                 String vnfNetworkV6SubNetIdXml =
1018                                                 """<entry>
1019                                                 <key>${MsoUtils.xmlEscape(vnfNetworkKey)}_v6_subnet_id</key>
1020                                                 <value>${MsoUtils.xmlEscape(vnfNetworkV6SubNetIdValue)}</value>
1021                                 </entry>"""
1022                                 vnfNetworkV6SubNetId = sbNet5.append(vnfNetworkV6SubNetIdXml)
1023                                 String vnfNetworkNetFqdnXml =
1024                                                 """<entry>
1025                                                 <key>${MsoUtils.xmlEscape(vnfNetworkKey)}_net_fqdn</key>
1026                                                 <value>${MsoUtils.xmlEscape(vnfNetworkNetFqdnValue)}</value>
1027                                 </entry>"""
1028                                 vnfNetworkNetFqdn = sbNet4.append(vnfNetworkNetFqdnXml)
1029                                                 
1030                                 NodeList sriovVlanFilterList = eElement.getElementsByTagNameNS("*","sriov-vlan-filter-list")
1031                                 StringBuffer sriovFilterBuf = new StringBuffer()
1032                                 String values = ""
1033                                 for(int i = 0; i < sriovVlanFilterList.getLength(); i++){
1034                                         Node node1 = sriovVlanFilterList.item(i)
1035                                         if (node1.getNodeType() == Node.ELEMENT_NODE) {
1036                                                 Element eElement1 = (Element) node1
1037                                                 String value = utils.getElementText(eElement1, "sriov-vlan-filter")
1038                                                 if (i != sriovVlanFilterList.getLength() - 1) {
1039                                                         values = sriovFilterBuf.append(value + ",")
1040                                                 }
1041                                                 else {
1042                                                         values = sriovFilterBuf.append(value);
1043                                                 }
1044                                         }
1045                                 }
1046                                 if (!values.isEmpty()) {
1047                                                 String vnfNetworkSriovVlanFilterXml =
1048                                                                 """<entry>
1049                                                 <key>${MsoUtils.xmlEscape(vnfNetworkKey)}_ATT_VF_VLAN_FILTER</key>
1050                                                 <value>${MsoUtils.xmlEscape(values)}</value>
1051                                         </entry>"""
1052                                                 vnfNetworksSriovVlanFilters = sbNet6.append(vnfNetworkSriovVlanFilterXml)
1053                                 }
1054                         }
1055                 }
1056         
1057                 // VNF-VMS Data
1058                 String vnfVMS = ""
1059                 String vnfVMSPositions = ""
1060                 String vmNetworks = ""
1061                 String vmNetworksPositions = ""
1062                 String vmNetworksPositionsV6 = ""
1063                 String interfaceRoutePrefixes = ""
1064                 def key
1065                 def value
1066                 def networkKey
1067                 def networkValue
1068                 def floatingIPKey
1069                 def floatingIPKeyValue
1070                 def floatingIPV6Key
1071                 def floatingIPV6KeyValue
1072                 StringBuilder sb = new StringBuilder()
1073                 StringBuilder sbPositions = new StringBuilder()
1074                 StringBuilder sbVmNetworks = new StringBuilder()
1075                 StringBuilder sbNetworksPositions = new StringBuilder()
1076                 StringBuilder sbInterfaceRoutePrefixes = new StringBuilder()
1077                 StringBuilder sbNetworksPositionsV6 = new StringBuilder()
1078
1079                 NodeList vmsList = responseXml.getElementsByTagNameNS("*","vnf-vms")
1080                 for (int x = 0; x < vmsList.getLength(); x++) {
1081                         Node node = vmsList.item(x)
1082                         if (node.getNodeType() == Node.ELEMENT_NODE) {
1083                                 Element eElement = (Element) node
1084                                 key = utils.getElementText(eElement, "vm-type")
1085                                 String values
1086                                 String position = "0"
1087                                 StringBuilder sb1 = new StringBuilder()
1088                                 NodeList valueList = eElement.getElementsByTagNameNS("*","vm-names")
1089                                 NodeList vmNetworksList = eElement.getElementsByTagNameNS("*","vm-networks")
1090                                 for(int i = 0; i < valueList.getLength(); i++){
1091                                         Node node1 = valueList.item(i)
1092                                         if (node1.getNodeType() == Node.ELEMENT_NODE) {
1093                                                 Element eElement1 = (Element) node1
1094                                                 value = utils.getElementText(eElement1, "vm-name")
1095                                                 if (i != valueList.getLength() - 1) {
1096                                                         values = sb1.append(value + ",")
1097                                                 }
1098                                                 else {
1099                                                         values = sb1.append(value);
1100                                                 }
1101                                                 position = i.toString()
1102                                                 String vnfPositionXml =
1103                                                                 """<entry>
1104                                                                 <key>${MsoUtils.xmlEscape(key)}_name_${MsoUtils.xmlEscape(position)}</key>
1105                                                                 <value>${MsoUtils.xmlEscape(value)}</value>
1106                                                         </entry>"""
1107                                                  nfVMSPositions = sbPositions.append(vnfPositionXml)
1108                                         }
1109                                 }
1110                                 for(int n = 0; n < vmNetworksList.getLength(); n++){
1111                                         String floatingIpKeyValueStr = ""
1112                                         String floatingIpV6KeyValueStr = ""
1113                                         Node nodeNetworkKey = vmNetworksList.item(n)
1114                                         if (nodeNetworkKey.getNodeType() == Node.ELEMENT_NODE) {
1115                                                 Element eElementNetworkKey = (Element) nodeNetworkKey
1116                                                 String ipAddressValues
1117                                                 String ipV6AddressValues
1118                                                 String networkPosition = "0"
1119                                                 StringBuilder sb2 = new StringBuilder()
1120                                                 StringBuilder sb3 = new StringBuilder()
1121                                                 StringBuilder sb4 = new StringBuilder()
1122                                                 networkKey = utils.getElementText(eElementNetworkKey, "network-role-tag")
1123                                                 if (networkKey.isEmpty()) {
1124                                                         networkKey = utils.getElementText(eElementNetworkKey, "network-role")
1125                                                 }
1126                                                 floatingIPKey = key + '_' + networkKey + '_floating_ip'
1127                                                 floatingIPKeyValue = utils.getElementText(eElementNetworkKey, "floating-ip")
1128                                                 if(!floatingIPKeyValue.isEmpty()){
1129                                                         floatingIpKeyValueStr = """<entry>
1130                                                                 <key>$floatingIPKey</key>
1131                                                                 <value>$floatingIPKeyValue</value>
1132                                                         </entry>"""
1133                                                 }
1134                                                 floatingIPV6Key = key + '_' + networkKey + '_floating_v6_ip'
1135                                                 floatingIPV6KeyValue = utils.getElementText(eElementNetworkKey, "floating-ip-v6")
1136                                                 if(!floatingIPV6KeyValue.isEmpty()){
1137                                                         floatingIpV6KeyValueStr = """<entry>
1138                                                                 <key>$floatingIPV6Key</key>
1139                                                                 <value>$floatingIPV6KeyValue</value>
1140                                                         </entry>"""
1141                                                 }
1142                                                 NodeList networkIpsList = eElementNetworkKey.getElementsByTagNameNS("*","network-ips")
1143                                                 for(int a = 0; a < networkIpsList.getLength(); a++){
1144                                                         Node ipAddress = networkIpsList.item(a)
1145                                                         if (ipAddress.getNodeType() == Node.ELEMENT_NODE) {
1146                                                                 Element eElementIpAddress = (Element) ipAddress
1147                                                                 String ipAddressValue = utils.getElementText(eElementIpAddress, "ip-address")
1148                                                                 if (a != networkIpsList.getLength() - 1) {
1149                                                                         ipAddressValues = sb2.append(ipAddressValue + ",")
1150                                                                 }
1151                                                                 else {
1152                                                                         ipAddressValues = sb2.append(ipAddressValue);
1153                                                                 }
1154                                                                 networkPosition = a.toString()
1155                                                                 String vmNetworksPositionsXml =
1156                                                                                                 """<entry>
1157                                                                                 <key>${MsoUtils.xmlEscape(key)}_${MsoUtils.xmlEscape(networkKey)}_ip_${MsoUtils.xmlEscape(networkPosition)}</key>
1158                                                                                 <value>${MsoUtils.xmlEscape(ipAddressValue)}</value>
1159                                                                         </entry>"""
1160                                                                 vmNetworksPositions = sbNetworksPositions.append(vmNetworksPositionsXml)
1161                                                         }
1162                                                 }
1163                                                 vmNetworksPositions = sbNetworksPositions.append(floatingIpKeyValueStr).append(floatingIpV6KeyValueStr)
1164                                                         
1165                                                 String vmNetworksXml =
1166                                                                                 """<entry>
1167                                                                 <key>${MsoUtils.xmlEscape(key)}_${MsoUtils.xmlEscape(networkKey)}_ips</key>
1168                                                                 <value>${MsoUtils.xmlEscape(ipAddressValues)}</value>
1169                                                         </entry>"""
1170                                                 vmNetworks = sbVmNetworks.append(vmNetworksXml)
1171                                                                 
1172                                                 NodeList interfaceRoutePrefixesList = eElementNetworkKey.getElementsByTagNameNS("*","interface-route-prefixes")
1173                                                 String interfaceRoutePrefixValues = sb3.append("[")
1174                                                                 
1175                                                 for(int a = 0; a < interfaceRoutePrefixesList.getLength(); a++){
1176                                                         Node interfaceRoutePrefix = interfaceRoutePrefixesList.item(a)
1177                                                         if (interfaceRoutePrefix.getNodeType() == Node.ELEMENT_NODE) {
1178                                                                 Element eElementInterfaceRoutePrefix = (Element) interfaceRoutePrefix
1179                                                                 String interfaceRoutePrefixValue = utils.getElementText(eElementInterfaceRoutePrefix, "interface-route-prefix-cidr")
1180                                                                 if (interfaceRoutePrefixValue == null || interfaceRoutePrefixValue.isEmpty()) {
1181                                                                         interfaceRoutePrefixValue = utils.getElementText(eElementInterfaceRoutePrefix, "interface-route-prefix")
1182                                                                 }
1183                                                                 if (a != interfaceRoutePrefixesList.getLength() - 1) {
1184                                                                         interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}" + ",")
1185                                                                 }
1186                                                                 else {
1187                                                                         interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}")
1188                                                                 }
1189                                                         }
1190                                                 }
1191                                                 interfaceRoutePrefixValues = sb3.append("]")
1192                                                 if (interfaceRoutePrefixesList.getLength() > 0) {
1193                                                         String interfaceRoutePrefixesXml =
1194                                                                                                         """<entry>
1195                                                                                         <key>${MsoUtils.xmlEscape(key)}_${MsoUtils.xmlEscape(networkKey)}_route_prefixes</key>
1196                                                                                         <value>${MsoUtils.xmlEscape(interfaceRoutePrefixValues)}</value>
1197                                                                                 </entry>"""                                     
1198                                                         interfaceRoutePrefixes = sbInterfaceRoutePrefixes.append(interfaceRoutePrefixesXml)
1199                                                 }
1200                                                         
1201                                                 NodeList networkIpsV6List = eElementNetworkKey.getElementsByTagNameNS("*","network-ips-v6")
1202                                                 for(int a = 0; a < networkIpsV6List.getLength(); a++){
1203                                                         Node ipV6Address = networkIpsV6List.item(a)
1204                                                         if (ipV6Address.getNodeType() == Node.ELEMENT_NODE) {
1205                                                                 Element eElementIpV6Address = (Element) ipV6Address
1206                                                                 String ipV6AddressValue = utils.getElementText(eElementIpV6Address, "ip-address-ipv6")
1207                                                                 if (a != networkIpsV6List.getLength() - 1) {
1208                                                                         ipV6AddressValues = sb4.append(ipV6AddressValue + ",")
1209                                                                 }
1210                                                                 else {
1211                                                                         ipV6AddressValues = sb4.append(ipV6AddressValue);
1212                                                                 }
1213                                                                 networkPosition = a.toString()
1214                                                                 String vmNetworksPositionsV6Xml =
1215                                                                                 """<entry>
1216                                                                                 <key>${MsoUtils.xmlEscape(key)}_${MsoUtils.xmlEscape(networkKey)}_v6_ip_${MsoUtils.xmlEscape(networkPosition)}</key>
1217                                                                                 <value>${MsoUtils.xmlEscape(ipV6AddressValue)}</value>
1218                                                                                 </entry>"""
1219                                                                 vmNetworksPositionsV6 = sbNetworksPositionsV6.append(vmNetworksPositionsV6Xml)
1220                                                         }
1221                                                 }
1222                                                 String vmNetworksV6Xml =
1223                                                                 """<entry>
1224                                                                 <key>${MsoUtils.xmlEscape(key)}_${MsoUtils.xmlEscape(networkKey)}_v6_ips</key>
1225                                                                 <value>${MsoUtils.xmlEscape(ipV6AddressValues)}</value>
1226                                                         </entry>"""
1227                                                 vmNetworks = sbVmNetworks.append(vmNetworksV6Xml)
1228                                         }
1229                                 }
1230                                 String vnfXml =
1231                                                                 """<entry>
1232                                 <key>${MsoUtils.xmlEscape(key)}_names</key>
1233                                 <value>${MsoUtils.xmlEscape(values)}</value>
1234                                         </entry>"""
1235                                 vnfVMS = sb.append(vnfXml)
1236                         }
1237                 }
1238         //SDNC Response Params
1239                 String sdncResponseParams = ""
1240                 List<String> sdncResponseParamsToSkip = ["vnf_id", "vf_module_id", "vnf_name", "vf_module_name"]
1241                 String vnfParamsChildNodes = utils.getChildNodes(data, "vnf-parameters")
1242                 if(vnfParamsChildNodes == null || vnfParamsChildNodes.length() < 1){
1243                         // No SDNC params
1244                 }else{
1245                         NodeList paramsList = responseXml.getElementsByTagNameNS("*", "vnf-parameters")
1246                         for (int z = 0; z < paramsList.getLength(); z++) {
1247                                 Node node = paramsList.item(z)
1248                                 Element eElement = (Element) node
1249                                 String vnfParameterName = utils.getElementText(eElement, "vnf-parameter-name")
1250                                 if (!sdncResponseParamsToSkip.contains(vnfParameterName)) {
1251                                         String vnfParameterValue = utils.getElementText(eElement, "vnf-parameter-value")
1252                                         String paraEntry =
1253                                                 """<entry>
1254                                                         <key>${MsoUtils.xmlEscape(vnfParameterName)}</key>
1255                                                         <value>${MsoUtils.xmlEscape(vnfParameterValue)}</value>
1256                                                 </entry>"""
1257                                         sdncResponseParams = sb.append(paraEntry)
1258                                 }
1259                         }
1260                 }
1261         
1262         
1263                 def vfModuleParams = """
1264                 ${vnfInfo}
1265                 ${aZones}
1266                 ${vnfNetworkNetId}
1267                 ${vnfNetworkNetName}
1268                 ${vnfNetworkSubNetId}
1269                 ${vnfNetworkV6SubNetId}
1270                 ${vnfNetworkNetFqdn}
1271                 ${vnfNetworksSriovVlanFilters}
1272         ${vnfVMS}
1273         ${vnfVMSPositions}
1274                 ${vmNetworks}
1275                 ${vmNetworksPositions}
1276                 ${vmNetworksPositionsV6}
1277                 ${interfaceRoutePrefixes}
1278                 ${vnfParams}
1279                 ${sdncResponseParams}"""
1280                         
1281                 return vfModuleParams
1282                         
1283         }
1284         
1285 }