Added orchestration status to service
[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 = jsonUtil.getJsonValue(serInput,
236                         "service.parameters.requestInputs.cvlan")
237                 String svlan = jsonUtil.getJsonValue(serInput,
238                         "service.parameters.requestInputs.svlan")
239                 String remoteId = jsonUtil.getJsonValue(serInput,
240                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
241                 String manufacturer = jsonUtil.getJsonValue(serInput,
242                         "service.parameters.requestInputs.ont_ont_manufacturer")
243                 String ontsn = jsonUtil.getJsonValue(serInput,
244                         "service.parameters.requestInputs.ont_ont_serial_num")
245
246                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
247                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
248                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.remote_id", remoteId)
249                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
250                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
251                 logger.debug("old resource input:" + resourceInputObj.toString())
252                 resourceInputObj.setResourceParameters(uResourceInput)
253                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
254                 logger.debug("new resource Input :" + resourceInputObj.toString())
255                 break
256
257             case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
258                 // get the required properties and update in resource input
259                 def resourceInput = resourceInputObj.getResourceParameters()
260                 String incomingRequest = resourceInputObj.getRequestsInputs()
261                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
262                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
263                 JSONObject inputParameters = new JSONObject(requestInputs)
264
265                 String cvlan = jsonUtil.getJsonValue(serInput,
266                         "service.parameters.requestInputs.cvlan")
267                 String svlan = jsonUtil.getJsonValue(serInput,
268                         "service.parameters.requestInputs.svlan")
269                 String manufacturer = jsonUtil.getJsonValue(serInput,
270                         "service.parameters.requestInputs.ont_ont_manufacturer")
271                 String remoteId = jsonUtil.getJsonValue(serInput,
272                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
273                 String ontsn = jsonUtil.getJsonValue(serInput,
274                         "service.parameters.requestInputs.ont_ont_serial_num")
275                 String serviceType = jsonUtil.getJsonValue(serInput,
276                         "service.parameters.requestInputs.edgeinternetprofile_ip_service_type")
277                 String macAddr = jsonUtil.getJsonValue(serInput,
278                         "service.parameters.requestInputs.edgeinternetprofile_ip_rg_mac_addr")
279                 String upStream = jsonUtil.getJsonValue(serInput,
280                         "service.parameters.requestInputs.edgeinternetprofile_ip_upstream_speed")
281                 String downStream = jsonUtil.getJsonValue(serInput,
282                         "service.parameters.requestInputs.edgeinternetprofile_ip_downstream_speed")
283
284                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
285                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
286                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
287                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_remote_id", remoteId)
288                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
289                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_service_type", serviceType)
290                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_rg_mac_addr", macAddr)
291                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_upstream_speed", upStream)
292                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_downstream_speed", downStream)
293                 logger.debug("old resource input:" + resourceInputObj.toString())
294                 resourceInputObj.setResourceParameters(uResourceInput)
295                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
296                 logger.debug("new resource Input :" + resourceInputObj.toString())
297                 break
298
299
300             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
301
302                 def resourceInput = resourceInputObj.getResourceParameters()
303                 String incomingRequest = resourceInputObj.getRequestsInputs()
304                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
305                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
306                 JSONObject inputParameters = new JSONObject(requestInputs)
307                 if(inputParameters.has("local-access-provider-id")) {
308                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
309                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
310                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
311                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
312                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
313                     resourceInputObj.setResourceParameters(uResourceInput)
314                     execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
315                 }
316
317                 break
318
319             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
320             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
321                 // fill attachment TP in networkInputParamJson
322                 String customer = resourceInputObj.getGlobalSubscriberId()
323                 String serviceType = resourceInputObj.getServiceType()
324
325                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
326                 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
327
328                 AAIResourcesClient client = new AAIResourcesClient()
329                 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, customer, serviceType).queryParam("service-instance-name", parentServiceName)
330                 ServiceInstances sis = client.get(uri).asBean(ServiceInstances.class).get()
331                 ServiceInstance si = sis.getServiceInstance().get(0)
332
333                 def parentServiceInstanceId = si.getServiceInstanceId()
334                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
335
336                 break
337             default:
338                 break
339         }
340     }
341
342     /**
343      * Pre Process the BPMN Flow Request
344      * Includes:
345      * generate the nsOperationKey
346      * generate the nsParameters
347      */
348     public void prepareSDNCRequest (DelegateExecution execution) {
349         logger.info(" ***** Started prepareSDNCRequest *****")
350
351         try {
352             // get variables
353             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
354             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
355             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
356             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
357
358             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
359             String hdrRequestId = execution.getVariable("mso-request-id")
360             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
361             String source = execution.getVariable("source")
362             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
363             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
364             String serviceType = resourceInputObj.getServiceType()
365             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
366             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
367             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
368             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
369             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
370             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
371             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
372             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
373             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
374             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
375             String resourceInputPrameters = resourceInputObj.getResourceParameters()
376             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
377             //here convert json string to xml string
378             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
379             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
380             String sdncTopologyCreateRequest = ""
381
382             switch (modelName) {
383                 case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
384                 case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
385                 case ~/[\w\s\W]*SiteVF[\w\s\W]*/:
386                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
387                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
388                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
389                                  <sdncadapter:RequestHeader>
390                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
391                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
392                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
393                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
394                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
395                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
396                                  </sdncadapter:RequestHeader>
397                                  <sdncadapterworkflow:SDNCRequestData>
398                                      <request-information>
399                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
400                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
401                                         <source>${msoUtils.xmlEscape(source)}</source>
402                                         <notification-url></notification-url>
403                                         <order-number></order-number>
404                                         <order-version></order-version>
405                                      </request-information>
406                                      <service-information>
407                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
408                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
409                                         <onap-model-information>
410                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
411                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
412                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
413                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
414                                         </onap-model-information>
415                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
416                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
417                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
418                                      </service-information>
419                                      <vnf-information>
420                                         <vnf-id></vnf-id>
421                                         <vnf-type></vnf-type>
422                                         <onap-model-information>
423                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
424                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
425                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
426                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
427                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
428                                         </onap-model-information>
429                                      </vnf-information>
430                                      <vnf-request-input>
431                                          <vnf-input-parameters>
432                                            $netowrkInputParameters
433                                          </vnf-input-parameters>
434                                          <request-version></request-version>
435                                          <vnf-name></vnf-name>
436                                          <vnf-networks>
437                                         </vnf-networks>
438                                       </vnf-request-input>
439                                 </sdncadapterworkflow:SDNCRequestData>
440                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
441                     break
442
443                 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
444                 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
445                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
446                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
447                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
448                                  <sdncadapter:RequestHeader>
449                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
450                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
451                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
452                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
453                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
454                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
455                                  </sdncadapter:RequestHeader>
456                                  <sdncadapterworkflow:SDNCRequestData>
457                                      <request-information>
458                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
459                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
460                                         <source>${msoUtils.xmlEscape(source)}</source>
461                                         <notification-url></notification-url>
462                                         <order-number></order-number>
463                                         <order-version></order-version>
464                                      </request-information>
465                                      <service-information>
466                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
467                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
468                                         <onap-model-information>
469                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
470                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
471                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
472                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
473                                         </onap-model-information>
474                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
475                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
476                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
477                                      </service-information>
478                                      <allotted-resource-information>
479                                         <!-- TODO: to be filled as per the request input -->
480                                         <allotted-resource-id></allotted-resource-id>
481                                         <allotted-resource-type></allotted-resource-type>
482                                         <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
483                                         <onap-model-information>
484                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
485                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
486                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
487                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
488                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
489                                         </onap-model-information>
490                                      </allotted-resource-information>
491                                      <connection-attachment-request-input>
492                                        $netowrkInputParameters
493                                      </connection-attachment-request-input>
494                                 </sdncadapterworkflow:SDNCRequestData>
495                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
496                     break
497
498             // for SDWANConnectivity and SOTNConnectivity:
499                 default:
500                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
501                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
502                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
503                                  <sdncadapter:RequestHeader>
504                                     <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
505                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
506                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
507                                     <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
508                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
509                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
510                                  </sdncadapter:RequestHeader>
511                                  <sdncadapterworkflow:SDNCRequestData>
512                                      <request-information>
513                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
514                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
515                                         <source>${msoUtils.xmlEscape(source)}</source>
516                                         <notification-url></notification-url>
517                                         <order-number></order-number>
518                                         <order-version></order-version>
519                                      </request-information>
520                                      <service-information>
521                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
522                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
523                                         <onap-model-information>
524                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
525                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
526                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
527                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
528                                         </onap-model-information>
529                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
530                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
531                                      </service-information>
532                                      <network-information>
533                                         <onap-model-information>
534                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
535                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
536                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
537                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
538                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
539                                         </onap-model-information>
540                                      </network-information>
541                                      <network-request-input>
542                                        <network-input-parameters>$netowrkInputParameters</network-input-parameters>
543                                      </network-request-input>
544                                 </sdncadapterworkflow:SDNCRequestData>
545                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
546             }
547
548             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
549             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
550             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
551
552         } catch (Exception ex) {
553             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
554             logger.debug(exceptionMessage)
555             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
556
557         }
558         logger.info(" ***** Exit prepareSDNCRequest *****")
559     }
560
561     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
562         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
563         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
564         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
565     }
566
567     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
568         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
569         String operType = resourceInputObj.getOperationType()
570         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
571         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
572         String operationId = resourceInputObj.getOperationId()
573         String progress = "20"
574         String status = "processing"
575         String statusDescription = "SDCN resource creation invoked"
576
577         execution.getVariable("operationId")
578
579         String body = """
580                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
581                         xmlns:ns="http://org.onap.so/requestsdb">
582                         <soapenv:Header/>
583                 <soapenv:Body>
584                     <ns:updateResourceOperationStatus>
585                                <operType>${msoUtils.xmlEscape(operType)}</operType>
586                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
587                                <progress>${msoUtils.xmlEscape(progress)}</progress>
588                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
589                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
590                                <status>${msoUtils.xmlEscape(status)}</status>
591                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
592                     </ns:updateResourceOperationStatus>
593                 </soapenv:Body>
594                 </soapenv:Envelope>""";
595
596         setProgressUpdateVariables(execution, body)
597
598     }
599
600     public void prepareUpdateAfterCreateSDNCResource(execution) {
601         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
602         String operType = resourceInputObj.getOperationType()
603         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
604         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
605         String operationId = resourceInputObj.getOperationId()
606         String progress = "100"
607         String status = "finished"
608         String statusDescription = "SDCN resource creation and activation completed"
609
610         execution.getVariable("operationId")
611
612         String body = """
613                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
614                         xmlns:ns="http://org.onap.so/requestsdb">
615                         <soapenv:Header/>
616                 <soapenv:Body>
617                     <ns:updateResourceOperationStatus>
618                                <operType>${msoUtils.xmlEscape(operType)}</operType>
619                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
620                                <progress>${msoUtils.xmlEscape(progress)}</progress>
621                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
622                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
623                                <status>${msoUtils.xmlEscape(status)}</status>
624                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
625                     </ns:updateResourceOperationStatus>
626                 </soapenv:Body>
627                 </soapenv:Envelope>""";
628
629         setProgressUpdateVariables(execution, body)
630     }
631
632     public void afterCreateSDNCCall(DelegateExecution execution){
633         logger.info(" ***** Started prepareSDNCRequest *****")
634         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
635         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
636
637         def isActivateRequried = execution.getVariable("isActivateRequired")
638         if (StringUtils.equalsIgnoreCase(isActivateRequried, "true")) {
639             def instnaceId = getInstnaceId(execution)
640             execution.setVariable("networkInstanceId", instnaceId)
641         }
642
643         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
644         logger.info(" ***** Exit prepareSDNCRequest *****")
645     }
646
647     private def getInstnaceId(DelegateExecution execution) {
648         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
649
650         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
651         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
652         def val = ""
653
654         switch (modelName) {
655             case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
656             case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
657             case ~/[\w\s\W]*Site[\w\s\W]*/:
658                 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
659                 break
660
661             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
662             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/:
663                 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
664                 break
665
666         // for SDWANConnectivity and SOTNConnectivity and default:
667             default:
668                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
669                 break
670         }
671
672         return val.toString()
673     }
674
675     public void sendSyncResponse (DelegateExecution execution) {
676         logger.debug(" *** sendSyncResponse *** ")
677
678         try {
679             String operationStatus = "finished"
680             // RESTResponse for main flow
681             String resourceOperationResp = """{"operationStatus":"${operationStatus}"}""".trim()
682             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
683             sendWorkflowResponse(execution, 202, resourceOperationResp)
684             execution.setVariable("sentSyncResponse", true)
685
686         } catch (Exception ex) {
687             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
688             logger.debug(msg)
689             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
690         }
691         logger.debug(" ***** Exit sendSyncResponse *****")
692     }
693 }