Initial OpenECOMP MSO commit
[so.git] / bpmn / MSOGammaBPMN / src / main / groovy / com / att / bpm / scripts / VidUtils.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - MSO
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 com.att.bpm.scripts
22
23 import org.json.JSONObject;
24 import org.json.XML;
25
26 import org.openecomp.mso.bpmn.core.xml.XmlTool;
27
28 import groovy.json.JsonBuilder
29 import groovy.json.JsonSlurper
30 import groovy.util.slurpersupport.GPathResult
31 import groovy.xml.QName
32
33 class VidUtils {
34         
35         public MsoUtils utils = new MsoUtils()
36         private AbstractServiceTaskProcessor taskProcessor
37
38         public VidUtils(AbstractServiceTaskProcessor taskProcessor) {
39                 this.taskProcessor = taskProcessor
40         }
41         
42         /**
43          * Create a volume-request XML using a JSON string
44          * @param jsonReq - JSON request from VID
45          * @param action
46          * @return
47          */
48         public String createXmlVolumeRequest(String jsonReq, String action, String serviceInstanceId) {
49                 def jsonSlurper = new JsonSlurper()
50                 try{
51                         Map reqMap = jsonSlurper.parseText(jsonReq)
52                         return createXmlVolumeRequest(reqMap, action, serviceInstanceId)
53                 }
54                 catch(Exception e) {
55                         throw e
56                 }
57         }
58
59         /**
60          * Create a volume-request XML using a map
61          * @param requestMap - map created from VID JSON
62          * @param action
63          * @param serviceInstanceId
64          * @return
65          */
66         public String createXmlVolumeRequest(Map requestMap, String action, String serviceInstanceId) {
67                 createXmlVolumeRequest(requestMap, action, serviceInstanceId, '')
68         }
69         
70
71         /**
72          * Create a volume-request XML using a map
73          * @param requestMap
74          * @param action
75          * @param serviceInstanceId
76          * @param volumeGroupId
77          * @return
78          */
79         public String createXmlVolumeRequest(Map requestMap, String action, String serviceInstanceId, String volumeGroupId) {
80                 def vnfType = ''
81                 def serviceName = ''
82                 def modelCustomizationName = ''
83                 def asdcServiceModelVersion = ''
84                 
85                 def suppressRollback = requestMap.requestDetails.requestInfo.suppressRollback
86                 def rollbackEnabled = true
87                 if(suppressRollback != null && suppressRollback == true) {
88                         rollbackEnabled = false
89                 }
90                 
91                 def volGrpName = requestMap.requestDetails.requestInfo?.instanceName ?: ''
92                 def serviceId = requestMap.requestDetails.requestParameters?.serviceId ?: ''
93                 def relatedInstanceList = requestMap.requestDetails.relatedInstanceList
94                 relatedInstanceList.each {
95                         if (it.relatedInstance.modelInfo?.modelType == 'service') {
96                                 serviceName = it.relatedInstance.modelInfo?.modelName
97                                 asdcServiceModelVersion = it.relatedInstance.modelInfo?.modelVersion
98                         }
99                         if (it.relatedInstance.modelInfo?.modelType == 'vnf') {
100                                 modelCustomizationName = it.relatedInstance.modelInfo?.modelCustomizationName
101                         }
102                 }
103                 
104                 vnfType = serviceName + '/' + modelCustomizationName
105                 
106                 def userParams = requestMap.requestDetails?.requestParameters?.userParams
107                 def userParamsNode = ''
108                 if(userParams != null) {
109                         userParamsNode = buildUserParams(userParams)
110                 }
111                 def xmlReq = """
112                 <volume-request xmlns="http://www.w3.org/2001/XMLSchema">
113                         <request-info>
114                                 <action>${action}</action>
115                                 <source>${requestMap.requestDetails.requestInfo.source}</source>
116                                 <service-instance-id>${serviceInstanceId}</service-instance-id>
117                         </request-info>
118                         <volume-inputs>
119                                 <volume-group-id>${volumeGroupId}</volume-group-id>
120                                 <volume-group-name>${volGrpName}</volume-group-name>
121                                 <vnf-type>${vnfType}</vnf-type>
122                                 <vf-module-model-name>${requestMap.requestDetails.modelInfo.modelName}</vf-module-model-name>
123                                 <asdc-service-model-version>${asdcServiceModelVersion}</asdc-service-model-version>
124                                 <aic-cloud-region>${requestMap.requestDetails.cloudConfiguration.lcpCloudRegionId}</aic-cloud-region>
125                                 <tenant-id>${requestMap.requestDetails.cloudConfiguration.tenantId}</tenant-id>
126                                 <service-id>${serviceId}</service-id>
127                                 <backout-on-failure>${rollbackEnabled}</backout-on-failure>
128                         </volume-inputs>
129                         <volume-params>
130                                 $userParamsNode
131                         </volume-params>
132                 </volume-request>
133                 """
134                 // return a pretty-print of the volume-request xml without the preamble
135                 return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "") 
136         }
137         
138         /**
139          * A common method that can be used to build volume-params node from a map. 
140          * @param Map userParams
141          * @return
142          */
143         public String buildUserParams(userParams) {
144                 if (userParams == null) return ""
145                 def xml = ""
146                 def key = ""
147                 def value = ""
148                 userParams.each {it ->
149                         key = it.name.replaceAll(/\B[A-Z]/) { '_' + it }.toLowerCase()
150                         value = it.value
151                         xml += "<param name=\"${key}\">${value}</param>"
152                 }
153
154                 return xml
155         }
156
157         /**
158          * A common method that can be used to extract 'requestDetails' 
159          * @param String json
160          * @return String json requestDetails  
161          */
162         @Deprecated
163         public getJsonRequestDetails(String jsonInput) {
164                 String rtn = ""
165                 if (jsonInput.isEmpty() || jsonInput == null) {
166                         return rtn
167                 } else {
168                         def jsonMapObject = new JsonSlurper().parseText(jsonInput)
169                         if (jsonMapObject instanceof Map) {
170                                 String jsonString = new JsonBuilder(jsonMapObject.requestDetails)
171                                 rtn = '{'+"requestDetails"+":"+jsonString+'}'
172                                 return rtn
173                         } else {
174                             return rtn
175                         }       
176                 }
177         }
178         
179         /**
180          * A common method that can be used to extract 'requestDetails' in Xml
181          * @param String json
182          * @return String xml requestDetails
183          */
184         @Deprecated
185         public getJsonRequestDetailstoXml(String jsonInput) {
186                 String rtn = null
187                 def jsonString = getJsonRequestDetails(jsonInput)
188                 if (jsonString == null) {
189                         return rtn
190                 } else {
191                     JSONObject jsonObj = new JSONObject(jsonString)
192                         return XmlTool.normalize(XML.toString(jsonObj))
193                 }
194         }
195         
196         /**
197          * Create a network-request XML using a map
198          * @param execution 
199          * @param xmlRequestDetails - requestDetails in xml 
200          * @return
201          */
202         public String createXmlNetworkRequestInfra(execution, def networkJsonIncoming) {
203         
204                 def requestId = execution.getVariable("requestId")
205                 def serviceInstanceId = execution.getVariable("serviceInstanceId")
206                 def requestAction = execution.getVariable("requestAction")
207                 def networkId = (execution.getVariable("networkId")) != null ? execution.getVariable("networkId") : ""
208                 
209                 def jsonSlurper = new JsonSlurper()
210                 try {
211                         Map reqMap = jsonSlurper.parseText(networkJsonIncoming)
212                         def instanceName =  reqMap.requestDetails.requestInfo.instanceName
213                         def modelName = reqMap.requestDetails.modelInfo.modelName
214                         def lcpCloudRegionId = reqMap.requestDetails.cloudConfiguration.lcpCloudRegionId
215                         def tenantId = reqMap.requestDetails.cloudConfiguration.tenantId
216                         def serviceId = reqMap.requestDetails.requestInfo.productFamilyId 
217                         def backoutOnFailure = reqMap.requestDetails.requestInfo.suppressRollback
218                 
219                         //def userParams = reqMap.requestDetails.requestParameters.userParams
220                         //def userParamsNode = buildUserParams(userParams)
221                         def userParams = reqMap.requestDetails?.requestParameters?.userParams
222                         def userParamsNode = ''
223                         if(userParams != null) {
224                                 userParamsNode = buildUserParams(userParams)
225                         }
226                 
227                         def xmlReq = """
228                         <network-request xmlns="http://www.w3.org/2001/XMLSchema"> 
229                          <request-info> 
230                     <request-id>${requestId}</request-id>
231                                 <action>${requestAction}</action> 
232                                 <source>VID</source> 
233                                 <service-instance-id>${serviceInstanceId}</service-instance-id>
234                          </request-info> 
235                          <network-inputs> 
236                                 <network-id>${networkId}</network-id> 
237                                 <network-name>${instanceName}</network-name> 
238                                 <network-type>${modelName}</network-type>
239                                 <aic-cloud-region>${lcpCloudRegionId}</aic-cloud-region> 
240                                 <tenant-id>${tenantId}</tenant-id>
241                                 <service-id>${serviceId}</service-id> 
242                                 <backout-on-failure>${backoutOnFailure}</backout-on-failure>
243                          </network-inputs> 
244                          <network-params>
245                                 ${userParamsNode}
246                          </network-params> 
247                         </network-request>
248                         """
249                         // return a pretty-print of the volume-request xml without the preamble
250                         return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "")
251                         
252                 } catch(Exception e) {
253                         throw e
254                 }
255         }
256         
257         /**
258          * Create a vnf-request XML using a map
259          * @param requestMap - map created from VID JSON 
260          * @param action
261          * @return
262          */
263         public String createXmlVfModuleRequest(execution, Map requestMap, String action, String serviceInstanceId) {
264                                 
265                 //def relatedInstanceList = requestMap.requestDetails.relatedInstanceList
266                 
267                 //relatedInstanceList.each {
268                 //      if (it.relatedInstance.modelInfo.modelType == 'vnf') {
269                 //              vnfType = it.relatedInstance.modelInfo.modelName
270                 //              vnfId = it.relatedInstance.modelInfo.modelInvariantId
271                 //      }
272                 //}
273                 
274                 def vnfName = ''
275                 def asdcServiceModelInfo = ''
276                                 
277                 def relatedInstanceList = requestMap.requestDetails?.relatedInstanceList
278                 
279                 
280                 if (relatedInstanceList != null) {
281                         relatedInstanceList.each {
282                                 if (it.relatedInstance.modelInfo?.modelType == 'service') {
283                                         asdcServiceModelInfo = it.relatedInstance.modelInfo?.modelVersion
284                                 }
285                                 if (it.relatedInstance.modelInfo.modelType == 'vnf') {
286                                         vnfName = it.relatedInstance.instanceName ?: ''
287                                 }
288                         }
289                 }
290                 
291                 def vnfType = execution.getVariable('vnfType')
292                 def vnfId = execution.getVariable('vnfId')
293
294                 def vfModuleId = execution.getVariable('vfModuleId')
295                 def volumeGroupId = execution.getVariable('volumeGroupId')
296                 def userParams = requestMap.requestDetails?.requestParameters?.userParams
297                 
298                 
299                 def userParamsNode = ''
300                 if(userParams != null) {
301                         userParamsNode = buildUserParams(userParams)
302                 }
303                 
304                 def isBaseVfModule = "false"
305                 if (execution.getVariable('isBaseVfModule') == true) {
306                         isBaseVfModule = "true"         
307                 }
308                 
309                 def requestId = execution.getVariable("att-mso-request-id")             
310                 def vfModuleName = requestMap.requestDetails?.requestInfo?.instanceName ?: ''
311                 def vfModuleModelName = requestMap.requestDetails?.modelInfo?.modelName ?: ''
312                 def suppressRollback = requestMap.requestDetails?.requestInfo?.suppressRollback
313                 def backoutOnFailure = "true"
314                 if(suppressRollback != null && suppressRollback == true) {
315                         backoutOnFailure = "false"
316                 }
317                 
318                 def serviceId = requestMap.requestDetails?.requestParameters?.serviceId ?: ''
319                 def aicCloudRegion = requestMap.requestDetails?.cloudConfiguration?.lcpCloudRegionId ?: ''
320                 def tenantId = requestMap.requestDetails?.cloudConfiguration?.tenantId ?: ''
321                 def personaModelId = requestMap.requestDetails?.modelInfo?.modelInvariantId ?: ''
322                 def personaModelVersion = requestMap.requestDetails?.modelInfo?.modelVersion ?: ''
323                 
324                 def xmlReq = """
325                 <vnf-request>
326                         <request-info>
327                                 <request-id>${requestId}</request-id>
328                                 <action>${action}</action>
329                                 <source>VID</source>
330                                 <!-- new 1610 field -->
331                                 <service-instance-id>${serviceInstanceId}</service-instance-id>
332                         </request-info>
333                         <vnf-inputs>
334                                 <!-- not in use in 1610 -->
335                                 <vnf-name>${vnfName}</vnf-name>                                 
336                                 <vnf-type>${vnfType}</vnf-type>
337                                 <vnf-id>${vnfId}</vnf-id>
338                                 <volume-group-id>${volumeGroupId}</volume-group-id>
339                                 <vf-module-id>${vfModuleId}</vf-module-id>
340                                 <vf-module-name>${vfModuleName}</vf-module-name>                                
341                                 <vf-module-model-name>${vfModuleModelName}</vf-module-model-name>
342                                 <is-base-vf-module>${isBaseVfModule}</is-base-vf-module>
343                                 <asdc-service-model-version>${asdcServiceModelInfo}</asdc-service-model-version>
344                                 <aic-cloud-region>${aicCloudRegion}</aic-cloud-region>                          
345                                 <tenant-id>${tenantId}</tenant-id>
346                                 <service-id>${serviceId}</service-id>
347                                 <backout-on-failure>${backoutOnFailure}</backout-on-failure>
348                                 <persona-model-id>${personaModelId}</persona-model-id>
349                                 <persona-model-version>${personaModelVersion}</persona-model-version>
350                         </vnf-inputs>
351                         <vnf-params>
352                                 $userParamsNode
353                         </vnf-params>
354                 </vnf-request>
355                 """
356         
357                 // return a pretty-print of the volume-request xml without the preamble
358                 return groovy.xml.XmlUtil.serialize(xmlReq.normalize().replaceAll("\t", "").replaceAll("\n", "")).replaceAll("(<\\?[^<]*\\?>\\s*[\\r\\n]*)?", "") 
359         }
360         
361
362 }