Containerization feature of SO
[so.git] / bpmn / MSOCommonBPMN / src / main / groovy / org / onap / so / bpmn / common / scripts / VidUtils.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 groovy.json.JsonBuilder
24 import groovy.json.JsonSlurper
25
26 import org.json.JSONObject
27 import org.json.XML
28 import org.onap.so.bpmn.core.xml.XmlTool
29 import org.onap.so.logger.MsoLogger
30 import org.onap.so.logger.MessageEnum
31
32
33 class VidUtils {
34         private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VidUtils.class);
35         
36         public MsoUtils utils = new MsoUtils()
37         private AbstractServiceTaskProcessor taskProcessor
38
39         public VidUtils(AbstractServiceTaskProcessor taskProcessor) {
40                 this.taskProcessor = taskProcessor
41         }
42         
43         /**
44          * Create a volume-request XML using a JSON string
45          * @param jsonReq - JSON request from VID
46          * @param action
47          * @return
48          */
49         public String createXmlVolumeRequest(String jsonReq, String action, String serviceInstanceId) {
50                 def jsonSlurper = new JsonSlurper()
51                 try{
52                         Map reqMap = jsonSlurper.parseText(jsonReq)
53                         return createXmlVolumeRequest(reqMap, action, serviceInstanceId)
54                 }
55                 catch(Exception e) {
56                         throw e
57                 }
58         }
59
60         /**
61          * Create a volume-request XML using a map
62          * @param requestMap - map created from VID JSON
63          * @param action
64          * @param serviceInstanceId
65          * @return
66          */
67         public String createXmlVolumeRequest(Map requestMap, String action, String serviceInstanceId) {
68                 createXmlVolumeRequest(requestMap, action, serviceInstanceId, '')
69         }
70         
71
72         /**
73          * Create a volume-request XML using a map
74          * @param requestMap
75          * @param action
76          * @param serviceInstanceId
77          * @param volumeGroupId
78          * @return
79          */
80         public String createXmlVolumeRequest(Map requestMap, String action, String serviceInstanceId, String volumeGroupId) {
81                 def vnfType = ''
82                 def serviceName = ''
83                 def modelCustomizationName = ''
84                 def asdcServiceModelVersion = ''
85                 
86                 def suppressRollback = requestMap.requestDetails.requestInfo.suppressRollback
87                 
88                 def backoutOnFailure = ""
89                 if(suppressRollback != null){
90                         if ( suppressRollback == true) {
91                                 backoutOnFailure = "false"
92                         } else if ( suppressRollback == false) {
93                                 backoutOnFailure = "true"
94                         }
95                 }
96                 
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
104                         }
105                         if (it.relatedInstance.modelInfo?.modelType == 'vnf') {
106                                 modelCustomizationName = it.relatedInstance.modelInfo?.modelInstanceName
107                         }
108                 }
109                 
110                 vnfType = serviceName + '/' + modelCustomizationName
111                 
112                 def userParams = requestMap.requestDetails?.requestParameters?.userParams
113                 def userParamsNode = ''
114                 if(userParams != null) {
115                         userParamsNode = buildUserParams(userParams)
116                 }
117                 def modelCustomizationId = requestMap.requestDetails?.modelInfo?.modelCustomizationUuid ?: ''
118                 
119                 def xmlReq = """
120                 <volume-request xmlns="http://www.w3.org/2001/XMLSchema">
121                         <request-info>
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>
125                         </request-info>
126                         <volume-inputs>
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>
137                         </volume-inputs>
138                         <volume-params>
139                                 $userParamsNode
140                         </volume-params>
141                 </volume-request>
142                 """
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]*)?", "") 
145         }
146         
147         /**
148          * A common method that can be used to build volume-params node from a map. 
149          * @param Map userParams
150          * @return
151          */
152         public String buildUserParams(userParams) {
153                 if (userParams == null) return ""
154                 def xml = ""
155                 def key = ""
156                 def value = ""
157                 userParams.each {it ->
158                         key = it.name.replaceAll(/\B[A-Z]/) { '_' + it }.toLowerCase()
159                         value = it.value
160                         xml += "<param name=\"${key}\">${MsoUtils.xmlEscape(value)}</param>"
161                 }
162
163                 return xml
164         }
165
166         /**
167          * A common method that can be used to extract 'requestDetails' 
168          * @param String json
169          * @return String json requestDetails  
170          */
171         @Deprecated
172         public getJsonRequestDetails(String jsonInput) {
173                 String rtn = ""
174                 if (jsonInput.isEmpty() || jsonInput == null) {
175                         return rtn
176                 } else {
177                         def jsonMapObject = new JsonSlurper().parseText(jsonInput)
178                         if (jsonMapObject instanceof Map) {
179                                 String jsonString = new JsonBuilder(jsonMapObject.requestDetails)
180                                 rtn = '{'+"requestDetails"+":"+jsonString+'}'
181                                 return rtn
182                         } else {
183                             return rtn
184                         }       
185                 }
186         }
187         
188         /**
189          * A common method that can be used to extract 'requestDetails' in Xml
190          * @param String json
191          * @return String xml requestDetails
192          */
193         @Deprecated
194         public getJsonRequestDetailstoXml(String jsonInput) {
195                 String rtn = null
196                 def jsonString = getJsonRequestDetails(jsonInput)
197                 if (jsonString == null) {
198                         return rtn
199                 } else {
200                     JSONObject jsonObj = new JSONObject(jsonString)
201                         return XmlTool.normalize(XML.toString(jsonObj))
202                 }
203         }
204         
205         /**
206          * Create a network-request XML using a map
207          * @param execution 
208          * @param xmlRequestDetails - requestDetails in xml 
209          * @return
210          * Note: See latest version: createXmlNetworkRequestInstance()
211          */
212
213         public String createXmlNetworkRequestInfra(execution, def networkJsonIncoming) {
214         
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") : ""
219                 
220                 def jsonSlurper = new JsonSlurper()
221                 try {
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 : ""
228                         }
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"
240                                 }
241                         }
242                 
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)
249                         }
250                         
251                         //'sdncVersion' = current, '1610' (non-RPC SDNC) or '1702' (RPC SDNC)
252                         def sdncVersion =  execution.getVariable("sdncVersion")
253                         
254                         def xmlReq = """
255                         <network-request xmlns="http://www.w3.org/2001/XMLSchema"> 
256                          <request-info> 
257                     <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
258                                 <action>${MsoUtils.xmlEscape(requestAction)}</action> 
259                                 <source>VID</source> 
260                                 <service-instance-id>${MsoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
261                          </request-info> 
262                          <network-inputs> 
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>
272                          </network-inputs> 
273                          <network-params>
274                                 ${userParamsNode}
275                          </network-params> 
276                         </network-request>
277                         """
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]*)?", "")
280                         
281                 } catch(Exception e) {
282                         msoLogger.debug("Error in Vid Utils",e.getCause())
283                         e.printStackTrace();
284                         throw e
285                 }
286         }
287         
288         /**
289          * Create a network-request XML using a map, 
290          * @param execution 
291          * @return
292          */
293         public String createXmlNetworkRequestInstance(execution) {
294
295                 def networkModelUuid = ""
296                 def networkModelName = ""
297                 def networkModelVersion = ""
298                 def networkModelCustomizationUuid = ""
299                 def networkModelInvariantUuid = ""
300                 
301                 // verify the DB Catalog response JSON structure
302                 def networkModelInfo = execution.getVariable("networkModelInfo")
303                 def jsonSlurper = new JsonSlurper()
304                 if (networkModelInfo != null) {
305                         try {
306                                 Map modelMap = jsonSlurper.parseText(networkModelInfo)
307                                 if (modelMap != null) {
308                                         if (networkModelInfo.contains("modelUuid")) {
309                                                 networkModelUuid = modelMap.modelUuid !=null ? modelMap.modelUuid : ""
310                                         }
311                                         if (networkModelInfo.contains("modelName")) {
312                                                 networkModelName = modelMap.modelName !=null ? modelMap.modelName : ""
313                                         }
314                                         if (networkModelInfo.contains("modelVersion")) {
315                                                 networkModelVersion = modelMap.modelVersion !=null ? modelMap.modelVersion : ""
316                                         }
317                                         if (networkModelInfo.contains("modelCustomizationUuid")) {
318                                                 networkModelCustomizationUuid = modelMap.modelCustomizationUuid !=null ? modelMap.modelCustomizationUuid : ""
319                                         }
320                                         if (networkModelInfo.contains("modelInvariantUuid")) {
321                                                 networkModelInvariantUuid = modelMap.modelInvariantUuid !=null ? modelMap.modelInvariantUuid : ""
322                                         }
323                                 }
324                         } catch (Exception ex) {
325                         throw ex
326                         }
327                 }               
328                 
329                 def serviceModelUuid = ""
330                 def serviceModelName = ""
331                 def serviceModelVersion = ""
332                 def serviceModelCustomizationUuid = ""
333                 def serviceModelInvariantUuid = ""
334                 
335                 // verify the DB Catalog response JSON structure
336                 def serviceModelInfo = execution.getVariable("serviceModelInfo")
337                 def jsonServiceSlurper = new JsonSlurper()
338                 if (serviceModelInfo != null) {
339                         try {
340                                 Map modelMap = jsonServiceSlurper.parseText(serviceModelInfo)
341                                 if (modelMap != null) {
342                                         if (serviceModelInfo.contains("modelUuid")) {
343                                                 serviceModelUuid = modelMap.modelUuid !=null ? modelMap.modelUuid : ""
344                                         }
345                                         if (serviceModelInfo.contains("modelName")) {
346                                                 serviceModelName = modelMap.modelName !=null ? modelMap.modelName : ""
347                                         }
348                                         if (serviceModelInfo.contains("modelVersion")) {
349                                                 serviceModelVersion = modelMap.modelVersion !=null ? modelMap.modelVersion : ""
350                                         }
351                                         if (serviceModelInfo.contains("modelCustomizationUuid")) {
352                                                 serviceModelCustomizationUuid = modelMap.modelCustomizationUuid !=null ? modelMap.modelCustomizationUuid : ""
353                                         }
354                                         if (serviceModelInfo.contains("modelInvariantUuid")) {
355                                                 serviceModelInvariantUuid = modelMap.modelInvariantUuid !=null ? modelMap.modelInvariantUuid : ""
356                                         }
357                                 }
358                         } catch (Exception ex) {
359                                 throw ex
360                         }
361                 }
362                 
363                 
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"
381                         }
382                 }
383                 
384                 //'sdncVersion' = current, '1610' (non-RPC SDNC) or '1702' (RPC SDNC)
385                 def sdncVersion =  execution.getVariable("sdncVersion")
386                 
387                 def source = "VID"
388                 def action = execution.getVariable("action")
389                                 
390                 def userParamsNode = ""
391                 def userParams = execution.getVariable("networkInputParams")
392                 if(userParams != null) {
393                    userParamsNode = buildUserParams(userParams)
394                 }
395                 
396                 def xmlReq = """
397                 <network-request xmlns="http://www.w3.org/2001/XMLSchema"> 
398                  <request-info> 
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>
403                  </request-info> 
404                  <network-inputs> 
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>
415             <networkModelInfo>
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>
421                     </networkModelInfo>
422             <serviceModelInfo>
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>
428              
429                     </serviceModelInfo>                                                                                                 
430             <sdncVersion>${MsoUtils.xmlEscape(sdncVersion)}</sdncVersion>                    
431                  </network-inputs>
432                  <network-params>
433                         ${userParamsNode}
434                  </network-params> 
435                 </network-request>
436                 """
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]*)?", "")
439                         
440         }
441         
442         /**
443          * Create a vnf-request XML using a map
444          * @param requestMap - map created from VID JSON 
445          * @param action
446          * @return
447          */
448         public String createXmlVfModuleRequest(execution, Map requestMap, String action, String serviceInstanceId) {
449                                 
450                 //def relatedInstanceList = requestMap.requestDetails.relatedInstanceList
451                 
452                 //relatedInstanceList.each {
453                 //      if (it.relatedInstance.modelInfo.modelType == 'vnf') {
454                 //              vnfType = it.relatedInstance.modelInfo.modelName
455                 //              vnfId = it.relatedInstance.modelInfo.modelInvariantId
456                 //      }
457                 //}
458                 
459                 def vnfName = ''
460                 def asdcServiceModelInfo = ''
461                                 
462                 def relatedInstanceList = requestMap.requestDetails?.relatedInstanceList
463                 
464                 
465                 if (relatedInstanceList != null) {
466                         relatedInstanceList.each {
467                                 if (it.relatedInstance.modelInfo?.modelType == 'service') {
468                                         asdcServiceModelInfo = it.relatedInstance.modelInfo?.modelVersion
469                                 }
470                                 if (it.relatedInstance.modelInfo.modelType == 'vnf') {
471                                         vnfName = it.relatedInstance.instanceName ?: ''
472                                 }
473                         }
474                 }
475                 
476                 def vnfType = execution.getVariable('vnfType')
477                 def vnfId = execution.getVariable('vnfId')
478
479                 def vfModuleId = execution.getVariable('vfModuleId')
480                 def volumeGroupId = execution.getVariable('volumeGroupId')
481                 def userParams = requestMap.requestDetails?.requestParameters?.userParams
482                 
483                 
484                 def userParamsNode = ''
485                 if(userParams != null) {
486                         userParamsNode = buildUserParams(userParams)
487                 }
488                 
489                 def isBaseVfModule = "false"
490                 if (execution.getVariable('isBaseVfModule') == true) {
491                         isBaseVfModule = "true"         
492                 }
493                 
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
498                 
499                 def backoutOnFailure = ""
500                 if(suppressRollback != null){
501                         if ( suppressRollback == true) {
502                                 backoutOnFailure = "false"
503                         } else if ( suppressRollback == false) {
504                                 backoutOnFailure = "true"
505                         }
506                 }
507                 
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 ?: ''
514                 
515                 def xmlReq = """
516                 <vnf-request>
517                         <request-info>
518                                 <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
519                                 <action>${MsoUtils.xmlEscape(action)}</action>
520                                 <source>VID</source>
521                                 <service-instance-id>${MsoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
522                         </request-info>
523                         <vnf-inputs>
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>
541                         </vnf-inputs>
542                         <vnf-params>
543                                 $userParamsNode
544                         </vnf-params>
545                 </vnf-request>
546                 """
547         
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]*)?", "") 
550         }
551         
552
553 }