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.onap.so.bpmn.common.scripts
23 import groovy.json.JsonBuilder
24 import groovy.json.JsonSlurper
26 import org.json.JSONObject
28 import org.onap.so.bpmn.core.xml.XmlTool
29 import org.onap.so.logger.MsoLogger
30 import org.onap.so.logger.MessageEnum
34 private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VidUtils.class);
36 public MsoUtils utils = new MsoUtils()
37 private AbstractServiceTaskProcessor taskProcessor
39 public VidUtils(AbstractServiceTaskProcessor taskProcessor) {
40 this.taskProcessor = taskProcessor
44 * Create a volume-request XML using a JSON string
45 * @param jsonReq - JSON request from VID
49 public String createXmlVolumeRequest(String jsonReq, String action, String serviceInstanceId) {
50 def jsonSlurper = new JsonSlurper()
52 Map reqMap = jsonSlurper.parseText(jsonReq)
53 return createXmlVolumeRequest(reqMap, action, serviceInstanceId)
61 * Create a volume-request XML using a map
62 * @param requestMap - map created from VID JSON
64 * @param serviceInstanceId
67 public String createXmlVolumeRequest(Map requestMap, String action, String serviceInstanceId) {
68 createXmlVolumeRequest(requestMap, action, serviceInstanceId, '')
73 * Create a volume-request XML using a map
76 * @param serviceInstanceId
77 * @param volumeGroupId
80 public String createXmlVolumeRequest(Map requestMap, String action, String serviceInstanceId, String volumeGroupId) {
83 def modelCustomizationName = ''
84 def asdcServiceModelVersion = ''
86 def suppressRollback = requestMap.requestDetails.requestInfo.suppressRollback
88 def backoutOnFailure = ""
89 if(suppressRollback != null){
90 if ( suppressRollback == true) {
91 backoutOnFailure = "false"
92 } else if ( suppressRollback == false) {
93 backoutOnFailure = "true"
97 def volGrpName = requestMap.requestDetails.requestInfo?.instanceName ?: ''
98 def serviceId = requestMap.requestDetails.requestParameters?.serviceId ?: ''
99 def relatedInstanceList = requestMap.requestDetails.relatedInstanceList
100 relatedInstanceList.each {
101 if (it.relatedInstance.modelInfo?.modelType == 'service') {
102 serviceName = it.relatedInstance.modelInfo?.modelName
103 asdcServiceModelVersion = it.relatedInstance.modelInfo?.modelVersion
105 if (it.relatedInstance.modelInfo?.modelType == 'vnf') {
106 modelCustomizationName = it.relatedInstance.modelInfo?.modelInstanceName
110 vnfType = serviceName + '/' + modelCustomizationName
112 def userParams = requestMap.requestDetails?.requestParameters?.userParams
113 def userParamsNode = ''
114 if(userParams != null) {
115 userParamsNode = buildUserParams(userParams)
117 def modelCustomizationId = requestMap.requestDetails?.modelInfo?.modelCustomizationUuid ?: ''
120 <volume-request xmlns="http://www.w3.org/2001/XMLSchema">
122 <action>${MsoUtils.xmlEscape(action)}</action>
123 <source>${MsoUtils.xmlEscape(requestMap.requestDetails.requestInfo.source)}</source>
124 <service-instance-id>${MsoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
127 <volume-group-id>${MsoUtils.xmlEscape(volumeGroupId)}</volume-group-id>
128 <volume-group-name>${MsoUtils.xmlEscape(volGrpName)}</volume-group-name>
129 <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
130 <vf-module-model-name>${MsoUtils.xmlEscape(requestMap.requestDetails.modelInfo.modelName)}</vf-module-model-name>
131 <asdc-service-model-version>${MsoUtils.xmlEscape(asdcServiceModelVersion)}</asdc-service-model-version>
132 <aic-cloud-region>${MsoUtils.xmlEscape(requestMap.requestDetails.cloudConfiguration.lcpCloudRegionId)}</aic-cloud-region>
133 <tenant-id>${MsoUtils.xmlEscape(requestMap.requestDetails.cloudConfiguration.tenantId)}</tenant-id>
134 <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
135 <backout-on-failure>${MsoUtils.xmlEscape(backoutOnFailure)}</backout-on-failure>
136 <model-customization-id>${MsoUtils.xmlEscape(modelCustomizationId)}</model-customization-id>
143 // return a pretty-print of the volume-request xml without the preamble
144 return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "")
148 * A common method that can be used to build volume-params node from a map.
149 * @param Map userParams
152 public String buildUserParams(userParams) {
153 if (userParams == null) return ""
157 userParams.each {it ->
158 key = it.name.replaceAll(/\B[A-Z]/) { '_' + it }.toLowerCase()
160 xml += "<param name=\"${key}\">${MsoUtils.xmlEscape(value)}</param>"
167 * A common method that can be used to extract 'requestDetails'
169 * @return String json requestDetails
172 public getJsonRequestDetails(String jsonInput) {
174 if (jsonInput.isEmpty() || jsonInput == null) {
177 def jsonMapObject = new JsonSlurper().parseText(jsonInput)
178 if (jsonMapObject instanceof Map) {
179 String jsonString = new JsonBuilder(jsonMapObject.requestDetails)
180 rtn = '{'+"requestDetails"+":"+jsonString+'}'
189 * A common method that can be used to extract 'requestDetails' in Xml
191 * @return String xml requestDetails
194 public getJsonRequestDetailstoXml(String jsonInput) {
196 def jsonString = getJsonRequestDetails(jsonInput)
197 if (jsonString == null) {
200 JSONObject jsonObj = new JSONObject(jsonString)
201 return XmlTool.normalize(XML.toString(jsonObj))
206 * Create a network-request XML using a map
208 * @param xmlRequestDetails - requestDetails in xml
210 * Note: See latest version: createXmlNetworkRequestInstance()
213 public String createXmlNetworkRequestInfra(execution, def networkJsonIncoming) {
215 def requestId = execution.getVariable("requestId")
216 def serviceInstanceId = execution.getVariable("serviceInstanceId")
217 def requestAction = execution.getVariable("requestAction")
218 def networkId = (execution.getVariable("networkId")) != null ? execution.getVariable("networkId") : ""
220 def jsonSlurper = new JsonSlurper()
222 Map reqMap = jsonSlurper.parseText(networkJsonIncoming)
223 def instanceName = reqMap.requestDetails.requestInfo.instanceName
224 def modelCustomizationId = reqMap.requestDetails.modelInfo.modelCustomizationId
225 if (modelCustomizationId == null) {
226 modelCustomizationId = reqMap.requestDetails.modelInfo.modelCustomizationUuid !=null ?
227 reqMap.requestDetails.modelInfo.modelCustomizationUuid : ""
229 def modelName = reqMap.requestDetails.modelInfo.modelName
230 def lcpCloudRegionId = reqMap.requestDetails.cloudConfiguration.lcpCloudRegionId
231 def tenantId = reqMap.requestDetails.cloudConfiguration.tenantId
232 def serviceId = reqMap.requestDetails.requestInfo.productFamilyId
233 def suppressRollback = reqMap.requestDetails.requestInfo.suppressRollback.toString()
234 def backoutOnFailure = "true"
235 if(suppressRollback != null){
236 if (suppressRollback == true || suppressRollback == "true") {
237 backoutOnFailure = "false"
238 } else if (suppressRollback == false || suppressRollback == "false") {
239 backoutOnFailure = "true"
243 //def userParams = reqMap.requestDetails.requestParameters.userParams
244 //def userParamsNode = buildUserParams(userParams)
245 def userParams = reqMap.requestDetails?.requestParameters?.userParams
246 def userParamsNode = ''
247 if(userParams != null) {
248 userParamsNode = buildUserParams(userParams)
251 //'sdncVersion' = current, '1610' (non-RPC SDNC) or '1702' (RPC SDNC)
252 def sdncVersion = execution.getVariable("sdncVersion")
255 <network-request xmlns="http://www.w3.org/2001/XMLSchema">
257 <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
258 <action>${MsoUtils.xmlEscape(requestAction)}</action>
260 <service-instance-id>${MsoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
263 <network-id>${MsoUtils.xmlEscape(networkId)}</network-id>
264 <network-name>${MsoUtils.xmlEscape(instanceName)}</network-name>
265 <network-type>${MsoUtils.xmlEscape(modelName)}</network-type>
266 <modelCustomizationId>${MsoUtils.xmlEscape(modelCustomizationId)}</modelCustomizationId>
267 <aic-cloud-region>${MsoUtils.xmlEscape(lcpCloudRegionId)}</aic-cloud-region>
268 <tenant-id>${MsoUtils.xmlEscape(tenantId)}</tenant-id>
269 <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
270 <backout-on-failure>${MsoUtils.xmlEscape(backoutOnFailure)}</backout-on-failure>
271 <sdncVersion>${MsoUtils.xmlEscape(sdncVersion)}</sdncVersion>
278 // return a pretty-print of the volume-request xml without the preamble
279 return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "")
281 } catch(Exception e) {
282 msoLogger.debug("Error in Vid Utils",e.getCause())
289 * Create a network-request XML using a map,
293 public String createXmlNetworkRequestInstance(execution) {
295 def networkModelUuid = ""
296 def networkModelName = ""
297 def networkModelVersion = ""
298 def networkModelCustomizationUuid = ""
299 def networkModelInvariantUuid = ""
301 // verify the DB Catalog response JSON structure
302 def networkModelInfo = execution.getVariable("networkModelInfo")
303 def jsonSlurper = new JsonSlurper()
304 if (networkModelInfo != null) {
306 Map modelMap = jsonSlurper.parseText(networkModelInfo)
307 if (modelMap != null) {
308 if (networkModelInfo.contains("modelUuid")) {
309 networkModelUuid = modelMap.modelUuid !=null ? modelMap.modelUuid : ""
311 if (networkModelInfo.contains("modelName")) {
312 networkModelName = modelMap.modelName !=null ? modelMap.modelName : ""
314 if (networkModelInfo.contains("modelVersion")) {
315 networkModelVersion = modelMap.modelVersion !=null ? modelMap.modelVersion : ""
317 if (networkModelInfo.contains("modelCustomizationUuid")) {
318 networkModelCustomizationUuid = modelMap.modelCustomizationUuid !=null ? modelMap.modelCustomizationUuid : ""
320 if (networkModelInfo.contains("modelInvariantUuid")) {
321 networkModelInvariantUuid = modelMap.modelInvariantUuid !=null ? modelMap.modelInvariantUuid : ""
324 } catch (Exception ex) {
329 def serviceModelUuid = ""
330 def serviceModelName = ""
331 def serviceModelVersion = ""
332 def serviceModelCustomizationUuid = ""
333 def serviceModelInvariantUuid = ""
335 // verify the DB Catalog response JSON structure
336 def serviceModelInfo = execution.getVariable("serviceModelInfo")
337 def jsonServiceSlurper = new JsonSlurper()
338 if (serviceModelInfo != null) {
340 Map modelMap = jsonServiceSlurper.parseText(serviceModelInfo)
341 if (modelMap != null) {
342 if (serviceModelInfo.contains("modelUuid")) {
343 serviceModelUuid = modelMap.modelUuid !=null ? modelMap.modelUuid : ""
345 if (serviceModelInfo.contains("modelName")) {
346 serviceModelName = modelMap.modelName !=null ? modelMap.modelName : ""
348 if (serviceModelInfo.contains("modelVersion")) {
349 serviceModelVersion = modelMap.modelVersion !=null ? modelMap.modelVersion : ""
351 if (serviceModelInfo.contains("modelCustomizationUuid")) {
352 serviceModelCustomizationUuid = modelMap.modelCustomizationUuid !=null ? modelMap.modelCustomizationUuid : ""
354 if (serviceModelInfo.contains("modelInvariantUuid")) {
355 serviceModelInvariantUuid = modelMap.modelInvariantUuid !=null ? modelMap.modelInvariantUuid : ""
358 } catch (Exception ex) {
364 def subscriptionServiceType = execution.getVariable("subscriptionServiceType") != null ? execution.getVariable("subscriptionServiceType") : ""
365 def globalSubscriberId = execution.getVariable("globalSubscriberId") != null ? execution.getVariable("globalSubscriberId") : ""
366 def requestId = execution.getVariable("msoRequestId")
367 def serviceInstanceId = execution.getVariable("serviceInstanceId") != null ? execution.getVariable("serviceInstanceId") : ""
368 def networkId = (execution.getVariable("networkId")) != null ? execution.getVariable("networkId") : "" // optional
369 def networkName = execution.getVariable("networkName") != null ? execution.getVariable("networkName") : "" // optional
370 def aicCloudReqion = execution.getVariable("lcpCloudRegionId") != null ? execution.getVariable("lcpCloudRegionId") : ""
371 def tenantId = execution.getVariable("tenantId") != null ? execution.getVariable("tenantId") : ""
372 def serviceId = execution.getVariable("productFamilyId") != null ? execution.getVariable("productFamilyId") : ""
373 def failIfExist = execution.getVariable("failIfExists") != null ? execution.getVariable("failIfExists") : ""
374 def suppressRollback = execution.getVariable("disableRollback")
375 def backoutOnFailure = "true"
376 if(suppressRollback != null){
377 if (suppressRollback == true || suppressRollback == "true") {
378 backoutOnFailure = "false"
379 } else if (suppressRollback == false || suppressRollback == "false") {
380 backoutOnFailure = "true"
384 //'sdncVersion' = current, '1610' (non-RPC SDNC) or '1702' (RPC SDNC)
385 def sdncVersion = execution.getVariable("sdncVersion")
388 def action = execution.getVariable("action")
390 def userParamsNode = ""
391 def userParams = execution.getVariable("networkInputParams")
392 if(userParams != null) {
393 userParamsNode = buildUserParams(userParams)
397 <network-request xmlns="http://www.w3.org/2001/XMLSchema">
399 <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
400 <action>${MsoUtils.xmlEscape(action)}</action>
401 <source>${MsoUtils.xmlEscape(source)}</source>
402 <service-instance-id>${MsoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
405 <network-id>${MsoUtils.xmlEscape(networkId)}</network-id>
406 <network-name>${MsoUtils.xmlEscape(networkName)}</network-name>
407 <network-type>${MsoUtils.xmlEscape(networkModelName)}</network-type>
408 <subscription-service-type>${MsoUtils.xmlEscape(subscriptionServiceType)}</subscription-service-type>
409 <global-customer-id>${MsoUtils.xmlEscape(globalSubscriberId)}</global-customer-id>
410 <aic-cloud-region>${MsoUtils.xmlEscape(aicCloudReqion)}</aic-cloud-region>
411 <tenant-id>${MsoUtils.xmlEscape(tenantId)}</tenant-id>
412 <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
413 <backout-on-failure>${MsoUtils.xmlEscape(backoutOnFailure)}</backout-on-failure>
414 <failIfExist>${MsoUtils.xmlEscape(failIfExist)}</failIfExist>
416 <modelName>${MsoUtils.xmlEscape(networkModelName)}</modelName>
417 <modelUuid>${MsoUtils.xmlEscape(networkModelUuid)}</modelUuid>
418 <modelInvariantUuid>${MsoUtils.xmlEscape(networkModelInvariantUuid)}</modelInvariantUuid>
419 <modelVersion>${MsoUtils.xmlEscape(networkModelVersion)}</modelVersion>
420 <modelCustomizationUuid>${MsoUtils.xmlEscape(networkModelCustomizationUuid)}</modelCustomizationUuid>
423 <modelName>${MsoUtils.xmlEscape(serviceModelName)}</modelName>
424 <modelUuid>${MsoUtils.xmlEscape(serviceModelUuid)}</modelUuid>
425 <modelInvariantUuid>${MsoUtils.xmlEscape(serviceModelInvariantUuid)}</modelInvariantUuid>
426 <modelVersion>${MsoUtils.xmlEscape(serviceModelVersion)}</modelVersion>
427 <modelCustomizationUuid>${MsoUtils.xmlEscape(serviceModelCustomizationUuid)}</modelCustomizationUuid>
430 <sdncVersion>${MsoUtils.xmlEscape(sdncVersion)}</sdncVersion>
437 // return a pretty-print of the volume-request xml without the preamble
438 return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "")
443 * Create a vnf-request XML using a map
444 * @param requestMap - map created from VID JSON
448 public String createXmlVfModuleRequest(execution, Map requestMap, String action, String serviceInstanceId) {
450 //def relatedInstanceList = requestMap.requestDetails.relatedInstanceList
452 //relatedInstanceList.each {
453 // if (it.relatedInstance.modelInfo.modelType == 'vnf') {
454 // vnfType = it.relatedInstance.modelInfo.modelName
455 // vnfId = it.relatedInstance.modelInfo.modelInvariantId
460 def asdcServiceModelInfo = ''
462 def relatedInstanceList = requestMap.requestDetails?.relatedInstanceList
465 if (relatedInstanceList != null) {
466 relatedInstanceList.each {
467 if (it.relatedInstance.modelInfo?.modelType == 'service') {
468 asdcServiceModelInfo = it.relatedInstance.modelInfo?.modelVersion
470 if (it.relatedInstance.modelInfo.modelType == 'vnf') {
471 vnfName = it.relatedInstance.instanceName ?: ''
476 def vnfType = execution.getVariable('vnfType')
477 def vnfId = execution.getVariable('vnfId')
479 def vfModuleId = execution.getVariable('vfModuleId')
480 def volumeGroupId = execution.getVariable('volumeGroupId')
481 def userParams = requestMap.requestDetails?.requestParameters?.userParams
484 def userParamsNode = ''
485 if(userParams != null) {
486 userParamsNode = buildUserParams(userParams)
489 def isBaseVfModule = "false"
490 if (execution.getVariable('isBaseVfModule') == true) {
491 isBaseVfModule = "true"
494 def requestId = execution.getVariable("mso-request-id")
495 def vfModuleName = requestMap.requestDetails?.requestInfo?.instanceName ?: ''
496 def vfModuleModelName = requestMap.requestDetails?.modelInfo?.modelName ?: ''
497 def suppressRollback = requestMap.requestDetails?.requestInfo?.suppressRollback
499 def backoutOnFailure = ""
500 if(suppressRollback != null){
501 if ( suppressRollback == true) {
502 backoutOnFailure = "false"
503 } else if ( suppressRollback == false) {
504 backoutOnFailure = "true"
508 def serviceId = requestMap.requestDetails?.requestParameters?.serviceId ?: ''
509 def aicCloudRegion = requestMap.requestDetails?.cloudConfiguration?.lcpCloudRegionId ?: ''
510 def tenantId = requestMap.requestDetails?.cloudConfiguration?.tenantId ?: ''
511 def personaModelId = requestMap.requestDetails?.modelInfo?.modelInvariantUuid ?: ''
512 def personaModelVersion = requestMap.requestDetails?.modelInfo?.modelUuid ?: ''
513 def modelCustomizationId = requestMap.requestDetails?.modelInfo?.modelCustomizationUuid ?: ''
518 <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
519 <action>${MsoUtils.xmlEscape(action)}</action>
521 <service-instance-id>${MsoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
524 <!-- not in use in 1610 -->
525 <vnf-name>${MsoUtils.xmlEscape(vnfName)}</vnf-name>
526 <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
527 <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
528 <volume-group-id>${MsoUtils.xmlEscape(volumeGroupId)}</volume-group-id>
529 <vf-module-id>${MsoUtils.xmlEscape(vfModuleId)}</vf-module-id>
530 <vf-module-name>${MsoUtils.xmlEscape(vfModuleName)}</vf-module-name>
531 <vf-module-model-name>${MsoUtils.xmlEscape(vfModuleModelName)}</vf-module-model-name>
532 <model-customization-id>${MsoUtils.xmlEscape(modelCustomizationId)}</model-customization-id>
533 <is-base-vf-module>${MsoUtils.xmlEscape(isBaseVfModule)}</is-base-vf-module>
534 <asdc-service-model-version>${MsoUtils.xmlEscape(asdcServiceModelInfo)}</asdc-service-model-version>
535 <aic-cloud-region>${MsoUtils.xmlEscape(aicCloudRegion)}</aic-cloud-region>
536 <tenant-id>${MsoUtils.xmlEscape(tenantId)}</tenant-id>
537 <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
538 <backout-on-failure>${MsoUtils.xmlEscape(backoutOnFailure)}</backout-on-failure>
539 <persona-model-id>${MsoUtils.xmlEscape(personaModelId)}</persona-model-id>
540 <persona-model-version>${MsoUtils.xmlEscape(personaModelVersion)}</persona-model-version>
548 // return a pretty-print of the volume-request xml without the preamble
549 return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "")