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