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 com.att.bpm.scripts;
23 //import groovy.util.Node;
25 import java.util.concurrent.ExecutionException;
27 import org.camunda.bpm.engine.delegate.BpmnError
28 import org.camunda.bpm.engine.runtime.Execution
29 import org.apache.commons.lang3.*
31 import javax.xml.parsers.DocumentBuilder
32 import javax.xml.parsers.DocumentBuilderFactory
34 import org.w3c.dom.Document
35 import org.w3c.dom.Element
36 import org.w3c.dom.NamedNodeMap
37 import org.w3c.dom.Node
38 import org.w3c.dom.NodeList;
39 import org.xml.sax.InputSource
42 import org.openecomp.mso.bpmn.core.WorkflowException
45 public abstract class VfModuleBase extends AbstractServiceTaskProcessor {
47 protected XmlParser xmlParser = new XmlParser()
52 * @return the XmlParser.
54 protected XmlParser getXmlParser() {
59 * Find the VF Module with specified ID in the specified Generic VF. If no such
60 * VF Module is found, null is returned.
62 * @param genericVnf The Generic VNF in which to search for the specified VF Moduel.
63 * @param vfModuleId The ID of the VF Module for which to search.
64 * @return a VFModule object for the found VF Module or null if no VF Module is found.
66 protected VfModule findVfModule(String genericVnf, String vfModuleId) {
68 def genericVnfNode = xmlParser.parseText(genericVnf)
69 def vfModulesNode = utils.getChildNode(genericVnfNode, 'vf-modules')
70 if (vfModulesNode == null) {
73 def vfModuleList = utils.getIdenticalChildren(vfModulesNode, 'vf-module')
74 for (vfModuleNode in vfModuleList) {
75 def vfModuleIdNode = utils.getChildNode(vfModuleNode, 'vf-module-id')
76 if ((vfModuleIdNode != null) && (vfModuleIdNode.text().equals(vfModuleId))) {
77 return new VfModule(vfModuleNode, (vfModuleList.size() == 1))
84 * Transform all '*_network' parameter specifications from the incoming '*-params' root
85 * element to a corresponding list of 'vnf-networks' specifications (typically used when
86 * invoking the VNF Rest Adpater). Each element in '*-params' whose name attribute ends
87 * with '_network' is used to create an 'vnf-networks' element.
89 * @param paramsNode A Node representing a '*-params' element.
90 * @return a String of 'vnf-networks' elements, one for each 'param' element whose name
91 * attribute ends with '_network'.
93 protected String transformNetworkParamsToVnfNetworks(String paramsRootXml) {
94 if ((paramsRootXml == null) || (paramsRootXml.isEmpty())) {
97 def String vnfNetworks = ''
99 paramsRootXml = utils.removeXmlNamespaces(paramsRootXml)
100 def paramsNode = xmlParser.parseText(paramsRootXml)
101 def params = utils.getIdenticalChildren(paramsNode, 'param')
102 for (param in params) {
103 def String attrName = (String) param.attribute('name')
104 if (attrName.endsWith('_network')) {
105 def networkRole = attrName.substring(0, (attrName.length()-'_network'.length()))
106 def networkName = param.text()
107 String vnfNetwork = """
109 <network-role>${networkRole}</network-role>
110 <network-name>${networkName}</network-name>
113 vnfNetworks = vnfNetworks + vnfNetwork
116 } catch (Exception e) {
117 logWarn('Exception transforming \'_network\' params to vnfNetworks', e)
123 * Transform the parameter specifications from the incoming '*-params' root element to
124 * a corresponding list of 'entry's (typically used when invoking the VNF Rest Adpater).
125 * Each element in '*-params' is used to create an 'entry' element.
127 * @param paramsNode A Node representing a '*-params' element.
128 * @return a String of 'entry' elements, one for each 'param' element.
130 protected String transformParamsToEntries(String paramsRootXml) {
131 if ((paramsRootXml == null) || (paramsRootXml.isEmpty())) {
134 def String entries = ''
136 paramsRootXml = utils.removeXmlNamespaces(paramsRootXml)
137 def paramsNode = xmlParser.parseText(paramsRootXml)
138 def params = utils.getIdenticalChildren(paramsNode, 'param')
139 for (param in params) {
140 def key = (String) param.attribute('name')
144 def value = (String) param.text()
148 <value>${value}</value>
151 entries = entries + entry
153 } catch (Exception e) {
154 logWarn('Exception transforming params to entries', e)
160 * Transform the parameter specifications from the incoming '*-params' root element to
161 * a corresponding list of 'entry's (typically used when invoking the VNF Rest Adpater).
162 * Each element in '*-params' is used to create an 'entry' element.
164 * @param paramsNode A Node representing a '*-params' element.
165 * @return a String of 'entry' elements, one for each 'param' element.
167 protected String transformVolumeParamsToEntries(String paramsRootXml) {
168 if ((paramsRootXml == null) || (paramsRootXml.isEmpty())) {
171 def String entries = ''
173 paramsRootXml = utils.removeXmlNamespaces(paramsRootXml)
174 def paramsNode = xmlParser.parseText(paramsRootXml)
175 def params = utils.getIdenticalChildren(paramsNode, 'param')
176 for (param in params) {
177 def key = (String) param.attribute('name')
181 if ( !(key in ['vnf_id', 'vnf_name', 'vf_module_id', 'vf_module_name'])) {
182 def value = (String) param.text()
186 <value>${value}</value>
189 entries = entries + entry
192 } catch (Exception e) {
193 logWarn('Exception transforming params to entries', e)
199 * Extract the Tenant Id from the Volume Group information returned by AAI.
201 * @param volumeGroupXml Volume Group XML returned by AAI.
202 * @return the Tenant Id extracted from the Volume Group information. 'null' is returned if
203 * the Tenant Id is missing or could not otherwise be extracted.
205 protected String getTenantIdFromVolumeGroup(String volumeGroupXml) {
206 def groovy.util.Node volumeGroupNode = xmlParser.parseText(volumeGroupXml)
207 def groovy.util.Node relationshipList = utils.getChildNode(volumeGroupNode, 'relationship-list')
208 if (relationshipList != null) {
209 def groovy.util.NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')
210 for (groovy.util.Node relationship in relationships) {
211 def groovy.util.Node relatedTo = utils.getChildNode(relationship, 'related-to')
212 if ((relatedTo != null) && (relatedTo.text().equals('tenant'))) {
213 def groovy.util.NodeList relationshipDataList = utils.getIdenticalChildren(relationship, 'relationship-data')
214 for (groovy.util.Node relationshipData in relationshipDataList) {
215 def groovy.util.Node relationshipKey = utils.getChildNode(relationshipData, 'relationship-key')
216 if ((relationshipKey != null) && (relationshipKey.text().equals('tenant.tenant-id'))) {
217 def groovy.util.Node relationshipValue = utils.getChildNode(relationshipData, 'relationship-value')
218 if (relationshipValue != null) {
219 return relationshipValue.text()
231 * Parses VNF parameters passed in on the incoming requests and SDNC parameters returned from SDNC get response
232 * and puts them into the format expected by VNF adapter.
233 * @param vnfParamsMap - map of VNF parameters passed in the request body
234 * @param sdncGetResponse - response string from SDNC GET topology request
238 * @param vfModuleName
239 * @return a String of key/value entries for vfModuleParams
243 protected String buildVfModuleParams(String vnfParams, String sdncGetResponse, String vnfId, String vnfName,
244 String vfModuleId, String vfModuleName) {
246 //Get SDNC Response Data
248 String data = utils.getNodeXml(sdncGetResponse, "response-data")
249 data = data.replaceAll("<", "<")
250 data = data.replaceAll(">", ">")
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.getNodeText1(serviceData, "vnf-id")
266 <value>${vnfId}</value>
270 <value>${vnfName}</value>
273 <key>vf_module_id</key>
274 <value>${vfModuleId}</value>
277 <key>vf_module_name</key>
278 <value>${vfModuleName}</value>
281 utils.logAudit("vnfInfo: " + vnfInfo)
282 InputSource source = new InputSource(new StringReader(data));
283 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
284 docFactory.setNamespaceAware(true)
285 DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
286 Document responseXml = docBuilder.parse(source)
289 // Availability Zones Data
291 StringBuilder sbAZone = new StringBuilder()
292 NodeList aZonesList = responseXml.getElementsByTagNameNS("*", "availability-zones")
293 String aZonePosition = "0"
294 for (int z = 0; z < aZonesList.getLength(); z++) {
295 Node node = aZonesList.item(z)
296 if (node.getNodeType() == Node.ELEMENT_NODE) {
297 Element eElement = (Element) node
298 String aZoneValue = utils.getElementText(eElement, "availability-zone")
299 aZonePosition = z.toString()
302 <key>availability_zone_${aZonePosition}</key>
303 <value>${aZoneValue}</value>
305 aZones = sbAZone.append(aZoneXml)
310 String vnfNetworkNetId = ""
311 String vnfNetworkNetName = ""
312 String vnfNetworkSubNetId = ""
313 String vnfNetworkV6SubNetId = ""
314 String vnfNetworkNetFqdn = ""
315 StringBuilder sbNet = new StringBuilder()
316 StringBuilder sbNet2 = new StringBuilder()
317 StringBuilder sbNet3 = new StringBuilder()
318 StringBuilder sbNet4 = new StringBuilder()
319 StringBuilder sbNet5 = new StringBuilder()
320 NodeList vnfNetworkList = responseXml.getElementsByTagNameNS("*", "vnf-networks")
321 for (int x = 0; x < vnfNetworkList.getLength(); x++) {
322 Node node = vnfNetworkList.item(x)
323 if (node.getNodeType() == Node.ELEMENT_NODE) {
324 Element eElement = (Element) node
325 String vnfNetworkKey = utils.getElementText(eElement, "network-role")
326 String vnfNetworkNeutronIdValue = utils.getElementText(eElement, "neutron-id")
327 String vnfNetworkNetNameValue = utils.getElementText(eElement, "network-name")
328 String vnfNetworkSubNetIdValue = utils.getElementText(eElement, "subnet-id")
329 String vnfNetworkV6SubNetIdValue = utils.getElementText(eElement, "ipv6-subnet-id")
330 String vnfNetworkNetFqdnValue = utils.getElementText(eElement, "contrail-network-fqdn")
331 String vnfNetworkNetIdXml =
333 <key>${vnfNetworkKey}_net_id</key>
334 <value>${vnfNetworkNeutronIdValue}</value>
336 vnfNetworkNetId = sbNet.append(vnfNetworkNetIdXml)
337 String vnfNetworkNetNameXml =
339 <key>${vnfNetworkKey}_net_name</key>
340 <value>${vnfNetworkNetNameValue}</value>
342 vnfNetworkNetName = sbNet2.append(vnfNetworkNetNameXml)
343 String vnfNetworkSubNetIdXml =
345 <key>${vnfNetworkKey}_subnet_id</key>
346 <value>${vnfNetworkSubNetIdValue}</value>
348 vnfNetworkSubNetId = sbNet3.append(vnfNetworkSubNetIdXml)
349 String vnfNetworkV6SubNetIdXml =
351 <key>${vnfNetworkKey}_v6_subnet_id</key>
352 <value>${vnfNetworkV6SubNetIdValue}</value>
354 vnfNetworkV6SubNetId = sbNet5.append(vnfNetworkV6SubNetIdXml)
355 String vnfNetworkNetFqdnXml =
357 <key>${vnfNetworkKey}_net_fqdn</key>
358 <value>${vnfNetworkNetFqdnValue}</value>
360 vnfNetworkNetFqdn = sbNet4.append(vnfNetworkNetFqdnXml)
366 String vnfVMSPositions = ""
367 String vmNetworks = ""
368 String vmNetworksPositions = ""
369 String vmNetworksPositionsV6 = ""
370 String interfaceRoutePrefixes = ""
376 def floatingIPKeyValue
378 def floatingIPV6KeyValue
379 StringBuilder sb = new StringBuilder()
380 StringBuilder sbPositions = new StringBuilder()
381 StringBuilder sbVmNetworks = new StringBuilder()
382 StringBuilder sbNetworksPositions = new StringBuilder()
383 StringBuilder sbInterfaceRoutePrefixes = new StringBuilder()
384 StringBuilder sbNetworksPositionsV6 = new StringBuilder()
386 NodeList vmsList = responseXml.getElementsByTagNameNS("*","vnf-vms")
387 for (int x = 0; x < vmsList.getLength(); x++) {
388 Node node = vmsList.item(x)
389 if (node.getNodeType() == Node.ELEMENT_NODE) {
390 Element eElement = (Element) node
391 key = utils.getElementText(eElement, "vm-type")
393 String position = "0"
394 StringBuilder sb1 = new StringBuilder()
395 NodeList valueList = eElement.getElementsByTagNameNS("*","vm-names")
396 NodeList vmNetworksList = eElement.getElementsByTagNameNS("*","vm-networks")
397 for(int i = 0; i < valueList.getLength(); i++){
398 Node node1 = valueList.item(i)
399 if (node1.getNodeType() == Node.ELEMENT_NODE) {
400 Element eElement1 = (Element) node1
401 value = utils.getElementText(eElement1, "vm-name")
402 if (i != valueList.getLength() - 1) {
403 values = sb1.append(value + ",")
406 values = sb1.append(value);
408 position = i.toString()
409 String vnfPositionXml =
411 <key>${key}_name_${position}</key>
412 <value>${value}</value>
414 vnfVMSPositions = sbPositions.append(vnfPositionXml)
417 for(int n = 0; n < vmNetworksList.getLength(); n++){
418 String floatingIpKeyValueStr = ""
419 String floatingIpV6KeyValueStr = ""
420 Node nodeNetworkKey = vmNetworksList.item(n)
421 if (nodeNetworkKey.getNodeType() == Node.ELEMENT_NODE) {
422 Element eElementNetworkKey = (Element) nodeNetworkKey
423 String ipAddressValues
424 String ipV6AddressValues
425 String networkPosition = "0"
426 StringBuilder sb2 = new StringBuilder()
427 StringBuilder sb3 = new StringBuilder()
428 StringBuilder sb4 = new StringBuilder()
429 networkKey = utils.getElementText(eElementNetworkKey, "network-role")
430 floatingIPKey = key + '_' + networkKey + '_floating_ip'
431 floatingIPKeyValue = utils.getElementText(eElementNetworkKey, "floating-ip")
432 if(!floatingIPKeyValue.isEmpty()){
433 floatingIpKeyValueStr = """<entry>
434 <key>$floatingIPKey</key>
435 <value>$floatingIPKeyValue</value>
438 floatingIPV6Key = key + '_' + networkKey + '_floating_v6_ip'
439 floatingIPV6KeyValue = utils.getElementText(eElementNetworkKey, "floating-ip-v6")
440 if(!floatingIPV6KeyValue.isEmpty()){
441 floatingIpV6KeyValueStr = """<entry>
442 <key>$floatingIPV6Key</key>
443 <value>$floatingIPV6KeyValue</value>
446 NodeList networkIpsList = eElementNetworkKey.getElementsByTagNameNS("*","network-ips")
447 for(int a = 0; a < networkIpsList.getLength(); a++){
448 Node ipAddress = networkIpsList.item(a)
449 if (ipAddress.getNodeType() == Node.ELEMENT_NODE) {
450 Element eElementIpAddress = (Element) ipAddress
451 String ipAddressValue = utils.getElementText(eElementIpAddress, "ip-address")
452 if (a != networkIpsList.getLength() - 1) {
453 ipAddressValues = sb2.append(ipAddressValue + ",")
456 ipAddressValues = sb2.append(ipAddressValue);
458 networkPosition = a.toString()
459 String vmNetworksPositionsXml =
461 <key>${key}_${networkKey}_ip_${networkPosition}</key>
462 <value>${ipAddressValue}</value>
464 vmNetworksPositions = sbNetworksPositions.append(vmNetworksPositionsXml)
467 vmNetworksPositions = sbNetworksPositions.append(floatingIpKeyValueStr).append(floatingIpV6KeyValueStr)
469 String vmNetworksXml =
471 <key>${key}_${networkKey}_ips</key>
472 <value>${ipAddressValues}</value>
474 vmNetworks = sbVmNetworks.append(vmNetworksXml)
476 NodeList interfaceRoutePrefixesList = eElementNetworkKey.getElementsByTagNameNS("*","interface-route-prefixes")
477 String interfaceRoutePrefixValues = sb3.append("[")
479 for(int a = 0; a < interfaceRoutePrefixesList.getLength(); a++){
480 Node interfaceRoutePrefix = interfaceRoutePrefixesList.item(a)
481 if (interfaceRoutePrefix.getNodeType() == Node.ELEMENT_NODE) {
482 Element eElementInterfaceRoutePrefix = (Element) interfaceRoutePrefix
483 String interfaceRoutePrefixValue = utils.getElementText(eElementInterfaceRoutePrefix, "interface-route-prefix")
484 if (a != interfaceRoutePrefixesList.getLength() - 1) {
485 interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}" + ",")
488 interfaceRoutePrefixValues = sb3.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}")
492 interfaceRoutePrefixValues = sb3.append("]")
493 if (interfaceRoutePrefixesList.getLength() > 0) {
494 String interfaceRoutePrefixesXml =
496 <key>${key}_${networkKey}_route_prefixes</key>
497 <value>${interfaceRoutePrefixValues}</value>
499 interfaceRoutePrefixes = sbInterfaceRoutePrefixes.append(interfaceRoutePrefixesXml)
502 NodeList networkIpsV6List = eElementNetworkKey.getElementsByTagNameNS("*","network-ips-v6")
503 for(int a = 0; a < networkIpsV6List.getLength(); a++){
504 Node ipV6Address = networkIpsV6List.item(a)
505 if (ipV6Address.getNodeType() == Node.ELEMENT_NODE) {
506 Element eElementIpV6Address = (Element) ipV6Address
507 String ipV6AddressValue = utils.getElementText(eElementIpV6Address, "ip-address-ipv6")
508 if (a != networkIpsV6List.getLength() - 1) {
509 ipV6AddressValues = sb4.append(ipV6AddressValue + ",")
512 ipV6AddressValues = sb4.append(ipV6AddressValue);
514 networkPosition = a.toString()
515 String vmNetworksPositionsV6Xml =
517 <key>${key}_${networkKey}_v6_ip_${networkPosition}</key>
518 <value>${ipV6AddressValue}</value>
520 vmNetworksPositionsV6 = sbNetworksPositionsV6.append(vmNetworksPositionsV6Xml)
523 String vmNetworksV6Xml =
525 <key>${key}_${networkKey}_v6_ips</key>
526 <value>${ipV6AddressValues}</value>
528 vmNetworks = sbVmNetworks.append(vmNetworksV6Xml)
533 <key>${key}_names</key>
534 <value>${values}</value>
536 vnfVMS = sb.append(vnfXml)
539 //SDNC Response Params
540 String sdncResponseParams = ""
541 List<String> sdncResponseParamsToSkip = ["vnf_id", "vf_module_id", "vnf_name", "vf_module_name"]
542 String vnfParamsChildNodes = utils.getChildNodes(data, "vnf-parameters")
543 if(vnfParamsChildNodes == null || vnfParamsChildNodes.length() < 1){
546 NodeList paramsList = responseXml.getElementsByTagNameNS("*", "vnf-parameters")
547 for (int z = 0; z < paramsList.getLength(); z++) {
548 Node node = paramsList.item(z)
549 Element eElement = (Element) node
550 String vnfParameterName = utils.getElementText(eElement, "vnf-parameter-name")
551 if (!sdncResponseParamsToSkip.contains(vnfParameterName)) {
552 String vnfParameterValue = utils.getElementText(eElement, "vnf-parameter-value")
555 <key>${vnfParameterName}</key>
556 <value>${vnfParameterValue}</value>
558 sdncResponseParams = sb.append(paraEntry)
564 def vfModuleParams = """
569 ${vnfNetworkSubNetId}
570 ${vnfNetworkV6SubNetId}
575 ${vmNetworksPositions}
576 ${vmNetworksPositionsV6}
577 ${interfaceRoutePrefixes}
579 ${sdncResponseParams}"""
581 return vfModuleParams