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