2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.mso.bpmn.common.scripts;
23 //import groovy.util.Node;
25 import javax.xml.parsers.DocumentBuilder
26 import javax.xml.parsers.DocumentBuilderFactory
28 import org.apache.commons.lang3.*
29 import org.camunda.bpm.engine.runtime.Execution
30 import org.w3c.dom.Document
31 import org.w3c.dom.Element
32 import org.w3c.dom.Node
33 import org.w3c.dom.NodeList
34 import org.xml.sax.InputSource
37 public abstract class VfModuleBase extends AbstractServiceTaskProcessor {
39 protected XmlParser xmlParser = new XmlParser()
44 * @return the XmlParser.
46 protected XmlParser getXmlParser() {
51 * Find the VF Module with specified ID in the specified Generic VF. If no such
52 * VF Module is found, null is returned.
54 * @param genericVnf The Generic VNF in which to search for the specified VF Moduel.
55 * @param vfModuleId The ID of the VF Module for which to search.
56 * @return a VFModule object for the found VF Module or null if no VF Module is found.
58 protected VfModule findVfModule(String genericVnf, String vfModuleId) {
60 def genericVnfNode = xmlParser.parseText(genericVnf)
61 def vfModulesNode = utils.getChildNode(genericVnfNode, 'vf-modules')
62 if (vfModulesNode == null) {
65 def vfModuleList = utils.getIdenticalChildren(vfModulesNode, 'vf-module')
66 for (vfModuleNode in vfModuleList) {
67 def vfModuleIdNode = utils.getChildNode(vfModuleNode, 'vf-module-id')
68 if ((vfModuleIdNode != null) && (vfModuleIdNode.text().equals(vfModuleId))) {
69 return new VfModule(vfModuleNode, (vfModuleList.size() == 1))
76 * Transform all '*_network' parameter specifications from the incoming '*-params' root
77 * element to a corresponding list of 'vnf-networks' specifications (typically used when
78 * invoking the VNF Rest Adpater). Each element in '*-params' whose name attribute ends
79 * with '_network' is used to create an 'vnf-networks' element.
81 * @param paramsNode A Node representing a '*-params' element.
82 * @return a String of 'vnf-networks' elements, one for each 'param' element whose name
83 * attribute ends with '_network'.
85 protected String transformNetworkParamsToVnfNetworks(String paramsRootXml) {
86 if ((paramsRootXml == null) || (paramsRootXml.isEmpty())) {
89 def String vnfNetworks = ''
91 paramsRootXml = utils.removeXmlNamespaces(paramsRootXml)
92 def paramsNode = xmlParser.parseText(paramsRootXml)
93 def params = utils.getIdenticalChildren(paramsNode, 'param')
94 for (param in params) {
95 def String attrName = (String) param.attribute('name')
96 if (attrName.endsWith('_network')) {
97 def networkRole = attrName.substring(0, (attrName.length()-'_network'.length()))
98 def networkName = param.text()
99 String vnfNetwork = """
101 <network-role>${networkRole}</network-role>
102 <network-name>${networkName}</network-name>
105 vnfNetworks = vnfNetworks + vnfNetwork
108 } catch (Exception e) {
109 logWarn('Exception transforming \'_network\' params to vnfNetworks', e)
115 * Transform the parameter specifications from the incoming '*-params' root element to
116 * a corresponding list of 'entry's (typically used when invoking the VNF Rest Adpater).
117 * Each element in '*-params' is used to create an 'entry' element.
119 * @param paramsNode A Node representing a '*-params' element.
120 * @return a String of 'entry' elements, one for each 'param' element.
122 protected String transformParamsToEntries(String paramsRootXml) {
123 if ((paramsRootXml == null) || (paramsRootXml.isEmpty())) {
126 def String entries = ''
128 paramsRootXml = utils.removeXmlNamespaces(paramsRootXml)
129 def paramsNode = xmlParser.parseText(paramsRootXml)
130 def params = utils.getIdenticalChildren(paramsNode, 'param')
131 for (param in params) {
132 def key = (String) param.attribute('name')
136 def value = (String) param.text()
140 <value>${value}</value>
143 entries = entries + entry
145 } catch (Exception e) {
146 logWarn('Exception transforming params to entries', e)
152 * Transform the parameter specifications from the incoming '*-params' root element to
153 * a corresponding list of 'entry's (typically used when invoking the VNF Rest Adpater).
154 * Each element in '*-params' is used to create an 'entry' element.
156 * @param paramsNode A Node representing a '*-params' element.
157 * @return a String of 'entry' elements, one for each 'param' element.
159 protected String transformVolumeParamsToEntries(String paramsRootXml) {
160 if ((paramsRootXml == null) || (paramsRootXml.isEmpty())) {
163 def String entries = ''
165 paramsRootXml = utils.removeXmlNamespaces(paramsRootXml)
166 def paramsNode = xmlParser.parseText(paramsRootXml)
167 def params = utils.getIdenticalChildren(paramsNode, 'param')
168 for (param in params) {
169 def key = (String) param.attribute('name')
173 if ( !(key in ['vnf_id', 'vnf_name', 'vf_module_id', 'vf_module_name'])) {
174 def value = (String) param.text()
178 <value>${value}</value>
181 entries = entries + entry
184 } catch (Exception e) {
185 logWarn('Exception transforming params to entries', e)
191 * Extract the Tenant Id from the Volume Group information returned by AAI.
193 * @param volumeGroupXml Volume Group XML returned by AAI.
194 * @return the Tenant Id extracted from the Volume Group information. 'null' is returned if
195 * the Tenant Id is missing or could not otherwise be extracted.
197 protected String getTenantIdFromVolumeGroup(String volumeGroupXml) {
198 def groovy.util.Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)
199 def groovy.util.Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')
200 if (relationshipList != null) {
201 def groovy.util.NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')
202 for (groovy.util.Node relationship in relationships) {
203 def groovy.util.Node relatedTo = utils.getChildNode(relationship, 'related-to')
204 if ((relatedTo != null) && (relatedTo.text().equals('tenant'))) {
205 def groovy.util.NodeList relationshipDataList = utils.getIdenticalChildren(relationship, 'relationship-data')
206 for (groovy.util.Node relationshipData in relationshipDataList) {
207 def groovy.util.Node relationshipKey = utils.getChildNode(relationshipData, 'relationship-key')
208 if ((relationshipKey != null) && (relationshipKey.text().equals('tenant.tenant-id'))) {
209 def groovy.util.Node relationshipValue = utils.getChildNode(relationshipData, 'relationship-value')
210 if (relationshipValue != null) {
211 return relationshipValue.text()
223 * Parses VNF parameters passed in on the incoming requests and SDNC parameters returned from SDNC get response
224 * and puts them into the format expected by VNF adapter.
225 * @param vnfParamsMap - map of VNF parameters passed in the request body
226 * @param sdncGetResponse - response string from SDNC GET topology request
230 * @param vfModuleName
231 * @return a String of key/value entries for vfModuleParams
235 protected String buildVfModuleParams(String vnfParams, String sdncGetResponse, String vnfId, String vnfName,
236 String vfModuleId, String vfModuleName) {
238 //Get SDNC Response Data
240 String data = utils.getNodeXml(sdncGetResponse, "response-data")
241 data = data.replaceAll("<", "<")
242 data = data.replaceAll(">", ">")
244 String serviceData = utils.getNodeXml(data, "service-data")
245 serviceData = utils.removeXmlPreamble(serviceData)
246 serviceData = utils.removeXmlNamespaces(serviceData)
247 String vnfRequestInfo = utils.getNodeXml(serviceData, "vnf-request-information")
248 String oldVnfId = utils.getNodeXml(vnfRequestInfo, "vnf-id")
249 oldVnfId = utils.removeXmlPreamble(oldVnfId)
250 oldVnfId = utils.removeXmlNamespaces(oldVnfId)
251 serviceData = serviceData.replace(oldVnfId, "")
252 def vnfId1 = utils.getNodeText1(serviceData, "vnf-id")
258 <value>${vnfId}</value>
262 <value>${vnfName}</value>
265 <key>vf_module_id</key>
266 <value>${vfModuleId}</value>
269 <key>vf_module_name</key>
270 <value>${vfModuleName}</value>
273 utils.logAudit("vnfInfo: " + vnfInfo)
274 InputSource source = new InputSource(new StringReader(data));
275 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
276 docFactory.setNamespaceAware(true)
277 DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
278 Document responseXml = docBuilder.parse(source)
281 // Availability Zones Data
283 StringBuilder sbAZone = new StringBuilder()
284 NodeList aZonesList = responseXml.getElementsByTagNameNS("*", "availability-zones")
285 String aZonePosition = "0"
286 for (int z = 0; z < aZonesList.getLength(); z++) {
287 Node node = aZonesList.item(z)
288 if (node.getNodeType() == Node.ELEMENT_NODE) {
289 Element eElement = (Element) node
290 String aZoneValue = utils.getElementText(eElement, "availability-zone")
291 aZonePosition = z.toString()
294 <key>availability_zone_${aZonePosition}</key>
295 <value>${aZoneValue}</value>
297 aZones = sbAZone.append(aZoneXml)
302 String vnfNetworkNetId = ""
303 String vnfNetworkNetName = ""
304 String vnfNetworkSubNetId = ""
305 String vnfNetworkV6SubNetId = ""
306 String vnfNetworkNetFqdn = ""
307 String vnfNetworksSriovVlanFilters = ""
308 StringBuilder sbNet = new StringBuilder()
309 StringBuilder sbNet2 = new StringBuilder()
310 StringBuilder sbNet3 = new StringBuilder()
311 StringBuilder sbNet4 = new StringBuilder()
312 StringBuilder sbNet5 = new StringBuilder()
313 StringBuilder sbNet6 = new StringBuilder()
314 NodeList vnfNetworkList = responseXml.getElementsByTagNameNS("*", "vnf-networks")
315 for (int x = 0; x < vnfNetworkList.getLength(); x++) {
316 Node node = vnfNetworkList.item(x)
317 if (node.getNodeType() == Node.ELEMENT_NODE) {
318 Element eElement = (Element) node
319 String vnfNetworkKey = utils.getElementText(eElement, "network-role")
320 String vnfNetworkNeutronIdValue = utils.getElementText(eElement, "neutron-id")
321 String vnfNetworkNetNameValue = utils.getElementText(eElement, "network-name")
322 String vnfNetworkSubNetIdValue = utils.getElementText(eElement, "subnet-id")
323 String vnfNetworkV6SubNetIdValue = utils.getElementText(eElement, "ipv6-subnet-id")
324 String vnfNetworkNetFqdnValue = utils.getElementText(eElement, "contrail-network-fqdn")
325 String vnfNetworkNetIdXml =
327 <key>${vnfNetworkKey}_net_id</key>
328 <value>${vnfNetworkNeutronIdValue}</value>
330 vnfNetworkNetId = sbNet.append(vnfNetworkNetIdXml)
331 String vnfNetworkNetNameXml =
333 <key>${vnfNetworkKey}_net_name</key>
334 <value>${vnfNetworkNetNameValue}</value>
336 vnfNetworkNetName = sbNet2.append(vnfNetworkNetNameXml)
337 String vnfNetworkSubNetIdXml =
339 <key>${vnfNetworkKey}_subnet_id</key>
340 <value>${vnfNetworkSubNetIdValue}</value>
342 vnfNetworkSubNetId = sbNet3.append(vnfNetworkSubNetIdXml)
343 String vnfNetworkV6SubNetIdXml =
345 <key>${vnfNetworkKey}_v6_subnet_id</key>
346 <value>${vnfNetworkV6SubNetIdValue}</value>
348 vnfNetworkV6SubNetId = sbNet5.append(vnfNetworkV6SubNetIdXml)
349 String vnfNetworkNetFqdnXml =
351 <key>${vnfNetworkKey}_net_fqdn</key>
352 <value>${vnfNetworkNetFqdnValue}</value>
354 vnfNetworkNetFqdn = sbNet4.append(vnfNetworkNetFqdnXml)
356 NodeList sriovVlanFilterList = eElement.getElementsByTagNameNS("*","sriov-vlan-filter-list")
357 StringBuffer sriovFilterBuf = new StringBuffer()
359 for(int i = 0; i < sriovVlanFilterList.getLength(); i++){
360 Node node1 = sriovVlanFilterList.item(i)
361 if (node1.getNodeType() == Node.ELEMENT_NODE) {
362 Element eElement1 = (Element) node1
363 String value = utils.getElementText(eElement1, "sriov-vlan-filter")
364 if (i != sriovVlanFilterList.getLength() - 1) {
365 values = sriovFilterBuf.append(value + ",")
368 values = sriovFilterBuf.append(value);
372 if (!values.isEmpty()) {
373 String vnfNetworkSriovVlanFilterXml =
375 <key>${vnfNetworkKey}_ATT_VF_VLAN_FILTER</key>
376 <value>${values}</value>
378 vnfNetworksSriovVlanFilters = sbNet6.append(vnfNetworkSriovVlanFilterXml)
385 String vnfVMSPositions = ""
386 String vmNetworks = ""
387 String vmNetworksPositions = ""
388 String vmNetworksPositionsV6 = ""
389 String interfaceRoutePrefixes = ""
395 def floatingIPKeyValue
397 def floatingIPV6KeyValue
398 StringBuilder sb = new StringBuilder()
399 StringBuilder sbPositions = new StringBuilder()
400 StringBuilder sbVmNetworks = new StringBuilder()
401 StringBuilder sbNetworksPositions = new StringBuilder()
402 StringBuilder sbInterfaceRoutePrefixes = new StringBuilder()
403 StringBuilder sbNetworksPositionsV6 = new StringBuilder()
405 NodeList vmsList = responseXml.getElementsByTagNameNS("*","vnf-vms")
406 for (int x = 0; x < vmsList.getLength(); x++) {
407 Node node = vmsList.item(x)
408 if (node.getNodeType() == Node.ELEMENT_NODE) {
409 Element eElement = (Element) node
410 key = utils.getElementText(eElement, "vm-type")
412 String position = "0"
413 StringBuilder sb1 = new StringBuilder()
414 NodeList valueList = eElement.getElementsByTagNameNS("*","vm-names")
415 NodeList vmNetworksList = eElement.getElementsByTagNameNS("*","vm-networks")
416 for(int i = 0; i < valueList.getLength(); i++){
417 Node node1 = valueList.item(i)
418 if (node1.getNodeType() == Node.ELEMENT_NODE) {
419 Element eElement1 = (Element) node1
420 value = utils.getElementText(eElement1, "vm-name")
421 if (i != valueList.getLength() - 1) {
422 values = sb1.append(value + ",")
425 values = sb1.append(value);
427 position = i.toString()
428 String vnfPositionXml =
430 <key>${key}_name_${position}</key>
431 <value>${value}</value>
433 vnfVMSPositions = sbPositions.append(vnfPositionXml)
436 for(int n = 0; n < vmNetworksList.getLength(); n++){
437 String floatingIpKeyValueStr = ""
438 String floatingIpV6KeyValueStr = ""
439 Node nodeNetworkKey = vmNetworksList.item(n)
440 if (nodeNetworkKey.getNodeType() == Node.ELEMENT_NODE) {
441 Element eElementNetworkKey = (Element) nodeNetworkKey
442 String ipAddressValues
443 String ipV6AddressValues
444 String networkPosition = "0"
445 StringBuilder sb2 = new StringBuilder()
446 StringBuilder sb3 = new StringBuilder()
447 StringBuilder sb4 = new StringBuilder()
448 networkKey = utils.getElementText(eElementNetworkKey, "network-role")
449 floatingIPKey = key + '_' + networkKey + '_floating_ip'
450 floatingIPKeyValue = utils.getElementText(eElementNetworkKey, "floating-ip")
451 if(!floatingIPKeyValue.isEmpty()){
452 floatingIpKeyValueStr = """<entry>
453 <key>$floatingIPKey</key>
454 <value>$floatingIPKeyValue</value>
457 floatingIPV6Key = key + '_' + networkKey + '_floating_v6_ip'
458 floatingIPV6KeyValue = utils.getElementText(eElementNetworkKey, "floating-ip-v6")
459 if(!floatingIPV6KeyValue.isEmpty()){
460 floatingIpV6KeyValueStr = """<entry>
461 <key>$floatingIPV6Key</key>
462 <value>$floatingIPV6KeyValue</value>
465 NodeList networkIpsList = eElementNetworkKey.getElementsByTagNameNS("*","network-ips")
466 for(int a = 0; a < networkIpsList.getLength(); a++){
467 Node ipAddress = networkIpsList.item(a)
468 if (ipAddress.getNodeType() == Node.ELEMENT_NODE) {
469 Element eElementIpAddress = (Element) ipAddress
470 String ipAddressValue = utils.getElementText(eElementIpAddress, "ip-address")
471 if (a != networkIpsList.getLength() - 1) {
472 ipAddressValues = sb2.append(ipAddressValue + ",")
475 ipAddressValues = sb2.append(ipAddressValue);
477 networkPosition = a.toString()
478 String vmNetworksPositionsXml =
480 <key>${key}_${networkKey}_ip_${networkPosition}</key>
481 <value>${ipAddressValue}</value>
483 vmNetworksPositions = sbNetworksPositions.append(vmNetworksPositionsXml)
486 vmNetworksPositions = sbNetworksPositions.append(floatingIpKeyValueStr).append(floatingIpV6KeyValueStr)
488 String vmNetworksXml =
490 <key>${key}_${networkKey}_ips</key>
491 <value>${ipAddressValues}</value>
493 vmNetworks = sbVmNetworks.append(vmNetworksXml)
495 NodeList interfaceRoutePrefixesList = eElementNetworkKey.getElementsByTagNameNS("*","interface-route-prefixes")
496 String interfaceRoutePrefixValues = sb3.append("[")
498 for(int a = 0; a < interfaceRoutePrefixesList.getLength(); a++){
499 Node interfaceRoutePrefix = interfaceRoutePrefixesList.item(a)
500 if (interfaceRoutePrefix.getNodeType() == Node.ELEMENT_NODE) {
501 Element eElementInterfaceRoutePrefix = (Element) interfaceRoutePrefix
502 String interfaceRoutePrefixValue = utils.getElementText(eElementInterfaceRoutePrefix, "interface-route-prefix-cidr")
503 if (interfaceRoutePrefixValue == null || interfaceRoutePrefixValue.isEmpty()) {
504 interfaceRoutePrefixValue = utils.getElementText(eElementInterfaceRoutePrefix, "interface-route-prefix")
506 if (a != interfaceRoutePrefixesList.getLength() - 1) {
507 interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}" + ",")
510 interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}")
514 interfaceRoutePrefixValues = sb3.append("]")
515 if (interfaceRoutePrefixesList.getLength() > 0) {
516 String interfaceRoutePrefixesXml =
518 <key>${key}_${networkKey}_route_prefixes</key>
519 <value>${interfaceRoutePrefixValues}</value>
521 interfaceRoutePrefixes = sbInterfaceRoutePrefixes.append(interfaceRoutePrefixesXml)
524 NodeList networkIpsV6List = eElementNetworkKey.getElementsByTagNameNS("*","network-ips-v6")
525 for(int a = 0; a < networkIpsV6List.getLength(); a++){
526 Node ipV6Address = networkIpsV6List.item(a)
527 if (ipV6Address.getNodeType() == Node.ELEMENT_NODE) {
528 Element eElementIpV6Address = (Element) ipV6Address
529 String ipV6AddressValue = utils.getElementText(eElementIpV6Address, "ip-address-ipv6")
530 if (a != networkIpsV6List.getLength() - 1) {
531 ipV6AddressValues = sb4.append(ipV6AddressValue + ",")
534 ipV6AddressValues = sb4.append(ipV6AddressValue);
536 networkPosition = a.toString()
537 String vmNetworksPositionsV6Xml =
539 <key>${key}_${networkKey}_v6_ip_${networkPosition}</key>
540 <value>${ipV6AddressValue}</value>
542 vmNetworksPositionsV6 = sbNetworksPositionsV6.append(vmNetworksPositionsV6Xml)
545 String vmNetworksV6Xml =
547 <key>${key}_${networkKey}_v6_ips</key>
548 <value>${ipV6AddressValues}</value>
550 vmNetworks = sbVmNetworks.append(vmNetworksV6Xml)
555 <key>${key}_names</key>
556 <value>${values}</value>
558 vnfVMS = sb.append(vnfXml)
561 //SDNC Response Params
562 String sdncResponseParams = ""
563 List<String> sdncResponseParamsToSkip = ["vnf_id", "vf_module_id", "vnf_name", "vf_module_name"]
564 String vnfParamsChildNodes = utils.getChildNodes(data, "vnf-parameters")
565 if(vnfParamsChildNodes == null || vnfParamsChildNodes.length() < 1){
568 NodeList paramsList = responseXml.getElementsByTagNameNS("*", "vnf-parameters")
569 for (int z = 0; z < paramsList.getLength(); z++) {
570 Node node = paramsList.item(z)
571 Element eElement = (Element) node
572 String vnfParameterName = utils.getElementText(eElement, "vnf-parameter-name")
573 if (!sdncResponseParamsToSkip.contains(vnfParameterName)) {
574 String vnfParameterValue = utils.getElementText(eElement, "vnf-parameter-value")
577 <key>${vnfParameterName}</key>
578 <value>${vnfParameterValue}</value>
580 sdncResponseParams = sb.append(paraEntry)
586 def vfModuleParams = """
591 ${vnfNetworkSubNetId}
592 ${vnfNetworkV6SubNetId}
594 ${vnfNetworksSriovVlanFilters}
598 ${vmNetworksPositions}
599 ${vmNetworksPositionsV6}
600 ${interfaceRoutePrefixes}
602 ${sdncResponseParams}"""
604 return vfModuleParams