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