421fd062fe491014b53ea651c5a3c542090e829a
[so.git] /
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 import com.google.gson.Gson
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.aai.domain.yang.v13.Pnf
36 import org.onap.aai.domain.yang.v13.Pnfs
37 import org.onap.so.bpmn.common.recipe.ResourceInput
38 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
39 import org.onap.so.bpmn.common.scripts.AaiUtil
40 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
41 import org.onap.so.bpmn.common.scripts.ExceptionUtil
42 import org.onap.so.bpmn.common.scripts.MsoUtils
43 import org.onap.so.bpmn.core.domain.ModelInfo
44 import org.onap.so.bpmn.core.domain.ResourceType
45 import org.onap.so.bpmn.core.json.JsonUtils
46 import org.onap.so.bpmn.core.UrnPropertiesReader
47 import org.onap.so.client.aai.AAIObjectPlurals
48 import org.onap.so.client.aai.AAIResourcesClient
49 import org.onap.so.client.aai.AAIObjectType
50 import org.onap.so.client.aai.entities.uri.AAIResourceUri
51 import org.onap.so.client.aai.entities.uri.AAIUriFactory
52 import org.slf4j.Logger
53 import org.slf4j.LoggerFactory
54
55 import static org.apache.commons.lang3.StringUtils.*
56
57 /**
58  * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
59  * flow for SDNC Network Resource Create
60  */
61 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
62
63     private static final Logger logger = LoggerFactory.getLogger( CreateSDNCNetworkResource.class);
64     String Prefix="CRESDNCRES_"
65
66     ExceptionUtil exceptionUtil = new ExceptionUtil()
67
68     JsonUtils jsonUtil = new JsonUtils()
69
70     MsoUtils msoUtils = new MsoUtils()
71
72     public void preProcessRequest(DelegateExecution execution){
73
74         logger.info(" ***** Started preProcessRequest *****")
75         try {
76
77             //get bpmn inputs from resource request.
78             String requestId = execution.getVariable("mso-request-id")
79             String requestAction = execution.getVariable("requestAction")
80             logger.info("The requestAction is: " + requestAction)
81             String recipeParamsFromRequest = execution.getVariable("recipeParams")
82             logger.info("The recipeParams is: " + recipeParamsFromRequest)
83             String resourceInput = execution.getVariable("resourceInput")
84             logger.info("The resourceInput is: " + resourceInput)
85             //Get ResourceInput Object
86             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
87             execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
88
89             //Deal with recipeParams
90             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
91             String resourceName = resourceInputObj.getResourceInstanceName()
92
93             //For sdnc requestAction default is "createNetworkInstance"
94             String operationType = "Network"
95             if(!StringUtils.isBlank(recipeParamsFromRequest)){
96                 //the operationType from worflow(first node) is second priority.
97                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
98             }
99             if(!StringUtils.isBlank(recipeParamsFromWf)){
100                 //the operationType from worflow(first node) is highest priority.
101                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
102             }
103
104             String sdnc_svcAction = "create"
105             String sdnc_requestAction = sdnc_svcAction.capitalize() + UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".operation-type") + "Instance"
106             String isActivateRequired = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".activation-required")
107             execution.setVariable("isActivateRequired", isActivateRequired)
108
109             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
110             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
111             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
112             execution.setVariable("mso-request-id", requestId)
113             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
114         } catch (BpmnError e) {
115             throw e
116         } catch (Exception ex){
117             msg = "Exception in preProcessRequest " + ex.getMessage()
118             logger.debug(msg)
119             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
120         }
121     }
122
123     String customizeResourceParam(String networkInputParametersJson) {
124         List<Map<String, Object>> paramList = new ArrayList();
125         JSONObject jsonObject = new JSONObject(networkInputParametersJson);
126         Iterator iterator = jsonObject.keys();
127         while (iterator.hasNext()) {
128             String key = iterator.next();
129             HashMap<String, String> hashMap = new HashMap();
130             hashMap.put("name", key);
131             hashMap.put("value", jsonObject.get(key))
132             paramList.add(hashMap)
133         }
134         Map<String, List<Map<String, Object>>> paramMap = new HashMap();
135         paramMap.put("param", paramList);
136
137         return  new JSONObject(paramMap).toString();
138     }
139
140     private List<Metadatum> getMetaDatum(String customerId,
141                                          String serviceType, String serId) {
142         logger.debug("Enter getPnfInstance")
143         AAIResourcesClient client = new AAIResourcesClient()
144
145         // think how AAI queried for PNF name using the name
146         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
147                 customerId, serviceType, serId)
148         logger.debug("uri for pnf get:" + uri.toString())
149
150         Metadata metadata = client.get(uri).asBean(Metadata.class).get()
151         return metadata.getMetadatum()
152     }
153
154     /**
155      * This method updates the resource input by collecting required info from AAI
156      * @param execution
157      */
158     public ResourceInput updateResourceInput(DelegateExecution execution) {
159         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
160         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
161
162
163         def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
164         String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
165
166         switch (modelName) {
167             case ~/[\w\s\W]*OLT[\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
175                 String svlan
176                 String remoteId
177
178                 List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
179                         resourceInputObj.getServiceType(),
180                         resourceInputObj.getServiceInstanceId())
181                 for(Metadatum datum: metadatum) {
182                     if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
183                         cvlan = datum.getMetaval()
184                     }
185
186                     if (datum.getMetaname().equalsIgnoreCase("svlan")) {
187                         svlan = datum.getMetaval()
188                     }
189
190                     if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
191                         remoteId = datum.getMetaval()
192                     }
193                 }
194
195                 logger.debug("cvlan: "+cvlan+" | svlan: "+svlan+" | remoteId: "+remoteId)
196
197                 String manufacturer = jsonUtil.getJsonValue(serInput,
198                         "service.parameters.requestInputs.ont_ont_manufacturer")
199                 String ontsn = jsonUtil.getJsonValue(serInput,
200                         "service.parameters.requestInputs.ont_ont_serial_num")
201
202                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
203                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
204                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.accessID", remoteId)
205                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
206                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
207
208                 logger.debug("old resource input:" + resourceInputObj.toString())
209                 resourceInputObj.setResourceParameters(uResourceInput)
210                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
211                 logger.debug("new resource Input :" + resourceInputObj.toString())
212                 break
213
214             case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ :
215                 // get the required properties and update in resource input
216                 def resourceInput = resourceInputObj.getResourceParameters()
217                 String incomingRequest = resourceInputObj.getRequestsInputs()
218                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
219                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
220                 JSONObject inputParameters = new JSONObject(requestInputs)
221
222                 String cvlan
223                 String svlan
224                 String remoteId
225                 String manufacturer = jsonUtil.getJsonValue(serInput,
226                         "service.parameters.requestInputs.ont_ont_manufacturer")
227
228                 String ontsn = jsonUtil.getJsonValue(serInput,
229                         "service.parameters.requestInputs.ont_ont_serial_num")
230
231                 List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
232                         resourceInputObj.getServiceType(),
233                         resourceInputObj.getServiceInstanceId())
234                 for(Metadatum datum: metadatum) {
235                     if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
236                         cvlan = datum.getMetaval()
237                     }
238
239                     if (datum.getMetaname().equalsIgnoreCase("svlan")) {
240                         svlan = datum.getMetaval()
241                     }
242
243                     if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
244                         remoteId = datum.getMetaval()
245                     }
246                 }
247
248                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
249                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
250                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
251                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_access_id", remoteId)
252                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
253                 logger.debug("old resource input:" + resourceInputObj.toString())
254                 resourceInputObj.setResourceParameters(uResourceInput)
255                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
256                 logger.debug("new resource Input :" + resourceInputObj.toString())
257                 break
258
259
260             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
261
262                 def resourceInput = resourceInputObj.getResourceParameters()
263                 String incomingRequest = resourceInputObj.getRequestsInputs()
264                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
265                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
266                 JSONObject inputParameters = new JSONObject(requestInputs)
267                 if(inputParameters.has("local-access-provider-id")) {
268                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
269                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
270                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
271                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
272                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
273                     resourceInputObj.setResourceParameters(uResourceInput)
274                     execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
275                 }
276
277                 break
278
279             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
280             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
281                 // fill attachment TP in networkInputParamJson
282                 String customer = resourceInputObj.getGlobalSubscriberId()
283                 String serviceType = resourceInputObj.getServiceType()
284
285                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
286                 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
287
288                 AAIResourcesClient client = new AAIResourcesClient()
289                 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, customer, serviceType).queryParam("service-instance-name", parentServiceName)
290                 ServiceInstances sis = client.get(uri).asBean(ServiceInstances.class).get()
291                 ServiceInstance si = sis.getServiceInstance().get(0)
292
293                 def parentServiceInstanceId = si.getServiceInstanceId()
294                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
295
296                 break
297             default:
298                 break
299         }
300         return resourceInputObj
301     }
302
303     /**
304      * Pre Process the BPMN Flow Request
305      * Includes:
306      * generate the nsOperationKey
307      * generate the nsParameters
308      */
309     public void prepareSDNCRequest (DelegateExecution execution) {
310         logger.info(" ***** Started prepareSDNCRequest *****")
311
312         try {
313             // get variables
314             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
315             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
316             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
317             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
318
319             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
320             String hdrRequestId = execution.getVariable("mso-request-id")
321             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
322             String source = execution.getVariable("source")
323             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
324             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
325             String serviceType = resourceInputObj.getServiceType()
326             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
327             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
328             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
329             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
330             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
331             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
332             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
333             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
334             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
335             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
336             String resourceInputPrameters = resourceInputObj.getResourceParameters()
337             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
338             //here convert json string to xml string
339             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
340             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
341             String sdncTopologyCreateRequest = "";
342
343
344
345             //When a new resource creation request reaches SO, the parent resources information needs to be provided
346             //while creating the child resource.
347             String vnfid = ""
348             String vnfmodelInvariantUuid = ""
349             String vnfmodelCustomizationUuid = ""
350             String vnfmodelUuid = ""
351             String vnfmodelVersion = ""
352             String vnfmodelName = ""
353             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
354             if(modelType.equalsIgnoreCase(ResourceType.GROUP.toString())) {
355                 vnfid = resourceInputObj.getVnfId()
356                 ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
357                 vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
358                 vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
359                 vnfmodelUuid = vfModelInfo.getModelUuid()
360                 vnfmodelVersion = vfModelInfo.getModelVersion()
361                 vnfmodelName = vfModelInfo.getModelName()
362             }
363
364             switch (modelType) {
365                 case "VNF" :
366                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
367                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
368                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
369                                  <sdncadapter:RequestHeader>
370                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
371                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
372                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
373                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
374                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
375                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
376                                  </sdncadapter:RequestHeader>
377                                  <sdncadapterworkflow:SDNCRequestData>
378                                      <request-information>
379                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
380                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
381                                         <source>${msoUtils.xmlEscape(source)}</source>
382                                         <notification-url></notification-url>
383                                         <order-number></order-number>
384                                         <order-version></order-version>
385                                      </request-information>
386                                      <service-information>
387                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
388                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
389                                         <onap-model-information>
390                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
391                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
392                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
393                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
394                                         </onap-model-information>
395                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
396                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
397                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
398                                      </service-information>
399                                      <vnf-information>
400                                         <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
401                                         <vnf-type></vnf-type>
402                                         <onap-model-information>
403                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
404                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
405                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
406                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
407                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
408                                         </onap-model-information>
409                                      </vnf-information>
410                                      <vnf-request-input>
411                                          <vnf-input-parameters>
412                                            $netowrkInputParameters
413                                          </vnf-input-parameters>
414                                          <request-version></request-version>
415                                          <vnf-name></vnf-name>
416                                          <vnf-networks>
417                                         </vnf-networks>
418                                       </vnf-request-input>
419                                 </sdncadapterworkflow:SDNCRequestData>
420                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
421                     break
422                 case "GROUP" :
423                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
424                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
425                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
426                                  <sdncadapter:RequestHeader>
427                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
428                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
429                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
430                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
431                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
432                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
433                                  </sdncadapter:RequestHeader>
434                                  <sdncadapterworkflow:SDNCRequestData>
435                                      <request-information>
436                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
437                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
438                                         <source>${msoUtils.xmlEscape(source)}</source>
439                                         <notification-url></notification-url>
440                                         <order-number></order-number>
441                                         <order-version></order-version>
442                                      </request-information>
443                                      <service-information>
444                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
445                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
446                                         <onap-model-information>
447                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
448                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
449                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
450                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
451                                         </onap-model-information>
452                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
453                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
454                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
455                                      </service-information>
456                                      <vnf-information>
457                                         <onap-model-information>
458                                              <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
459                                              <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
460                                              <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
461                                              <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
462                                              <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
463                                         </onap-model-information>
464                                         <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
465                                      </vnf-information>
466                                      <vf-module-information>
467                                         <from-preload>false</from-preload>
468                                         <onap-model-information>
469                                             <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
470                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
471                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
472                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
473                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
474                                         </onap-model-information>
475                                      </vf-module-information>
476                                      <vf-module-request-input>
477                                          <vf-module-input-parameters>
478                                            $netowrkInputParameters
479                                          </vf-module-input-parameters>
480                                       </vf-module-request-input>
481                                 </sdncadapterworkflow:SDNCRequestData>
482                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
483                     break
484
485             // for SDWANConnectivity and SOTNConnectivity:
486                 default:
487                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
488                                                xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
489                                                xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
490                                   <sdncadapter:RequestHeader>
491                                      <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
492                                      <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
493                                      <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
494                                      <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
495                                      <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
496                                      <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
497                                   </sdncadapter:RequestHeader>
498                                   <sdncadapterworkflow:SDNCRequestData>
499                                       <request-information>
500                                          <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
501                                          <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
502                                          <source>${msoUtils.xmlEscape(source)}</source>
503                                          <notification-url></notification-url>
504                                          <order-number></order-number>
505                                          <order-version></order-version>
506                                       </request-information>
507                                       <service-information>
508                                          <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
509                                          <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
510                                          <onap-model-information>
511                                               <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
512                                               <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
513                                               <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
514                                               <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
515                                          </onap-model-information>
516                                          <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
517                                          <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
518                                       </service-information>
519                                       <network-information>
520                                          <onap-model-information>
521                                               <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
522                                               <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
523                                               <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
524                                               <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
525                                               <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
526                                          </onap-model-information>
527                                       </network-information>
528                                       <network-request-input>
529                                         <network-input-parameters>$netowrkInputParameters</network-input-parameters>
530                                       </network-request-input>
531                                  </sdncadapterworkflow:SDNCRequestData>
532                               </aetgt:SDNCAdapterWorkflowRequest>""".trim()
533
534
535             }
536
537
538
539
540             //switch (modelName) {
541             //    case ~/[\w\s\W]*deviceVF[\w\s\W]*/
542             //    case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
543             //    case ~/[\w\s\W]*SiteVF[\w\s\W]*/:
544             /*        sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
545                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
546                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
547                                  <sdncadapter:RequestHeader>
548                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
549                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
550                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
551                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
552                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
553                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
554                                  </sdncadapter:RequestHeader>
555                                  <sdncadapterworkflow:SDNCRequestData>
556                                      <request-information>
557                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
558                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
559                                         <source>${msoUtils.xmlEscape(source)}</source>
560                                         <notification-url></notification-url>
561                                         <order-number></order-number>
562                                         <order-version></order-version>
563                                      </request-information>
564                                      <service-information>
565                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
566                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
567                                         <onap-model-information>
568                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
569                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
570                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
571                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
572                                         </onap-model-information>
573                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
574                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
575                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
576                                      </service-information>
577                                      <vnf-information>
578                                         <vnf-id></vnf-id>
579                                         <vnf-type></vnf-type>
580                                         <onap-model-information>
581                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
582                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
583                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
584                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
585                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
586                                         </onap-model-information>
587                                      </vnf-information>
588                                      <vnf-request-input>
589                                          <vnf-input-parameters>
590                                            $netowrkInputParameters
591                                          </vnf-input-parameters>
592                                          <request-version></request-version>
593                                          <vnf-name></vnf-name>
594                                          <vnf-networks>
595                                         </vnf-networks>
596                                       </vnf-request-input>
597                                 </sdncadapterworkflow:SDNCRequestData>
598                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
599
600
601                     break
602
603                 //case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/
604             //case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
605             /*    sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
606                                                           xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
607                                                           xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
608                              <sdncadapter:RequestHeader>
609                                 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
610                                 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
611                                 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
612                                 <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
613                                 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
614                                 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
615                              </sdncadapter:RequestHeader>
616                              <sdncadapterworkflow:SDNCRequestData>
617                                  <request-information>
618                                     <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
619                                     <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
620                                     <source>${msoUtils.xmlEscape(source)}</source>
621                                     <notification-url></notification-url>
622                                     <order-number></order-number>
623                                     <order-version></order-version>
624                                  </request-information>
625                                  <service-information>
626                                     <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
627                                     <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
628                                     <onap-model-information>
629                                          <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
630                                          <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
631                                          <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
632                                          <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
633                                     </onap-model-information>
634                                     <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
635                                     <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
636                                     <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
637                                  </service-information><vnf-information>
638                                     <vnf-id></vnf-id>
639                                     <vnf-type></vnf-type>
640                                     <onap-model-information>
641                                          <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
642                                          <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
643                                          <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
644                                          <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
645                                          <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
646                                     </onap-model-information>
647                                  </vnf-information>
648                                  <vnf-request-input>
649                                      <vnf-input-parameters>
650                                        $netowrkInputParameters
651                                      </vnf-input-parameters>
652                                      <request-version></request-version>
653                                      <vnf-name></vnf-name>
654                                      <vnf-networks>
655                                     </vnf-networks>
656                                   </vnf-request-input>
657                                  <allotted-resource-information>
658                                     <!-- TODO: to be filled as per the request input -->
659                                     <allotted-resource-id></allotted-resource-id>
660                                     <allotted-resource-type></allotted-resource-type>
661                                     <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
662                                     <onap-model-information>
663                                          <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
664                                          <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
665                                          <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
666                                          <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
667                                          <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
668                                     </onap-model-information>
669                                  </allotted-resource-information>
670                                  <connection-attachment-request-input>
671                                    $netowrkInputParameters
672                                  </connection-attachment-request-input>
673                             </sdncadapterworkflow:SDNCRequestData>
674                          </aetgt:SDNCAdapterWorkflowRequest>""".trim()
675                 break
676
677             // for SDWANConnectivity and SOTNConnectivity:
678             default:
679                 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
680                                                           xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
681                                                           xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
682                              <sdncadapter:RequestHeader>
683                                 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
684                                 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
685                                 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
686                                 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
687                                 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
688                                 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
689                              </sdncadapter:RequestHeader>
690                              <sdncadapterworkflow:SDNCRequestData>
691                                  <request-information>
692                                     <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
693                                     <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
694                                     <source>${msoUtils.xmlEscape(source)}</source>
695                                     <notification-url></notification-url>
696                                     <order-number></order-number>
697                                     <order-version></order-version>
698                                  </request-information>
699                                  <service-information>
700                                     <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
701                                     <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
702                                     <onap-model-information>
703                                          <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
704                                          <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
705                                          <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
706                                          <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
707                                     </onap-model-information>
708                                     <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
709                                     <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
710                                  </service-information>
711                                  <network-information>
712                                     <onap-model-information>
713                                          <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
714                                          <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
715                                          <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
716                                          <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
717                                          <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
718                                     </onap-model-information>
719                                  </network-information>
720                                  <network-request-input>
721                                    <network-input-parameters>$netowrkInputParameters</network-input-parameters>
722                                  </network-request-input>
723                             </sdncadapterworkflow:SDNCRequestData>
724                          </aetgt:SDNCAdapterWorkflowRequest>""".trim()
725         }
726
727         **/
728
729             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
730             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
731             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
732
733         } catch (Exception ex) {
734             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
735             logger.debug(exceptionMessage)
736             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
737
738         }
739         logger.info(" ***** Exit prepareSDNCRequest *****")
740     }
741
742     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
743         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
744         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
745         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
746     }
747
748     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
749         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
750         String operType = resourceInputObj.getOperationType()
751         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
752         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
753         String operationId = resourceInputObj.getOperationId()
754         String progress = "20"
755         String status = "processing"
756         String statusDescription = "SDCN resource creation invoked"
757
758         execution.getVariable("operationId")
759
760         String body = """
761                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
762                         xmlns:ns="http://org.onap.so/requestsdb">
763                         <soapenv:Header/>
764                 <soapenv:Body>
765                     <ns:updateResourceOperationStatus>
766                                <operType>${msoUtils.xmlEscape(operType)}</operType>
767                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
768                                <progress>${msoUtils.xmlEscape(progress)}</progress>
769                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
770                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
771                                <status>${msoUtils.xmlEscape(status)}</status>
772                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
773                     </ns:updateResourceOperationStatus>
774                 </soapenv:Body>
775                 </soapenv:Envelope>""";
776
777         setProgressUpdateVariables(execution, body)
778
779     }
780
781     public void prepareUpdateAfterCreateSDNCResource(execution) {
782         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
783         String operType = resourceInputObj.getOperationType()
784         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
785         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
786         String operationId = resourceInputObj.getOperationId()
787         String progress = "100"
788         String status = "finished"
789         String statusDescription = "SDCN resource creation and activation completed"
790
791         execution.getVariable("operationId")
792
793         String body = """
794                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
795                         xmlns:ns="http://org.onap.so/requestsdb">
796                         <soapenv:Header/>
797                 <soapenv:Body>
798                     <ns:updateResourceOperationStatus>
799                                <operType>${msoUtils.xmlEscape(operType)}</operType>
800                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
801                                <progress>${msoUtils.xmlEscape(progress)}</progress>
802                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
803                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
804                                <status>${msoUtils.xmlEscape(status)}</status>
805                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
806                     </ns:updateResourceOperationStatus>
807                 </soapenv:Body>
808                 </soapenv:Envelope>""";
809
810         setProgressUpdateVariables(execution, body)
811     }
812
813     public void afterCreateSDNCCall(DelegateExecution execution){
814         logger.info(" ***** Started prepareSDNCRequest *****")
815         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
816         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
817
818         def instnaceId = getInstnaceId(execution)
819         execution.setVariable("resourceInstanceId", instnaceId)
820
821         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
822         logger.info(" ***** Exit prepareSDNCRequest *****")
823     }
824
825     private def getInstnaceId(DelegateExecution execution) {
826         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
827
828         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
829         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
830         def val = ""
831
832
833         //switch (modelName) {
834         //    case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
835         //    case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
836         //    case ~/[\w\s\W]*Site[\w\s\W]*/:
837         //        val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
838         //          break
839
840         //    case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
841         //   case ~/[\w\s\W]*sotnvpprepareUpdateAfterCreateSDNCResourcenattachment[\w\s\W]*/:
842         //        val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
843         //        break
844
845         // for SDWANConnectivity and SOTNConnectivity and default:
846         //    default:
847         //        val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
848         //        break
849         //}
850
851
852         String modelType = resourceInputObj.getResourceModelInfo().getModelType()
853         switch (modelType) {
854             case "VNF" :
855                 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
856                 break
857             case "GROUP":
858                 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
859                 break
860             default:
861                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
862                 break
863         }
864         return val.toString()
865     }
866
867     public void sendSyncResponse (DelegateExecution execution) {
868         logger.debug(" *** sendSyncResponse *** ")
869
870         try {
871             String operationStatus = "finished"
872             // RESTResponse for main flow
873             String vnfid=execution.getVariable("resourceInstanceId");
874             String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
875             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
876             sendWorkflowResponse(execution, 202, resourceOperationResp)
877             execution.setVariable("sentSyncResponse", true)
878
879         } catch (Exception ex) {
880             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
881             logger.debug(msg)
882             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
883         }
884         logger.debug(" ***** Exit sendSyncResponse *****")
885     }
886 }