Bug fix for getInstnaceId
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / CreateSDNCNetworkResource.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - SO
4  * ================================================================================
5  * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.bpmn.infrastructure.scripts
22
23 import org.apache.commons.lang3.*
24 import org.camunda.bpm.engine.delegate.BpmnError
25 import org.camunda.bpm.engine.delegate.DelegateExecution
26 import org.json.JSONObject
27 import org.json.XML
28 import org.onap.aai.domain.yang.ServiceInstance
29 import org.onap.aai.domain.yang.ServiceInstances
30 import org.onap.so.bpmn.common.recipe.ResourceInput
31 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
32 import org.onap.so.bpmn.common.scripts.AaiUtil
33 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
34 import org.onap.so.bpmn.common.scripts.ExceptionUtil
35 import org.onap.so.bpmn.common.scripts.MsoUtils
36 import org.onap.so.bpmn.core.json.JsonUtils
37 import org.onap.so.bpmn.core.UrnPropertiesReader
38 import org.onap.so.client.aai.AAIObjectPlurals
39 import org.onap.so.client.aai.AAIResourcesClient
40 import org.onap.so.client.aai.entities.uri.AAIResourceUri
41 import org.onap.so.client.aai.entities.uri.AAIUriFactory
42 import org.onap.so.logger.MsoLogger
43
44 import static org.apache.commons.lang3.StringUtils.*
45
46 /**
47  * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
48  * flow for SDNC Network Resource Create
49  */
50 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
51
52     private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, CreateSDNCNetworkResource.class);
53     String Prefix="CRESDNCRES_"
54
55     ExceptionUtil exceptionUtil = new ExceptionUtil()
56
57     JsonUtils jsonUtil = new JsonUtils()
58
59     MsoUtils msoUtils = new MsoUtils()
60
61     public void preProcessRequest(DelegateExecution execution){
62
63         msoLogger.info(" ***** Started preProcessRequest *****")
64         try {
65
66             //get bpmn inputs from resource request.
67             String requestId = execution.getVariable("mso-request-id")
68             String requestAction = execution.getVariable("requestAction")
69             msoLogger.info("The requestAction is: " + requestAction)
70             String recipeParamsFromRequest = execution.getVariable("recipeParams")
71             msoLogger.info("The recipeParams is: " + recipeParamsFromRequest)
72             String resourceInput = execution.getVariable("resourceInput")
73             msoLogger.info("The resourceInput is: " + resourceInput)
74             //Get ResourceInput Object
75             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
76             execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
77
78             //Deal with recipeParams
79             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
80             String resourceName = resourceInputObj.getResourceInstanceName()
81             //For sdnc requestAction default is "createNetworkInstance"
82             String operationType = "Network"
83             if(!StringUtils.isBlank(recipeParamsFromRequest)){
84                 //the operationType from worflow(first node) is second priority.
85                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
86             }
87             if(!StringUtils.isBlank(recipeParamsFromWf)){
88                 //the operationType from worflow(first node) is highest priority.
89                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
90             }
91
92
93             //For sdnc, generate svc_action and request_action
94             String sdnc_svcAction = "create"
95             switch (resourceInputObj.getResourceInstanceName()) {
96
97                 case ~/[\w\s\W]*overlay[\w\s\W]*/ :
98                     //This will be resolved in R3.
99                     sdnc_svcAction ="activate"
100                     operationType = "NCINetwork"
101                     break
102
103                 case ~/[\w\s\W]*underlay[\w\s\W]*/ :
104                     //This will be resolved in R3.
105                     operationType ="Network"
106                     break
107
108                 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/ :
109                     operationType = "SOTNConnectivity"
110                     execution.setVariable("isActivateRequired", "true")
111                     break
112
113                 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
114                     operationType = "SOTNAttachment"
115                     execution.setVariable("isActivateRequired", "true")
116                     break
117
118                 case ~/[\w\s\W]*SiteVF[\w\s\W]*/ :
119                     operationType = "Site"
120                     execution.setVariable("isActivateRequired", "true")
121                     break
122
123                 case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
124                     operationType = "SDWANDevice"
125                     execution.setVariable("isActivateRequired", "true")
126                     break
127
128                 case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
129                     operationType = "SDWANPort"
130                     execution.setVariable("isActivateRequired", "true")
131                     break
132
133                 case ~/[\w\s\W]*SDWANConnectivity[\w\s\W]*/ :
134                     operationType = "SDWANConnectivity"
135                     execution.setVariable("isActivateRequired", "true")
136                     break
137
138                 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
139                     operationType = "SDWANAttachment"
140                     execution.setVariable("isActivateRequired", "true")
141                     break
142
143                 case ~/[\w\s\W]*wanconnection[\w\s\W]*/ :
144                     execution.setVariable("isActivateRequired", "true")
145                     break
146
147                 default:
148                     break
149             }
150
151             String sdnc_requestAction = StringUtils.capitalize(sdnc_svcAction) + operationType +"Instance"
152             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
153             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
154             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
155             execution.setVariable("mso-request-id", requestId)
156             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
157         } catch (BpmnError e) {
158             throw e;
159         } catch (Exception ex){
160             msg = "Exception in preProcessRequest " + ex.getMessage()
161             msoLogger.debug(msg)
162             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
163         }
164     }
165
166     String customizeResourceParam(String networkInputParametersJson) {
167         List<Map<String, Object>> paramList = new ArrayList();
168         JSONObject jsonObject = new JSONObject(networkInputParametersJson);
169         Iterator iterator = jsonObject.keys();
170         while (iterator.hasNext()) {
171             String key = iterator.next();
172             HashMap<String, String> hashMap = new HashMap();
173             hashMap.put("name", key);
174             hashMap.put("value", jsonObject.get(key))
175             paramList.add(hashMap)
176         }
177         Map<String, List<Map<String, Object>>> paramMap = new HashMap();
178         paramMap.put("param", paramList);
179
180         return  new JSONObject(paramMap).toString();
181     }
182
183     /**
184      * This method updates the resource input by collecting required info from AAI
185      * @param execution
186      */
187     public void updateResourceInput(DelegateExecution execution) {
188         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
189         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
190
191         switch (modelName) {
192             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
193
194                 def resourceInput = resourceInputObj.getResourceParameters()
195                 String incomingRequest = resourceInputObj.getRequestsInputs()
196                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
197                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
198                 JSONObject inputParameters = new JSONObject(requestInputs)
199                 if(inputParameters.has("local-access-provider-id")) {
200                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
201                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
202                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
203                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
204                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
205                     resourceInputObj.setResourceParameters(uResourceInput)
206                     execution.setVariable(Prefix + "resourceInput", resourceInputObj)
207                 }
208
209                 break
210
211             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
212             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
213                 // fill attachment TP in networkInputParamJson
214                 String customer = resourceInputObj.getGlobalSubscriberId()
215                 String serviceType = resourceInputObj.getServiceType()
216
217                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
218                 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
219
220                                 AAIResourcesClient client = new AAIResourcesClient()
221                                 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, customer, serviceType).queryParam("service-instance-name", parentServiceName)
222                                 ServiceInstances sis = client.get(uri).asBean(ServiceInstances.class).get()
223                                 ServiceInstance si = sis.getServiceInstance().get(0)
224
225                                 def parentServiceInstanceId = si.getServiceInstanceId()
226                                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
227
228                 break
229             default:
230                 break
231         }
232     }
233
234     /**
235      * Pre Process the BPMN Flow Request
236      * Includes:
237      * generate the nsOperationKey
238      * generate the nsParameters
239      */
240     public void prepareSDNCRequest (DelegateExecution execution) {
241         msoLogger.info(" ***** Started prepareSDNCRequest *****")
242
243         try {
244             // get variables
245             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
246             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
247             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
248             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
249
250             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
251             String hdrRequestId = execution.getVariable("mso-request-id")
252             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
253             String source = execution.getVariable("source")
254             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
255             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
256             String serviceType = resourceInputObj.getServiceType()
257             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
258             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
259             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
260             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
261             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
262             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
263             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
264             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
265             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
266             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
267             String resourceInputPrameters = resourceInputObj.getResourceParameters()
268             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
269             //here convert json string to xml string
270             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
271             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
272             String sdncTopologyCreateRequest = ""
273
274             switch (modelName) {
275                 case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
276                 case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
277                 case ~/[\w\s\W]*SiteVF[\w\s\W]*/:
278                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
279                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
280                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
281                                  <sdncadapter:RequestHeader>
282                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
283                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
284                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
285                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
286                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
287                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
288                                  </sdncadapter:RequestHeader>
289                                  <sdncadapterworkflow:SDNCRequestData>
290                                      <request-information>
291                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
292                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
293                                         <source>${msoUtils.xmlEscape(source)}</source>
294                                         <notification-url></notification-url>
295                                         <order-number></order-number>
296                                         <order-version></order-version>
297                                      </request-information>
298                                      <service-information>
299                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
300                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
301                                         <onap-model-information>
302                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
303                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
304                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
305                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
306                                         </onap-model-information>
307                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
308                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
309                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
310                                      </service-information>
311                                      <vnf-information>
312                                         <vnf-id></vnf-id>
313                                         <vnf-type></vnf-type>
314                                         <onap-model-information>
315                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
316                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
317                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
318                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
319                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
320                                         </onap-model-information>
321                                      </vnf-information>
322                                      <vnf-request-input>
323                                          <vnf-input-parameters>
324                                            $netowrkInputParameters
325                                          </vnf-input-parameters>
326                                          <request-version></request-version>
327                                          <vnf-name></vnf-name>
328                                          <vnf-networks>
329                                         </vnf-networks>
330                                       </vnf-request-input>
331                                 </sdncadapterworkflow:SDNCRequestData>
332                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
333                     break
334
335                 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
336                 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
337                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
338                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
339                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
340                                  <sdncadapter:RequestHeader>
341                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
342                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
343                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
344                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
345                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
346                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
347                                  </sdncadapter:RequestHeader>
348                                  <sdncadapterworkflow:SDNCRequestData>
349                                      <request-information>
350                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
351                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
352                                         <source>${msoUtils.xmlEscape(source)}</source>
353                                         <notification-url></notification-url>
354                                         <order-number></order-number>
355                                         <order-version></order-version>
356                                      </request-information>
357                                      <service-information>
358                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
359                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
360                                         <onap-model-information>
361                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
362                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
363                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
364                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
365                                         </onap-model-information>
366                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
367                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
368                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
369                                      </service-information>
370                                      <allotted-resource-information>
371                                         <!-- TODO: to be filled as per the request input -->
372                                         <allotted-resource-id></allotted-resource-id>
373                                         <allotted-resource-type></allotted-resource-type>
374                                         <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
375                                         <onap-model-information>
376                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
377                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
378                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
379                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
380                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
381                                         </onap-model-information>
382                                      </allotted-resource-information>
383                                      <connection-attachment-request-input>
384                                        $netowrkInputParameters
385                                      </connection-attachment-request-input>
386                                 </sdncadapterworkflow:SDNCRequestData>
387                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
388                     break
389
390             // for SDWANConnectivity and SOTNConnectivity:
391                 default:
392                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
393                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
394                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
395                                  <sdncadapter:RequestHeader>
396                                     <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
397                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
398                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
399                                     <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
400                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
401                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
402                                  </sdncadapter:RequestHeader>
403                                  <sdncadapterworkflow:SDNCRequestData>
404                                      <request-information>
405                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
406                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
407                                         <source>${msoUtils.xmlEscape(source)}</source>
408                                         <notification-url></notification-url>
409                                         <order-number></order-number>
410                                         <order-version></order-version>
411                                      </request-information>
412                                      <service-information>
413                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
414                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
415                                         <onap-model-information>
416                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
417                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
418                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
419                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
420                                         </onap-model-information>
421                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
422                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
423                                      </service-information>
424                                      <network-information>
425                                         <onap-model-information>
426                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
427                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
428                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
429                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
430                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
431                                         </onap-model-information>
432                                      </network-information>
433                                      <network-request-input>
434                                        <network-input-parameters>$netowrkInputParameters</network-input-parameters>
435                                      </network-request-input>
436                                 </sdncadapterworkflow:SDNCRequestData>
437                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
438             }
439
440             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
441             utils.logAudit(sndcTopologyCreateRequesAsString)
442             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
443             msoLogger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
444
445         } catch (Exception ex) {
446             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
447             msoLogger.debug(exceptionMessage)
448             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
449
450         }
451         msoLogger.info(" ***** Exit prepareSDNCRequest *****")
452     }
453
454     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
455         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
456         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
457         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
458     }
459
460     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
461         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
462         String operType = resourceInputObj.getOperationType()
463         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
464         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
465         String operationId = resourceInputObj.getOperationId()
466         String progress = "20"
467         String status = "processing"
468         String statusDescription = "SDCN resource creation invoked"
469
470         execution.getVariable("operationId")
471
472         String body = """
473                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
474                         xmlns:ns="http://org.onap.so/requestsdb">
475                         <soapenv:Header/>
476                 <soapenv:Body>
477                     <ns:updateResourceOperationStatus>
478                                <operType>${msoUtils.xmlEscape(operType)}</operType>
479                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
480                                <progress>${msoUtils.xmlEscape(progress)}</progress>
481                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
482                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
483                                <status>${msoUtils.xmlEscape(status)}</status>
484                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
485                     </ns:updateResourceOperationStatus>
486                 </soapenv:Body>
487                 </soapenv:Envelope>""";
488
489         setProgressUpdateVariables(execution, body)
490
491     }
492
493     public void prepareUpdateAfterCreateSDNCResource(execution) {
494         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
495         String operType = resourceInputObj.getOperationType()
496         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
497         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
498         String operationId = resourceInputObj.getOperationId()
499         String progress = "100"
500         String status = "finished"
501         String statusDescription = "SDCN resource creation and activation completed"
502
503         execution.getVariable("operationId")
504
505         String body = """
506                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
507                         xmlns:ns="http://org.onap.so/requestsdb">
508                         <soapenv:Header/>
509                 <soapenv:Body>
510                     <ns:updateResourceOperationStatus>
511                                <operType>${msoUtils.xmlEscape(operType)}</operType>
512                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
513                                <progress>${msoUtils.xmlEscape(progress)}</progress>
514                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
515                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
516                                <status>${msoUtils.xmlEscape(status)}</status>
517                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
518                     </ns:updateResourceOperationStatus>
519                 </soapenv:Body>
520                 </soapenv:Envelope>""";
521
522         setProgressUpdateVariables(execution, body)
523     }
524
525     public void afterCreateSDNCCall(DelegateExecution execution){
526         msoLogger.info(" ***** Started prepareSDNCRequest *****")
527         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
528         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
529
530         def isActivateRequried = execution.getVariable("isActivateRequired")
531         if (StringUtils.equalsIgnoreCase(isActivateRequried, "true")) {
532             def instnaceId = getInstnaceId(execution)
533             execution.setVariable("networkInstanceId", instnaceId)
534         }
535
536         msoLogger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
537         msoLogger.info(" ***** Exit prepareSDNCRequest *****")
538     }
539
540     private def getInstnaceId(DelegateExecution execution) {
541         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
542         def data = response.toString()
543         data = data.substring(data.indexOf("<"))
544
545         def resp = new XmlSlurper().parseText(data)
546         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
547         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
548         def val = ""
549
550         switch (modelName) {
551             case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
552             case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
553             case ~/[\w\s\W]*Site[\w\s\W]*/:
554                 val = resp."vnf-response-information"."instance-id"
555                 break
556
557             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
558             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/:
559                 val = resp."connection-attachment-response-information"."instance-id"
560                 break
561
562             // for SDWANConnectivity and SOTNConnectivity and default:
563             default:
564                 val = resp."network-response-information"."instance-id"
565                 break
566         }
567
568         return val.toString()
569     }
570
571     public void sendSyncResponse (DelegateExecution execution) {
572         msoLogger.debug(" *** sendSyncResponse *** ")
573
574         try {
575             String operationStatus = "finished"
576             // RESTResponse for main flow
577             String resourceOperationResp = """{"operationStatus":"${operationStatus}"}""".trim()
578             msoLogger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
579             sendWorkflowResponse(execution, 202, resourceOperationResp)
580             execution.setVariable("sentSyncResponse", true)
581
582         } catch (Exception ex) {
583             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
584             msoLogger.debug(msg)
585             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
586         }
587         msoLogger.debug(" ***** Exit sendSyncResponse *****")
588     }
589 }