Fix CreateSDNCNetworkResource.updateResourceInput() for BBS use case
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / CreateSDNCNetworkResource.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - SO
4  * ================================================================================
5  * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License")
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.bpmn.infrastructure.scripts
24
25
26 import org.apache.commons.lang3.*
27 import org.camunda.bpm.engine.delegate.BpmnError
28 import org.camunda.bpm.engine.delegate.DelegateExecution
29 import org.json.JSONObject
30 import org.json.XML
31 import org.onap.aai.domain.yang.ServiceInstance
32 import org.onap.aai.domain.yang.ServiceInstances
33 import org.onap.aai.domain.yang.v13.Metadata
34 import org.onap.aai.domain.yang.v13.Metadatum
35 import org.onap.so.bpmn.common.recipe.ResourceInput
36 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
37 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
38 import org.onap.so.bpmn.common.scripts.ExceptionUtil
39 import org.onap.so.bpmn.common.scripts.MsoUtils
40 import org.onap.so.bpmn.core.domain.ModelInfo
41 import org.onap.so.bpmn.core.domain.ResourceType
42 import org.onap.so.bpmn.core.json.JsonUtils
43 import org.onap.so.bpmn.core.UrnPropertiesReader
44 import org.onap.so.client.aai.AAIObjectPlurals
45 import org.onap.so.client.aai.AAIResourcesClient
46 import org.onap.so.client.aai.AAIObjectType
47 import org.onap.so.client.aai.entities.uri.AAIResourceUri
48 import org.onap.so.client.aai.entities.uri.AAIUriFactory
49 import org.slf4j.Logger
50 import org.slf4j.LoggerFactory
51
52 /**
53  * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
54  * flow for SDNC Network Resource Create
55  */
56 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
57
58     private static final Logger logger = LoggerFactory.getLogger( CreateSDNCNetworkResource.class)
59     String Prefix="CRESDNCRES_"
60
61     ExceptionUtil exceptionUtil = new ExceptionUtil()
62
63     JsonUtils jsonUtil = new JsonUtils()
64
65     MsoUtils msoUtils = new MsoUtils()
66
67     public void preProcessRequest(DelegateExecution execution){
68
69         logger.info(" ***** Started preProcessRequest *****")
70         try {
71
72             //get bpmn inputs from resource request.
73             String requestId = execution.getVariable("mso-request-id")
74             String requestAction = execution.getVariable("requestAction")
75             logger.info("The requestAction is: " + requestAction)
76             String recipeParamsFromRequest = execution.getVariable("recipeParams")
77             logger.info("The recipeParams is: " + recipeParamsFromRequest)
78             String resourceInput = execution.getVariable("resourceInput")
79             logger.info("The resourceInput is: " + resourceInput)
80             //Get ResourceInput Object
81             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
82             execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
83
84             //Deal with recipeParams
85             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
86
87             //For sdnc requestAction default is "createNetworkInstance"
88             String operationType = "Network"
89             if(!StringUtils.isBlank(recipeParamsFromRequest)){
90                 //the operationType from worflow(first node) is second priority.
91                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
92             }
93             if(!StringUtils.isBlank(recipeParamsFromWf)){
94                 //the operationType from worflow(first node) is highest priority.
95                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
96             }
97             String operationTypeFromConfig = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".operation-type")
98             if (StringUtils.isNotEmpty(operationTypeFromConfig)) {
99                 // highest priority if operation type configured
100                 operationType = operationTypeFromConfig
101             }
102
103             String sdnc_svcAction = "create"
104             String sdnc_requestAction = sdnc_svcAction.capitalize() + operationType + "Instance"
105             String isActivateRequired = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".activation-required")
106             execution.setVariable("isActivateRequired", isActivateRequired)
107
108             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
109             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
110             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
111             execution.setVariable("mso-request-id", requestId)
112             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
113         } catch (BpmnError e) {
114             throw e
115         } catch (Exception ex){
116             msg = "Exception in preProcessRequest " + ex.getMessage()
117             logger.debug(msg)
118             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
119         }
120     }
121
122     String customizeResourceParam(String networkInputParametersJson) {
123         List<Map<String, Object>> paramList = new ArrayList()
124         JSONObject jsonObject = new JSONObject(networkInputParametersJson)
125         Iterator iterator = jsonObject.keys()
126         while (iterator.hasNext()) {
127             String key = iterator.next()
128             HashMap<String, String> hashMap = new HashMap()
129             hashMap.put("name", key)
130             hashMap.put("value", jsonObject.get(key))
131             paramList.add(hashMap)
132         }
133         Map<String, List<Map<String, Object>>> paramMap = new HashMap()
134         paramMap.put("param", paramList)
135
136         return  new JSONObject(paramMap).toString()
137     }
138
139     private List<Metadatum> getMetaDatum(String customerId,
140                                          String serviceType, String serId) {
141         logger.debug("Enter getPnfInstance")
142         AAIResourcesClient client = new AAIResourcesClient()
143
144         // think how AAI queried for PNF name using the name
145         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
146                 customerId, serviceType, serId)
147         logger.debug("uri for pnf get:" + uri.toString())
148
149         Metadata metadata = client.get(uri).asBean(Metadata.class).get()
150         return metadata.getMetadatum()
151     }
152
153     /**
154      * This method updates the resource input by collecting required info from AAI
155      * @param execution
156      */
157     public ResourceInput updateResourceInput(DelegateExecution execution) {
158         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
159         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
160
161
162         def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
163         String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
164
165         switch (modelName) {
166             case ~/[\w\s\W]*OLT[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
167             case ~/[\w\s\W]*AccessConnectivity[\w\s\W]*/ :
168                 // get the required properties and update in resource input
169
170                 def resourceInput = resourceInputObj.getResourceParameters()
171                 String incomingRequest = resourceInputObj.getRequestsInputs()
172                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
173                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
174                 String cvlan = jsonUtil.getJsonValue(serInput,
175                         "service.parameters.requestInputs.cvlan")
176                 String svlan = jsonUtil.getJsonValue(serInput,
177                         "service.parameters.requestInputs.svlan")
178                 String remoteId = jsonUtil.getJsonValue(serInput,
179                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
180                 String manufacturer = jsonUtil.getJsonValue(serInput,
181                         "service.parameters.requestInputs.ont_ont_manufacturer")
182                 String ontsn = jsonUtil.getJsonValue(serInput,
183                         "service.parameters.requestInputs.ont_ont_serial_num")
184
185                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
186                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
187                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.remote_id", remoteId)
188                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
189                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
190                 logger.debug("old resource input:" + resourceInputObj.toString())
191                 resourceInputObj.setResourceParameters(uResourceInput)
192                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
193                 logger.debug("new resource Input :" + resourceInputObj.toString())
194                 break
195
196             case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
197             case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
198                 // get the required properties and update in resource input
199                 def resourceInput = resourceInputObj.getResourceParameters()
200                 String incomingRequest = resourceInputObj.getRequestsInputs()
201                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
202                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
203                 JSONObject inputParameters = new JSONObject(requestInputs)
204
205                 String cvlan = jsonUtil.getJsonValue(serInput,
206                         "service.parameters.requestInputs.cvlan")
207                 String svlan = jsonUtil.getJsonValue(serInput,
208                         "service.parameters.requestInputs.svlan")
209                 String manufacturer = jsonUtil.getJsonValue(serInput,
210                         "service.parameters.requestInputs.ont_ont_manufacturer")
211                 String remoteId = jsonUtil.getJsonValue(serInput,
212                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
213                 String ontsn = jsonUtil.getJsonValue(serInput,
214                         "service.parameters.requestInputs.ont_ont_serial_num")
215                 String serviceType = jsonUtil.getJsonValue(serInput,
216                         "service.parameters.requestInputs.edgeinternetprofile_ip_service_type")
217                 String macAddr = jsonUtil.getJsonValue(serInput,
218                         "service.parameters.requestInputs.edgeinternetprofile_ip_rg_mac_addr")
219                 String upStream = jsonUtil.getJsonValue(serInput,
220                         "service.parameters.requestInputs.edgeinternetprofile_ip_upstream_speed")
221                 String downStream = jsonUtil.getJsonValue(serInput,
222                         "service.parameters.requestInputs.edgeinternetprofile_ip_downstream_speed")
223
224                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
225                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
226                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
227                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_remote_id", remoteId)
228                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
229                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_service_type", serviceType)
230                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_rg_mac_addr", macAddr)
231                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_upstream_speed", upStream)
232                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_downstream_speed", downStream)
233                 logger.debug("old resource input:" + resourceInputObj.toString())
234                 resourceInputObj.setResourceParameters(uResourceInput)
235                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
236                 logger.debug("new resource Input :" + resourceInputObj.toString())
237                 break
238
239
240             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
241
242                 def resourceInput = resourceInputObj.getResourceParameters()
243                 String incomingRequest = resourceInputObj.getRequestsInputs()
244                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
245                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
246                 JSONObject inputParameters = new JSONObject(requestInputs)
247                 if(inputParameters.has("local-access-provider-id")) {
248                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
249                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
250                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
251                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
252                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
253                     resourceInputObj.setResourceParameters(uResourceInput)
254                     execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
255                 }
256
257                 break
258
259             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
260             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
261             case ~/[\w\s\W]*SOTN-Attachment[\w\s\W]*/ :
262                 // fill attachment TP in networkInputParamJson
263                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : (StringUtils.containsIgnoreCase(modelName, "SOTN-Attachment") ? "elinesotnattachmentvf0_elinesotnattachmentvfc0_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName")
264                 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
265
266                 break
267             default:
268                 // Special case for handling alloted resource types
269                 // in case name is different as expected
270                 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
271                     def vpnName = modelName + "_sotnVpnName"
272                     fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
273                 }
274                 break
275         }
276         return resourceInputObj
277     }
278
279     private void fillAttachmentTPInfo(ResourceInput resourceInputObj, DelegateExecution execution, String vpnName) {
280
281         String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
282
283         AAIResourcesClient client = new AAIResourcesClient()
284         logger.info("sending request to resolve vpn-name:" + vpnName)
285         AAIResourceUri uri = AAIUriFactory.createResourceUri(new AAIObjectPlurals("/nodes", "/service-instances", "queryByName")).queryParam("service-instance-name", parentServiceName)
286         Optional<ServiceInstances> serviceInstancesOpt = client.get(ServiceInstances.class, uri)
287
288         if(serviceInstancesOpt.isPresent()) {
289             List<ServiceInstance> serviceInstanceList = serviceInstancesOpt.get().getServiceInstance()
290             logger.info("response from aai:" + serviceInstanceList.toString())
291             if (serviceInstanceList.size() > 0) {
292                 ServiceInstance si = serviceInstanceList.get(0)
293                 String parentServiceInstanceId = si.getServiceInstanceId()
294                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
295                 logger.info("setting parentService id:" + parentServiceInstanceId)
296             } else {
297                 logger.error("No service instance found for given name.")
298             }
299         } else {
300             logger.error("No nodes found with this name" + vpnName)
301         }
302     }
303
304     /**
305      * Pre Process the BPMN Flow Request
306      * Includes:
307      * generate the nsOperationKey
308      * generate the nsParameters
309      */
310     public void prepareSDNCRequest (DelegateExecution execution) {
311         logger.info(" ***** Started prepareSDNCRequest *****")
312
313         try {
314             // get variables
315             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
316             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
317             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
318             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
319
320             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
321             String hdrRequestId = execution.getVariable("mso-request-id")
322             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
323             String source = execution.getVariable("source")
324             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
325             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
326             String serviceType = resourceInputObj.getServiceType()
327             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
328             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
329             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
330             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
331             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
332             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid()
333             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
334             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
335             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
336             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
337             String resourceInputPrameters = resourceInputObj.getResourceParameters()
338             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
339             //here convert json string to xml string
340             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
341             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
342             String sdncTopologyCreateRequest = ""
343
344             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
345
346             switch (modelType) {
347                 case "VNF" :
348                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
349                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
350                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
351                                  <sdncadapter:RequestHeader>
352                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
353                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
354                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
355                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
356                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
357                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
358                                  </sdncadapter:RequestHeader>
359                                  <sdncadapterworkflow:SDNCRequestData>
360                                      <request-information>
361                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
362                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
363                                         <source>${msoUtils.xmlEscape(source)}</source>
364                                         <notification-url></notification-url>
365                                         <order-number></order-number>
366                                         <order-version></order-version>
367                                      </request-information>
368                                      <service-information>
369                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
370                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
371                                         <onap-model-information>
372                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
373                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
374                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
375                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
376                                         </onap-model-information>
377                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
378                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
379                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
380                                      </service-information>
381                                      <vnf-information>
382                                         <vnf-type></vnf-type>
383                                         <onap-model-information>
384                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
385                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
386                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
387                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
388                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
389                                         </onap-model-information>
390                                      </vnf-information>
391                                      <vnf-request-input>
392                                          <vnf-input-parameters>
393                                            $netowrkInputParameters
394                                          </vnf-input-parameters>
395                                          <request-version></request-version>
396                                          <vnf-name></vnf-name>
397                                          <vnf-networks>
398                                         </vnf-networks>
399                                       </vnf-request-input>
400                                 </sdncadapterworkflow:SDNCRequestData>
401                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
402                     break
403                 case "GROUP" :
404                     String vnfid = resourceInputObj.getVnfId()
405                     ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
406                     String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
407                     String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
408                     String vnfmodelUuid = vfModelInfo.getModelUuid()
409                     String vnfmodelVersion = vfModelInfo.getModelVersion()
410                     String vnfmodelName = vfModelInfo.getModelName()
411                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
412                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
413                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
414                                  <sdncadapter:RequestHeader>
415                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
416                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
417                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
418                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
419                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
420                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
421                                  </sdncadapter:RequestHeader>
422                                  <sdncadapterworkflow:SDNCRequestData>
423                                      <request-information>
424                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
425                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
426                                         <source>${msoUtils.xmlEscape(source)}</source>
427                                         <notification-url></notification-url>
428                                         <order-number></order-number>
429                                         <order-version></order-version>
430                                      </request-information>
431                                      <service-information>
432                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
433                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
434                                         <onap-model-information>
435                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
436                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
437                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
438                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
439                                         </onap-model-information>
440                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
441                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
442                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
443                                      </service-information>
444                                      <vnf-information>
445                                         <onap-model-information>
446                                              <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
447                                              <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
448                                              <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
449                                              <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
450                                              <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
451                                         </onap-model-information>
452                                         <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
453                                      </vnf-information>
454                                      <vf-module-information>
455                                         <from-preload>false</from-preload>
456                                         <onap-model-information>
457                                             <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
458                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
459                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
460                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
461                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
462                                         </onap-model-information>
463                                      </vf-module-information>
464                                      <vf-module-request-input>
465                                          <vf-module-input-parameters>
466                                            $netowrkInputParameters
467                                          </vf-module-input-parameters>
468                                       </vf-module-request-input>
469                                 </sdncadapterworkflow:SDNCRequestData>
470                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
471                     break
472
473                 // sdwanvpnattachment or sotnvpnattachment
474                 case "ALLOTTED_RESOURCE" :
475                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
476                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
477                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
478                                  <sdncadapter:RequestHeader>
479                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
480                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
481                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
482                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
483                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
484                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
485                                  </sdncadapter:RequestHeader>
486                                  <sdncadapterworkflow:SDNCRequestData>
487                                      <request-information>
488                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
489                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
490                                         <source>${msoUtils.xmlEscape(source)}</source>
491                                         <notification-url></notification-url>
492                                         <order-number></order-number>
493                                         <order-version></order-version>
494                                      </request-information>
495                                      <service-information>
496                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
497                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
498                                         <onap-model-information>
499                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
500                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
501                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
502                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
503                                         </onap-model-information>
504                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
505                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
506                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
507                                      </service-information>
508                                      <allotted-resource-information>
509                                         <allotted-resource-id></allotted-resource-id>
510                                         <allotted-resource-type></allotted-resource-type>
511                                         <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
512                                         <onap-model-information>
513                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
514                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
515                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
516                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
517                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
518                                         </onap-model-information>
519                                      </allotted-resource-information>
520                                      <connection-attachment-request-input>
521                                        $netowrkInputParameters
522                                      </connection-attachment-request-input>
523                                 </sdncadapterworkflow:SDNCRequestData>
524                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
525
526                     break
527
528                 // for SDWANConnectivity and SOTNConnectivity:
529                 default:
530                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
531                                                xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
532                                                xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
533                                   <sdncadapter:RequestHeader>
534                                      <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
535                                      <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
536                                      <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
537                                      <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
538                                      <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
539                                      <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
540                                   </sdncadapter:RequestHeader>
541                                   <sdncadapterworkflow:SDNCRequestData>
542                                       <request-information>
543                                          <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
544                                          <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
545                                          <source>${msoUtils.xmlEscape(source)}</source>
546                                          <notification-url></notification-url>
547                                          <order-number></order-number>
548                                          <order-version></order-version>
549                                       </request-information>
550                                       <service-information>
551                                          <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
552                                          <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
553                                          <onap-model-information>
554                                               <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
555                                               <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
556                                               <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
557                                               <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
558                                          </onap-model-information>
559                                          <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
560                                          <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
561                                       </service-information>
562                                       <network-information>
563                                          <onap-model-information>
564                                               <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
565                                               <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
566                                               <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
567                                               <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
568                                               <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
569                                          </onap-model-information>
570                                       </network-information>
571                                       <network-request-input>
572                                         <network-input-parameters>$netowrkInputParameters</network-input-parameters>
573                                       </network-request-input>
574                                  </sdncadapterworkflow:SDNCRequestData>
575                               </aetgt:SDNCAdapterWorkflowRequest>""".trim()
576
577
578             }
579
580             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
581             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
582             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
583
584         } catch (Exception ex) {
585             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
586             logger.debug(exceptionMessage)
587             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
588
589         }
590         logger.info(" ***** Exit prepareSDNCRequest *****")
591     }
592
593     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
594         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
595         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
596         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
597     }
598
599     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
600         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
601         String operType = resourceInputObj.getOperationType()
602         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
603         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
604         String operationId = resourceInputObj.getOperationId()
605         String progress = "20"
606         String status = "processing"
607         String statusDescription = "SDCN resource creation invoked"
608
609         execution.getVariable("operationId")
610
611         String body = """
612                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
613                         xmlns:ns="http://org.onap.so/requestsdb">
614                         <soapenv:Header/>
615                 <soapenv:Body>
616                     <ns:updateResourceOperationStatus>
617                                <operType>${msoUtils.xmlEscape(operType)}</operType>
618                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
619                                <progress>${msoUtils.xmlEscape(progress)}</progress>
620                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
621                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
622                                <status>${msoUtils.xmlEscape(status)}</status>
623                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
624                     </ns:updateResourceOperationStatus>
625                 </soapenv:Body>
626                 </soapenv:Envelope>"""
627
628         setProgressUpdateVariables(execution, body)
629
630     }
631
632     public void prepareUpdateAfterCreateSDNCResource(execution) {
633         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
634         String operType = resourceInputObj.getOperationType()
635         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
636         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
637         String operationId = resourceInputObj.getOperationId()
638         String progress = "100"
639         String status = "finished"
640         String statusDescription = "SDCN resource creation and activation completed"
641
642         execution.getVariable("operationId")
643
644         String body = """
645                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
646                         xmlns:ns="http://org.onap.so/requestsdb">
647                         <soapenv:Header/>
648                 <soapenv:Body>
649                     <ns:updateResourceOperationStatus>
650                                <operType>${msoUtils.xmlEscape(operType)}</operType>
651                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
652                                <progress>${msoUtils.xmlEscape(progress)}</progress>
653                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
654                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
655                                <status>${msoUtils.xmlEscape(status)}</status>
656                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
657                     </ns:updateResourceOperationStatus>
658                 </soapenv:Body>
659                 </soapenv:Envelope>"""
660
661         setProgressUpdateVariables(execution, body)
662     }
663
664     public void afterCreateSDNCCall(DelegateExecution execution){
665         logger.info(" ***** Started prepareSDNCRequest *****")
666         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
667         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
668
669         def instnaceId = getInstanceId(execution)
670         execution.setVariable("resourceInstanceId", instnaceId)
671
672         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
673         logger.info(" ***** Exit prepareSDNCRequest *****")
674     }
675
676     private def getInstanceId(DelegateExecution execution) {
677         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
678
679         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
680         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
681         def val = ""
682
683         String modelType = resourceInputObj.getResourceModelInfo().getModelType()
684         switch (modelType) {
685             case "VNF" :
686                 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
687                 break
688             case "GROUP":
689                 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
690                 break
691             case "ALLOTTED_RESOURCE":
692                 // sdwanvpnattachment or sotnvpnattachment
693                 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
694                 break
695             default:
696                 // SDWANConnectivity or SOTN Connectivity
697                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
698                 break
699         }
700         return val.toString()
701     }
702
703     public void sendSyncResponse (DelegateExecution execution) {
704         logger.debug(" *** sendSyncResponse *** ")
705
706         try {
707             String operationStatus = "finished"
708             // RESTResponse for main flow
709             String vnfid=execution.getVariable("resourceInstanceId")
710             String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
711             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
712             sendWorkflowResponse(execution, 202, resourceOperationResp)
713             execution.setVariable("sentSyncResponse", true)
714
715         } catch (Exception ex) {
716             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
717             logger.debug(msg)
718             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
719         }
720         logger.debug(" ***** Exit sendSyncResponse *****")
721     }
722 }