d431bdc3b420452a48e38721e9b000e1accbc274
[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.remote_id", remoteId)
205                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
206                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
207                 logger.debug("old resource input:" + resourceInputObj.toString())
208                 resourceInputObj.setResourceParameters(uResourceInput)
209                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
210                 logger.debug("new resource Input :" + resourceInputObj.toString())
211                 break
212
213             case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ :
214                 // get the required properties and update in resource input
215                 def resourceInput = resourceInputObj.getResourceParameters()
216                 String incomingRequest = resourceInputObj.getRequestsInputs()
217                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
218                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
219                 JSONObject inputParameters = new JSONObject(requestInputs)
220
221                 String cvlan
222                 String svlan
223                 String remoteId
224                 String manufacturer = jsonUtil.getJsonValue(serInput,
225                         "service.parameters.requestInputs.ont_ont_manufacturer")
226
227                 String ontsn = jsonUtil.getJsonValue(serInput,
228                         "service.parameters.requestInputs.ont_ont_serial_num")
229
230                 List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
231                         resourceInputObj.getServiceType(),
232                         resourceInputObj.getServiceInstanceId())
233                 for(Metadatum datum: metadatum) {
234                     if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
235                         cvlan = datum.getMetaval()
236                     }
237
238                     if (datum.getMetaname().equalsIgnoreCase("svlan")) {
239                         svlan = datum.getMetaval()
240                     }
241
242                     if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
243                         remoteId = datum.getMetaval()
244                     }
245                 }
246
247                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
248                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
249                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
250                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_access_id", remoteId)
251                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
252                 logger.debug("old resource input:" + resourceInputObj.toString())
253                 resourceInputObj.setResourceParameters(uResourceInput)
254                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
255                 logger.debug("new resource Input :" + resourceInputObj.toString())
256                 break
257
258
259             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
260
261                 def resourceInput = resourceInputObj.getResourceParameters()
262                 String incomingRequest = resourceInputObj.getRequestsInputs()
263                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
264                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
265                 JSONObject inputParameters = new JSONObject(requestInputs)
266                 if(inputParameters.has("local-access-provider-id")) {
267                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
268                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
269                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
270                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
271                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
272                     resourceInputObj.setResourceParameters(uResourceInput)
273                     execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
274                 }
275
276                 break
277
278             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
279             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
280                 // fill attachment TP in networkInputParamJson
281                 String customer = resourceInputObj.getGlobalSubscriberId()
282                 String serviceType = resourceInputObj.getServiceType()
283
284                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
285                 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
286
287                 AAIResourcesClient client = new AAIResourcesClient()
288                 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, customer, serviceType).queryParam("service-instance-name", parentServiceName)
289                 ServiceInstances sis = client.get(uri).asBean(ServiceInstances.class).get()
290                 ServiceInstance si = sis.getServiceInstance().get(0)
291
292                 def parentServiceInstanceId = si.getServiceInstanceId()
293                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
294
295                 break
296             default:
297                 break
298         }
299         return resourceInputObj
300     }
301
302     /**
303      * Pre Process the BPMN Flow Request
304      * Includes:
305      * generate the nsOperationKey
306      * generate the nsParameters
307      */
308     public void prepareSDNCRequest (DelegateExecution execution) {
309         logger.info(" ***** Started prepareSDNCRequest *****")
310
311         try {
312             // get variables
313             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
314             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
315             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
316             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
317
318             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
319             String hdrRequestId = execution.getVariable("mso-request-id")
320             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
321             String source = execution.getVariable("source")
322             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
323             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
324             String serviceType = resourceInputObj.getServiceType()
325             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
326             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
327             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
328             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
329             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
330             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
331             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
332             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
333             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
334             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
335             String resourceInputPrameters = resourceInputObj.getResourceParameters()
336             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
337             //here convert json string to xml string
338             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
339             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
340             String sdncTopologyCreateRequest = "";
341
342
343
344             //When a new resource creation request reaches SO, the parent resources information needs to be provided
345             //while creating the child resource.
346             String vnfid = ""
347             String vnfmodelInvariantUuid = ""
348             String vnfmodelCustomizationUuid = ""
349             String vnfmodelUuid = ""
350             String vnfmodelVersion = ""
351             String vnfmodelName = ""
352             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
353             if(modelType.equalsIgnoreCase(ResourceType.GROUP.toString())) {
354                 vnfid = resourceInputObj.getVnfId()
355                 ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
356                 vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
357                 vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
358                 vnfmodelUuid = vfModelInfo.getModelUuid()
359                 vnfmodelVersion = vfModelInfo.getModelVersion()
360                 vnfmodelName = vfModelInfo.getModelName()
361             }
362
363             switch (modelType) {
364                 case "VNF" :
365                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
366                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
367                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
368                                  <sdncadapter:RequestHeader>
369                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
370                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
371                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
372                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
373                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
374                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
375                                  </sdncadapter:RequestHeader>
376                                  <sdncadapterworkflow:SDNCRequestData>
377                                      <request-information>
378                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
379                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
380                                         <source>${msoUtils.xmlEscape(source)}</source>
381                                         <notification-url></notification-url>
382                                         <order-number></order-number>
383                                         <order-version></order-version>
384                                      </request-information>
385                                      <service-information>
386                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
387                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
388                                         <onap-model-information>
389                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
390                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
391                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
392                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
393                                         </onap-model-information>
394                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
395                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
396                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
397                                      </service-information>
398                                      <vnf-information>
399                                         <vnf-type></vnf-type>
400                                         <onap-model-information>
401                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
402                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
403                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
404                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
405                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
406                                         </onap-model-information>
407                                      </vnf-information>
408                                      <vnf-request-input>
409                                          <vnf-input-parameters>
410                                            $netowrkInputParameters
411                                          </vnf-input-parameters>
412                                          <request-version></request-version>
413                                          <vnf-name></vnf-name>
414                                          <vnf-networks>
415                                         </vnf-networks>
416                                       </vnf-request-input>
417                                 </sdncadapterworkflow:SDNCRequestData>
418                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
419                     break
420                 case "GROUP" :
421                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
422                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
423                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
424                                  <sdncadapter:RequestHeader>
425                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
426                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
427                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
428                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
429                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
430                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
431                                  </sdncadapter:RequestHeader>
432                                  <sdncadapterworkflow:SDNCRequestData>
433                                      <request-information>
434                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
435                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
436                                         <source>${msoUtils.xmlEscape(source)}</source>
437                                         <notification-url></notification-url>
438                                         <order-number></order-number>
439                                         <order-version></order-version>
440                                      </request-information>
441                                      <service-information>
442                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
443                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
444                                         <onap-model-information>
445                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
446                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
447                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
448                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
449                                         </onap-model-information>
450                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
451                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
452                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
453                                      </service-information>
454                                      <vnf-information>
455                                         <onap-model-information>
456                                              <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
457                                              <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
458                                              <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
459                                              <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
460                                              <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
461                                         </onap-model-information>
462                                         <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
463                                      </vnf-information>
464                                      <vf-module-information>
465                                         <from-preload>false</from-preload>
466                                         <onap-model-information>
467                                             <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
468                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
469                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
470                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
471                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
472                                         </onap-model-information>
473                                      </vf-module-information>
474                                      <vf-module-request-input>
475                                          <vf-module-input-parameters>
476                                            $netowrkInputParameters
477                                          </vf-module-input-parameters>
478                                       </vf-module-request-input>
479                                 </sdncadapterworkflow:SDNCRequestData>
480                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
481                     break
482
483             // for SDWANConnectivity and SOTNConnectivity:
484                 default:
485                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
486                                                xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
487                                                xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
488                                   <sdncadapter:RequestHeader>
489                                      <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
490                                      <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
491                                      <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
492                                      <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
493                                      <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
494                                      <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
495                                   </sdncadapter:RequestHeader>
496                                   <sdncadapterworkflow:SDNCRequestData>
497                                       <request-information>
498                                          <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
499                                          <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
500                                          <source>${msoUtils.xmlEscape(source)}</source>
501                                          <notification-url></notification-url>
502                                          <order-number></order-number>
503                                          <order-version></order-version>
504                                       </request-information>
505                                       <service-information>
506                                          <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
507                                          <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
508                                          <onap-model-information>
509                                               <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
510                                               <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
511                                               <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
512                                               <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
513                                          </onap-model-information>
514                                          <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
515                                          <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
516                                       </service-information>
517                                       <network-information>
518                                          <onap-model-information>
519                                               <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
520                                               <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
521                                               <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
522                                               <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
523                                               <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
524                                          </onap-model-information>
525                                       </network-information>
526                                       <network-request-input>
527                                         <network-input-parameters>$netowrkInputParameters</network-input-parameters>
528                                       </network-request-input>
529                                  </sdncadapterworkflow:SDNCRequestData>
530                               </aetgt:SDNCAdapterWorkflowRequest>""".trim()
531
532
533             }
534
535
536
537
538             //switch (modelName) {
539             //    case ~/[\w\s\W]*deviceVF[\w\s\W]*/
540             //    case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
541             //    case ~/[\w\s\W]*SiteVF[\w\s\W]*/:
542             /*        sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
543                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
544                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
545                                  <sdncadapter:RequestHeader>
546                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
547                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
548                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
549                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
550                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
551                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
552                                  </sdncadapter:RequestHeader>
553                                  <sdncadapterworkflow:SDNCRequestData>
554                                      <request-information>
555                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
556                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
557                                         <source>${msoUtils.xmlEscape(source)}</source>
558                                         <notification-url></notification-url>
559                                         <order-number></order-number>
560                                         <order-version></order-version>
561                                      </request-information>
562                                      <service-information>
563                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
564                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
565                                         <onap-model-information>
566                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
567                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
568                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
569                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
570                                         </onap-model-information>
571                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
572                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
573                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
574                                      </service-information>
575                                      <vnf-information>
576                                         <vnf-id></vnf-id>
577                                         <vnf-type></vnf-type>
578                                         <onap-model-information>
579                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
580                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
581                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
582                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
583                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
584                                         </onap-model-information>
585                                      </vnf-information>
586                                      <vnf-request-input>
587                                          <vnf-input-parameters>
588                                            $netowrkInputParameters
589                                          </vnf-input-parameters>
590                                          <request-version></request-version>
591                                          <vnf-name></vnf-name>
592                                          <vnf-networks>
593                                         </vnf-networks>
594                                       </vnf-request-input>
595                                 </sdncadapterworkflow:SDNCRequestData>
596                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
597
598
599                     break
600
601                 //case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/
602             //case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
603             /*    sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
604                                                           xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
605                                                           xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
606                              <sdncadapter:RequestHeader>
607                                 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
608                                 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
609                                 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
610                                 <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
611                                 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
612                                 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
613                              </sdncadapter:RequestHeader>
614                              <sdncadapterworkflow:SDNCRequestData>
615                                  <request-information>
616                                     <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
617                                     <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
618                                     <source>${msoUtils.xmlEscape(source)}</source>
619                                     <notification-url></notification-url>
620                                     <order-number></order-number>
621                                     <order-version></order-version>
622                                  </request-information>
623                                  <service-information>
624                                     <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
625                                     <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
626                                     <onap-model-information>
627                                          <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
628                                          <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
629                                          <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
630                                          <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
631                                     </onap-model-information>
632                                     <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
633                                     <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
634                                     <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
635                                  </service-information><vnf-information>
636                                     <vnf-id></vnf-id>
637                                     <vnf-type></vnf-type>
638                                     <onap-model-information>
639                                          <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
640                                          <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
641                                          <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
642                                          <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
643                                          <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
644                                     </onap-model-information>
645                                  </vnf-information>
646                                  <vnf-request-input>
647                                      <vnf-input-parameters>
648                                        $netowrkInputParameters
649                                      </vnf-input-parameters>
650                                      <request-version></request-version>
651                                      <vnf-name></vnf-name>
652                                      <vnf-networks>
653                                     </vnf-networks>
654                                   </vnf-request-input>
655                                  <allotted-resource-information>
656                                     <!-- TODO: to be filled as per the request input -->
657                                     <allotted-resource-id></allotted-resource-id>
658                                     <allotted-resource-type></allotted-resource-type>
659                                     <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
660                                     <onap-model-information>
661                                          <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
662                                          <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
663                                          <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
664                                          <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
665                                          <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
666                                     </onap-model-information>
667                                  </allotted-resource-information>
668                                  <connection-attachment-request-input>
669                                    $netowrkInputParameters
670                                  </connection-attachment-request-input>
671                             </sdncadapterworkflow:SDNCRequestData>
672                          </aetgt:SDNCAdapterWorkflowRequest>""".trim()
673                 break
674
675             // for SDWANConnectivity and SOTNConnectivity:
676             default:
677                 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
678                                                           xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
679                                                           xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
680                              <sdncadapter:RequestHeader>
681                                 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
682                                 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
683                                 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
684                                 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
685                                 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
686                                 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
687                              </sdncadapter:RequestHeader>
688                              <sdncadapterworkflow:SDNCRequestData>
689                                  <request-information>
690                                     <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
691                                     <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
692                                     <source>${msoUtils.xmlEscape(source)}</source>
693                                     <notification-url></notification-url>
694                                     <order-number></order-number>
695                                     <order-version></order-version>
696                                  </request-information>
697                                  <service-information>
698                                     <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
699                                     <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
700                                     <onap-model-information>
701                                          <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
702                                          <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
703                                          <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
704                                          <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
705                                     </onap-model-information>
706                                     <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
707                                     <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
708                                  </service-information>
709                                  <network-information>
710                                     <onap-model-information>
711                                          <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
712                                          <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
713                                          <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
714                                          <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
715                                          <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
716                                     </onap-model-information>
717                                  </network-information>
718                                  <network-request-input>
719                                    <network-input-parameters>$netowrkInputParameters</network-input-parameters>
720                                  </network-request-input>
721                             </sdncadapterworkflow:SDNCRequestData>
722                          </aetgt:SDNCAdapterWorkflowRequest>""".trim()
723         }
724
725         **/
726
727             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
728             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
729             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
730
731         } catch (Exception ex) {
732             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
733             logger.debug(exceptionMessage)
734             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
735
736         }
737         logger.info(" ***** Exit prepareSDNCRequest *****")
738     }
739
740     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
741         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
742         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
743         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
744     }
745
746     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
747         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
748         String operType = resourceInputObj.getOperationType()
749         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
750         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
751         String operationId = resourceInputObj.getOperationId()
752         String progress = "20"
753         String status = "processing"
754         String statusDescription = "SDCN resource creation invoked"
755
756         execution.getVariable("operationId")
757
758         String body = """
759                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
760                         xmlns:ns="http://org.onap.so/requestsdb">
761                         <soapenv:Header/>
762                 <soapenv:Body>
763                     <ns:updateResourceOperationStatus>
764                                <operType>${msoUtils.xmlEscape(operType)}</operType>
765                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
766                                <progress>${msoUtils.xmlEscape(progress)}</progress>
767                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
768                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
769                                <status>${msoUtils.xmlEscape(status)}</status>
770                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
771                     </ns:updateResourceOperationStatus>
772                 </soapenv:Body>
773                 </soapenv:Envelope>""";
774
775         setProgressUpdateVariables(execution, body)
776
777     }
778
779     public void prepareUpdateAfterCreateSDNCResource(execution) {
780         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
781         String operType = resourceInputObj.getOperationType()
782         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
783         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
784         String operationId = resourceInputObj.getOperationId()
785         String progress = "100"
786         String status = "finished"
787         String statusDescription = "SDCN resource creation and activation completed"
788
789         execution.getVariable("operationId")
790
791         String body = """
792                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
793                         xmlns:ns="http://org.onap.so/requestsdb">
794                         <soapenv:Header/>
795                 <soapenv:Body>
796                     <ns:updateResourceOperationStatus>
797                                <operType>${msoUtils.xmlEscape(operType)}</operType>
798                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
799                                <progress>${msoUtils.xmlEscape(progress)}</progress>
800                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
801                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
802                                <status>${msoUtils.xmlEscape(status)}</status>
803                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
804                     </ns:updateResourceOperationStatus>
805                 </soapenv:Body>
806                 </soapenv:Envelope>""";
807
808         setProgressUpdateVariables(execution, body)
809     }
810
811     public void afterCreateSDNCCall(DelegateExecution execution){
812         logger.info(" ***** Started prepareSDNCRequest *****")
813         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
814         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
815
816         def instnaceId = getInstnaceId(execution)
817         execution.setVariable("resourceInstanceId", instnaceId)
818
819         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
820         logger.info(" ***** Exit prepareSDNCRequest *****")
821     }
822
823     private def getInstnaceId(DelegateExecution execution) {
824         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
825
826         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
827         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
828         def val = ""
829
830
831         //switch (modelName) {
832         //    case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
833         //    case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
834         //    case ~/[\w\s\W]*Site[\w\s\W]*/:
835         //        val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
836         //          break
837
838         //    case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
839         //   case ~/[\w\s\W]*sotnvpprepareUpdateAfterCreateSDNCResourcenattachment[\w\s\W]*/:
840         //        val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
841         //        break
842
843         // for SDWANConnectivity and SOTNConnectivity and default:
844         //    default:
845         //        val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
846         //        break
847         //}
848
849
850         String modelType = resourceInputObj.getResourceModelInfo().getModelType()
851         switch (modelType) {
852             case "VNF" :
853                 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
854                 break
855             case "GROUP":
856                 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
857                 break
858             default:
859                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
860                 break
861         }
862         return val.toString()
863     }
864
865     public void sendSyncResponse (DelegateExecution execution) {
866         logger.debug(" *** sendSyncResponse *** ")
867
868         try {
869             String operationStatus = "finished"
870             // RESTResponse for main flow
871             String vnfid=execution.getVariable("resourceInstanceId");
872             String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
873             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
874             sendWorkflowResponse(execution, 202, resourceOperationResp)
875             execution.setVariable("sentSyncResponse", true)
876
877         } catch (Exception ex) {
878             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
879             logger.debug(msg)
880             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
881         }
882         logger.debug(" ***** Exit sendSyncResponse *****")
883     }
884 }