bb2116acb99fdfb8ba5063343f6fea7634bce551
[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 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             utils.logAudit(sndcTopologyCreateRequesAsString)
445             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
446             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
447
448         } catch (Exception ex) {
449             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
450             logger.debug(exceptionMessage)
451             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
452
453         }
454         logger.info(" ***** Exit prepareSDNCRequest *****")
455     }
456
457     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
458         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
459         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
460         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
461     }
462
463     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
464         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
465         String operType = resourceInputObj.getOperationType()
466         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
467         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
468         String operationId = resourceInputObj.getOperationId()
469         String progress = "20"
470         String status = "processing"
471         String statusDescription = "SDCN resource creation invoked"
472
473         execution.getVariable("operationId")
474
475         String body = """
476                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
477                         xmlns:ns="http://org.onap.so/requestsdb">
478                         <soapenv:Header/>
479                 <soapenv:Body>
480                     <ns:updateResourceOperationStatus>
481                                <operType>${msoUtils.xmlEscape(operType)}</operType>
482                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
483                                <progress>${msoUtils.xmlEscape(progress)}</progress>
484                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
485                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
486                                <status>${msoUtils.xmlEscape(status)}</status>
487                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
488                     </ns:updateResourceOperationStatus>
489                 </soapenv:Body>
490                 </soapenv:Envelope>""";
491
492         setProgressUpdateVariables(execution, body)
493
494     }
495
496     public void prepareUpdateAfterCreateSDNCResource(execution) {
497         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
498         String operType = resourceInputObj.getOperationType()
499         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
500         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
501         String operationId = resourceInputObj.getOperationId()
502         String progress = "100"
503         String status = "finished"
504         String statusDescription = "SDCN resource creation and activation completed"
505
506         execution.getVariable("operationId")
507
508         String body = """
509                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
510                         xmlns:ns="http://org.onap.so/requestsdb">
511                         <soapenv:Header/>
512                 <soapenv:Body>
513                     <ns:updateResourceOperationStatus>
514                                <operType>${msoUtils.xmlEscape(operType)}</operType>
515                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
516                                <progress>${msoUtils.xmlEscape(progress)}</progress>
517                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
518                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
519                                <status>${msoUtils.xmlEscape(status)}</status>
520                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
521                     </ns:updateResourceOperationStatus>
522                 </soapenv:Body>
523                 </soapenv:Envelope>""";
524
525         setProgressUpdateVariables(execution, body)
526     }
527
528     public void afterCreateSDNCCall(DelegateExecution execution){
529         logger.info(" ***** Started prepareSDNCRequest *****")
530         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
531         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
532
533         def isActivateRequried = execution.getVariable("isActivateRequired")
534         if (StringUtils.equalsIgnoreCase(isActivateRequried, "true")) {
535             def instnaceId = getInstnaceId(execution)
536             execution.setVariable("networkInstanceId", instnaceId)
537         }
538
539         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
540         logger.info(" ***** Exit prepareSDNCRequest *****")
541     }
542
543     private def getInstnaceId(DelegateExecution execution) {
544         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
545
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 = response."response-data"."RequestData"."output"."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 = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
560                 break
561
562             // for SDWANConnectivity and SOTNConnectivity and default:
563             default:
564                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
565                 break
566         }
567
568         return val.toString()
569     }
570
571     public void sendSyncResponse (DelegateExecution execution) {
572         logger.debug(" *** sendSyncResponse *** ")
573
574         try {
575             String operationStatus = "finished"
576             // RESTResponse for main flow
577             String resourceOperationResp = """{"operationStatus":"${operationStatus}"}""".trim()
578             logger.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             logger.debug(msg)
585             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
586         }
587         logger.debug(" ***** Exit sendSyncResponse *****")
588     }
589 }