Corrected instance names
[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.aai.domain.yang.v13.Metadata
33 import org.onap.aai.domain.yang.v13.Metadatum
34 import org.onap.aai.domain.yang.v13.Pnf
35 import org.onap.aai.domain.yang.v13.Pnfs
36 import org.onap.so.bpmn.common.recipe.ResourceInput
37 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
38 import org.onap.so.bpmn.common.scripts.AaiUtil
39 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
40 import org.onap.so.bpmn.common.scripts.ExceptionUtil
41 import org.onap.so.bpmn.common.scripts.MsoUtils
42 import org.onap.so.bpmn.core.json.JsonUtils
43 import org.onap.so.bpmn.core.UrnPropertiesReader
44 import org.onap.so.client.aai.AAIObjectPlurals
45 import org.onap.so.client.aai.AAIResourcesClient
46 import org.onap.so.client.aai.AAIObjectType
47 import org.onap.so.client.aai.entities.uri.AAIResourceUri
48 import org.onap.so.client.aai.entities.uri.AAIUriFactory
49 import org.slf4j.Logger
50 import org.slf4j.LoggerFactory
51
52 import static org.apache.commons.lang3.StringUtils.*
53
54 /**
55  * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
56  * flow for SDNC Network Resource Create
57  */
58 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
59
60     private static final Logger logger = LoggerFactory.getLogger( CreateSDNCNetworkResource.class);
61     String Prefix="CRESDNCRES_"
62
63     ExceptionUtil exceptionUtil = new ExceptionUtil()
64
65     JsonUtils jsonUtil = new JsonUtils()
66
67     MsoUtils msoUtils = new MsoUtils()
68
69     public void preProcessRequest(DelegateExecution execution){
70
71         logger.info(" ***** Started preProcessRequest *****")
72         try {
73
74             //get bpmn inputs from resource request.
75             String requestId = execution.getVariable("mso-request-id")
76             String requestAction = execution.getVariable("requestAction")
77             logger.info("The requestAction is: " + requestAction)
78             String recipeParamsFromRequest = execution.getVariable("recipeParams")
79             logger.info("The recipeParams is: " + recipeParamsFromRequest)
80             String resourceInput = execution.getVariable("resourceInput")
81             logger.info("The resourceInput is: " + resourceInput)
82             //Get ResourceInput Object
83             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
84             execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
85
86             //Deal with recipeParams
87             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
88             String resourceName = resourceInputObj.getResourceInstanceName()
89             //For sdnc requestAction default is "createNetworkInstance"
90             String operationType = "Network"
91             if(!StringUtils.isBlank(recipeParamsFromRequest)){
92                 //the operationType from worflow(first node) is second priority.
93                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
94             }
95             if(!StringUtils.isBlank(recipeParamsFromWf)){
96                 //the operationType from worflow(first node) is highest priority.
97                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
98             }
99
100
101             //For sdnc, generate svc_action and request_action
102             String sdnc_svcAction = "create"
103             switch (resourceInputObj.getResourceInstanceName()) {
104
105                 case ~/[\w\s\W]*overlay[\w\s\W]*/ :
106                     //This will be resolved in R3.
107                     sdnc_svcAction ="activate"
108                     operationType = "NCINetwork"
109                     break
110
111                 case ~/[\w\s\W]*underlay[\w\s\W]*/ :
112                     //This will be resolved in R3.
113                     operationType ="Network"
114                     break
115
116                 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/ :
117                     operationType = "SOTNConnectivity"
118                     execution.setVariable("isActivateRequired", "true")
119                     break
120
121                 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
122                     operationType = "SOTNAttachment"
123                     execution.setVariable("isActivateRequired", "true")
124                     break
125
126                 case ~/[\w\s\W]*SiteVF[\w\s\W]*/ :
127                     operationType = "Site"
128                     execution.setVariable("isActivateRequired", "true")
129                     break
130
131                 case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
132                     operationType = "SDWANDevice"
133                     execution.setVariable("isActivateRequired", "true")
134                     break
135
136                 case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
137                     operationType = "SDWANPort"
138                     execution.setVariable("isActivateRequired", "true")
139                     break
140
141                 case ~/[\w\s\W]*SDWANConnectivity[\w\s\W]*/ :
142                     operationType = "SDWANConnectivity"
143                     execution.setVariable("isActivateRequired", "true")
144                     break
145
146                 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
147                     operationType = "SDWANAttachment"
148                     execution.setVariable("isActivateRequired", "true")
149                     break
150
151                 case ~/[\w\s\W]*wanconnection[\w\s\W]*/ :
152                     execution.setVariable("isActivateRequired", "true")
153                     break
154
155                 case ~/[\w\s\W]*AccessConnectivity[\w\s\W]*/ :
156                     operationType = "AccessConnectivity"
157                     execution.setVariable("isActivateRequired", "false")
158                     break
159
160                 case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
161                     operationType = "InternetProfile"
162                     execution.setVariable("isActivateRequired", "false")
163                     break
164
165                 default:
166                     break
167             }
168
169             String sdnc_requestAction = StringUtils.capitalize(sdnc_svcAction) + operationType +"Instance"
170             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
171             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
172             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
173             execution.setVariable("mso-request-id", requestId)
174             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
175         } catch (BpmnError e) {
176             throw e;
177         } catch (Exception ex){
178             msg = "Exception in preProcessRequest " + ex.getMessage()
179             logger.debug(msg)
180             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
181         }
182     }
183
184     String customizeResourceParam(String networkInputParametersJson) {
185         List<Map<String, Object>> paramList = new ArrayList();
186         JSONObject jsonObject = new JSONObject(networkInputParametersJson);
187         Iterator iterator = jsonObject.keys();
188         while (iterator.hasNext()) {
189             String key = iterator.next();
190             HashMap<String, String> hashMap = new HashMap();
191             hashMap.put("name", key);
192             hashMap.put("value", jsonObject.get(key))
193             paramList.add(hashMap)
194         }
195         Map<String, List<Map<String, Object>>> paramMap = new HashMap();
196         paramMap.put("param", paramList);
197
198         return  new JSONObject(paramMap).toString();
199     }
200
201     private List<Metadatum> getMetaDatum(String customerId,
202                                          String serviceType, String serId) {
203         logger.debug("Enter getPnfInstance")
204         AAIResourcesClient client = new AAIResourcesClient()
205
206         // think how AAI queried for PNF name using the name
207         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
208                 customerId, serviceType, serId)
209         logger.debug("uri for pnf get:" + uri.toString())
210
211         Metadata metadata = client.get(uri).asBean(Metadata.class).get()
212         return metadata.getMetadatum()
213     }
214
215     /**
216      * This method updates the resource input by collecting required info from AAI
217      * @param execution
218      */
219     public void updateResourceInput(DelegateExecution execution) {
220         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
221         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
222
223
224         def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
225         String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
226
227         switch (modelName) {
228             case ~/[\w\s\W]*AccessConnectivity[\w\s\W]*/ :
229                 // get the required properties and update in resource input
230
231                 def resourceInput = resourceInputObj.getResourceParameters()
232                 String incomingRequest = resourceInputObj.getRequestsInputs()
233                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
234                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
235                 String cvlan = "10"
236                 String svlan = "100"
237                 String accessId = "AC9.0234.0337"
238                 String manufacturer = jsonUtil.getJsonValue(serInput,
239                         "service.parameters.requestInputs.ont_ont_manufacturer")
240                 String ontsn = jsonUtil.getJsonValue(serInput,
241                         "service.parameters.requestInputs.ont_ont_serial_num")
242
243                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
244                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
245                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.accessID", accessId)
246                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
247                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
248
249                 msoLogger.debug("old resource input:" + resourceInputObj.toString())
250                 resourceInputObj.setResourceParameters(uResourceInput)
251                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
252                 msoLogger.debug("new resource Input :" + resourceInputObj.toString())
253                 break
254
255             case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
256                 // get the required properties and update in resource input
257                 def resourceInput = resourceInputObj.getResourceParameters()
258                 String incomingRequest = resourceInputObj.getRequestsInputs()
259                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
260                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
261                 JSONObject inputParameters = new JSONObject(requestInputs)
262
263                 String cvlan = "100"
264                 String svlan = "1000"
265                 String manufacturer = jsonUtil.getJsonValue(serInput,
266                         "service.parameters.requestInputs.ont_ont_manufacturer")
267                 String accessId = "AC9.0234.0337"
268                 String ontsn = jsonUtil.getJsonValue(serInput,
269                         "service.parameters.requestInputs.ont_ont_serial_num")
270
271                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
272                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
273                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
274                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_access_id", accessId)
275                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
276                 msoLogger.debug("old resource input:" + resourceInputObj.toString())
277                 resourceInputObj.setResourceParameters(uResourceInput)
278                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
279                 msoLogger.debug("new resource Input :" + resourceInputObj.toString())
280                 break
281
282
283             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
284
285                 def resourceInput = resourceInputObj.getResourceParameters()
286                 String incomingRequest = resourceInputObj.getRequestsInputs()
287                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
288                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
289                 JSONObject inputParameters = new JSONObject(requestInputs)
290                 if(inputParameters.has("local-access-provider-id")) {
291                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
292                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
293                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
294                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
295                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
296                     resourceInputObj.setResourceParameters(uResourceInput)
297                     execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
298                 }
299
300                 break
301
302             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
303             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
304                 // fill attachment TP in networkInputParamJson
305                 String customer = resourceInputObj.getGlobalSubscriberId()
306                 String serviceType = resourceInputObj.getServiceType()
307
308                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
309                 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
310
311                                 AAIResourcesClient client = new AAIResourcesClient()
312                                 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, customer, serviceType).queryParam("service-instance-name", parentServiceName)
313                                 ServiceInstances sis = client.get(uri).asBean(ServiceInstances.class).get()
314                                 ServiceInstance si = sis.getServiceInstance().get(0)
315
316                                 def parentServiceInstanceId = si.getServiceInstanceId()
317                                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
318
319                 break
320             default:
321                 break
322         }
323     }
324
325     /**
326      * Pre Process the BPMN Flow Request
327      * Includes:
328      * generate the nsOperationKey
329      * generate the nsParameters
330      */
331     public void prepareSDNCRequest (DelegateExecution execution) {
332         logger.info(" ***** Started prepareSDNCRequest *****")
333
334         try {
335             // get variables
336             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
337             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
338             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
339             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
340
341             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
342             String hdrRequestId = execution.getVariable("mso-request-id")
343             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
344             String source = execution.getVariable("source")
345             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
346             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
347             String serviceType = resourceInputObj.getServiceType()
348             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
349             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
350             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
351             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
352             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
353             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
354             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
355             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
356             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
357             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
358             String resourceInputPrameters = resourceInputObj.getResourceParameters()
359             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
360             //here convert json string to xml string
361             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
362             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
363             String sdncTopologyCreateRequest = ""
364
365             switch (modelName) {
366                 case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
367                 case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
368                 case ~/[\w\s\W]*SiteVF[\w\s\W]*/:
369                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
370                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
371                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
372                                  <sdncadapter:RequestHeader>
373                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
374                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
375                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
376                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
377                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
378                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
379                                  </sdncadapter:RequestHeader>
380                                  <sdncadapterworkflow:SDNCRequestData>
381                                      <request-information>
382                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
383                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
384                                         <source>${msoUtils.xmlEscape(source)}</source>
385                                         <notification-url></notification-url>
386                                         <order-number></order-number>
387                                         <order-version></order-version>
388                                      </request-information>
389                                      <service-information>
390                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
391                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
392                                         <onap-model-information>
393                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
394                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
395                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
396                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
397                                         </onap-model-information>
398                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
399                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
400                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
401                                      </service-information>
402                                      <vnf-information>
403                                         <vnf-id></vnf-id>
404                                         <vnf-type></vnf-type>
405                                         <onap-model-information>
406                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
407                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
408                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
409                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
410                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
411                                         </onap-model-information>
412                                      </vnf-information>
413                                      <vnf-request-input>
414                                          <vnf-input-parameters>
415                                            $netowrkInputParameters
416                                          </vnf-input-parameters>
417                                          <request-version></request-version>
418                                          <vnf-name></vnf-name>
419                                          <vnf-networks>
420                                         </vnf-networks>
421                                       </vnf-request-input>
422                                 </sdncadapterworkflow:SDNCRequestData>
423                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
424                     break
425
426                 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
427                 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
428                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
429                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
430                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
431                                  <sdncadapter:RequestHeader>
432                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
433                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
434                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
435                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
436                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
437                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
438                                  </sdncadapter:RequestHeader>
439                                  <sdncadapterworkflow:SDNCRequestData>
440                                      <request-information>
441                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
442                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
443                                         <source>${msoUtils.xmlEscape(source)}</source>
444                                         <notification-url></notification-url>
445                                         <order-number></order-number>
446                                         <order-version></order-version>
447                                      </request-information>
448                                      <service-information>
449                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
450                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
451                                         <onap-model-information>
452                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
453                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
454                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
455                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
456                                         </onap-model-information>
457                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
458                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
459                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
460                                      </service-information>
461                                      <allotted-resource-information>
462                                         <!-- TODO: to be filled as per the request input -->
463                                         <allotted-resource-id></allotted-resource-id>
464                                         <allotted-resource-type></allotted-resource-type>
465                                         <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
466                                         <onap-model-information>
467                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
468                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
469                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
470                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
471                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
472                                         </onap-model-information>
473                                      </allotted-resource-information>
474                                      <connection-attachment-request-input>
475                                        $netowrkInputParameters
476                                      </connection-attachment-request-input>
477                                 </sdncadapterworkflow:SDNCRequestData>
478                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
479                     break
480
481             // for SDWANConnectivity and SOTNConnectivity:
482                 default:
483                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
484                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
485                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
486                                  <sdncadapter:RequestHeader>
487                                     <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
488                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
489                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
490                                     <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
491                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
492                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
493                                  </sdncadapter:RequestHeader>
494                                  <sdncadapterworkflow:SDNCRequestData>
495                                      <request-information>
496                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
497                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
498                                         <source>${msoUtils.xmlEscape(source)}</source>
499                                         <notification-url></notification-url>
500                                         <order-number></order-number>
501                                         <order-version></order-version>
502                                      </request-information>
503                                      <service-information>
504                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
505                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
506                                         <onap-model-information>
507                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
508                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
509                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
510                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
511                                         </onap-model-information>
512                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
513                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
514                                      </service-information>
515                                      <network-information>
516                                         <onap-model-information>
517                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
518                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
519                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
520                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
521                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
522                                         </onap-model-information>
523                                      </network-information>
524                                      <network-request-input>
525                                        <network-input-parameters>$netowrkInputParameters</network-input-parameters>
526                                      </network-request-input>
527                                 </sdncadapterworkflow:SDNCRequestData>
528                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
529             }
530
531             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
532             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
533             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
534
535         } catch (Exception ex) {
536             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
537             logger.debug(exceptionMessage)
538             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
539
540         }
541         logger.info(" ***** Exit prepareSDNCRequest *****")
542     }
543
544     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
545         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
546         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
547         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
548     }
549
550     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
551         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
552         String operType = resourceInputObj.getOperationType()
553         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
554         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
555         String operationId = resourceInputObj.getOperationId()
556         String progress = "20"
557         String status = "processing"
558         String statusDescription = "SDCN resource creation invoked"
559
560         execution.getVariable("operationId")
561
562         String body = """
563                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
564                         xmlns:ns="http://org.onap.so/requestsdb">
565                         <soapenv:Header/>
566                 <soapenv:Body>
567                     <ns:updateResourceOperationStatus>
568                                <operType>${msoUtils.xmlEscape(operType)}</operType>
569                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
570                                <progress>${msoUtils.xmlEscape(progress)}</progress>
571                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
572                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
573                                <status>${msoUtils.xmlEscape(status)}</status>
574                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
575                     </ns:updateResourceOperationStatus>
576                 </soapenv:Body>
577                 </soapenv:Envelope>""";
578
579         setProgressUpdateVariables(execution, body)
580
581     }
582
583     public void prepareUpdateAfterCreateSDNCResource(execution) {
584         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
585         String operType = resourceInputObj.getOperationType()
586         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
587         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
588         String operationId = resourceInputObj.getOperationId()
589         String progress = "100"
590         String status = "finished"
591         String statusDescription = "SDCN resource creation and activation completed"
592
593         execution.getVariable("operationId")
594
595         String body = """
596                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
597                         xmlns:ns="http://org.onap.so/requestsdb">
598                         <soapenv:Header/>
599                 <soapenv:Body>
600                     <ns:updateResourceOperationStatus>
601                                <operType>${msoUtils.xmlEscape(operType)}</operType>
602                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
603                                <progress>${msoUtils.xmlEscape(progress)}</progress>
604                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
605                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
606                                <status>${msoUtils.xmlEscape(status)}</status>
607                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
608                     </ns:updateResourceOperationStatus>
609                 </soapenv:Body>
610                 </soapenv:Envelope>""";
611
612         setProgressUpdateVariables(execution, body)
613     }
614
615     public void afterCreateSDNCCall(DelegateExecution execution){
616         logger.info(" ***** Started prepareSDNCRequest *****")
617         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
618         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
619
620         def isActivateRequried = execution.getVariable("isActivateRequired")
621         if (StringUtils.equalsIgnoreCase(isActivateRequried, "true")) {
622             def instnaceId = getInstnaceId(execution)
623             execution.setVariable("networkInstanceId", instnaceId)
624         }
625
626         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
627         logger.info(" ***** Exit prepareSDNCRequest *****")
628     }
629
630     private def getInstnaceId(DelegateExecution execution) {
631         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
632
633         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
634         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
635         def val = ""
636
637         switch (modelName) {
638             case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
639             case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
640             case ~/[\w\s\W]*Site[\w\s\W]*/:
641                 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
642                 break
643
644             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
645             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/:
646                 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
647                 break
648
649             // for SDWANConnectivity and SOTNConnectivity and default:
650             default:
651                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
652                 break
653         }
654
655         return val.toString()
656     }
657
658     public void sendSyncResponse (DelegateExecution execution) {
659         logger.debug(" *** sendSyncResponse *** ")
660
661         try {
662             String operationStatus = "finished"
663             // RESTResponse for main flow
664             String resourceOperationResp = """{"operationStatus":"${operationStatus}"}""".trim()
665             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
666             sendWorkflowResponse(execution, 202, resourceOperationResp)
667             execution.setVariable("sentSyncResponse", true)
668
669         } catch (Exception ex) {
670             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
671             logger.debug(msg)
672             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
673         }
674         logger.debug(" ***** Exit sendSyncResponse *****")
675     }
676 }