2 * ============LICENSE_START=======================================================
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
23 package org.onap.so.bpmn.infrastructure.scripts
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
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
52 import static org.apache.commons.lang3.StringUtils.*
55 * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
56 * flow for SDNC Network Resource Create
58 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
60 private static final Logger logger = LoggerFactory.getLogger( CreateSDNCNetworkResource.class);
61 String Prefix="CRESDNCRES_"
63 ExceptionUtil exceptionUtil = new ExceptionUtil()
65 JsonUtils jsonUtil = new JsonUtils()
67 MsoUtils msoUtils = new MsoUtils()
69 public void preProcessRequest(DelegateExecution execution){
71 logger.info(" ***** Started preProcessRequest *****")
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())
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")
95 if(!StringUtils.isBlank(recipeParamsFromWf)){
96 //the operationType from worflow(first node) is highest priority.
97 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
101 //For sdnc, generate svc_action and request_action
102 String sdnc_svcAction = "create"
103 switch (resourceInputObj.getResourceInstanceName()) {
105 case ~/[\w\s\W]*overlay[\w\s\W]*/ :
106 //This will be resolved in R3.
107 sdnc_svcAction ="activate"
108 operationType = "NCINetwork"
111 case ~/[\w\s\W]*underlay[\w\s\W]*/ :
112 //This will be resolved in R3.
113 operationType ="Network"
116 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/ :
117 operationType = "SOTNConnectivity"
118 execution.setVariable("isActivateRequired", "true")
121 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
122 operationType = "SOTNAttachment"
123 execution.setVariable("isActivateRequired", "true")
126 case ~/[\w\s\W]*SiteVF[\w\s\W]*/ :
127 operationType = "Site"
128 execution.setVariable("isActivateRequired", "true")
131 case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
132 operationType = "SDWANDevice"
133 execution.setVariable("isActivateRequired", "true")
136 case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
137 operationType = "SDWANPort"
138 execution.setVariable("isActivateRequired", "true")
141 case ~/[\w\s\W]*SDWANConnectivity[\w\s\W]*/ :
142 operationType = "SDWANConnectivity"
143 execution.setVariable("isActivateRequired", "true")
146 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
147 operationType = "SDWANAttachment"
148 execution.setVariable("isActivateRequired", "true")
151 case ~/[\w\s\W]*wanconnection[\w\s\W]*/ :
152 execution.setVariable("isActivateRequired", "true")
155 case ~/[\w\s\W]*OLT[\w\s\W]*/ :
156 operationType = "AccessConnectivity"
157 execution.setVariable("isActivateRequired", "false")
160 case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ :
161 operationType = "InternetProfile"
162 execution.setVariable("isActivateRequired", "false")
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) {
177 } catch (Exception ex){
178 msg = "Exception in preProcessRequest " + ex.getMessage()
180 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
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)
195 Map<String, List<Map<String, Object>>> paramMap = new HashMap();
196 paramMap.put("param", paramList);
198 return new JSONObject(paramMap).toString();
201 private List<Metadatum> getMetaDatum(String customerId,
202 String serviceType, String serId) {
203 logger.debug("Enter getPnfInstance")
204 AAIResourcesClient client = new AAIResourcesClient()
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())
211 Metadata metadata = client.get(uri).asBean(Metadata.class).get()
212 return metadata.getMetadatum()
216 * This method updates the resource input by collecting required info from AAI
219 public ResourceInput updateResourceInput(DelegateExecution execution) {
220 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
221 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
224 def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
225 String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
228 case ~/[\w\s\W]*OLT[\w\s\W]*/ :
229 // get the required properties and update in resource input
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")
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()
247 if (datum.getMetaname().equalsIgnoreCase("svlan")) {
248 svlan = datum.getMetaval()
251 if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
252 remoteId = datum.getMetaval()
256 logger.debug("cvlan: "+cvlan+" | svlan: "+svlan+" | remoteId: "+remoteId)
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")
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)
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())
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)
286 String manufacturer = jsonUtil.getJsonValue(serInput,
287 "service.parameters.requestInputs.ont_ont_manufacturer")
289 String ontsn = jsonUtil.getJsonValue(serInput,
290 "service.parameters.requestInputs.ont_ont_serial_num")
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()
300 if (datum.getMetaname().equalsIgnoreCase("svlan")) {
301 svlan = datum.getMetaval()
304 if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
305 remoteId = datum.getMetaval()
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())
321 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
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())
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()
346 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
347 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
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)
354 def parentServiceInstanceId = si.getServiceInstanceId()
355 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
361 return resourceInputObj
365 * Pre Process the BPMN Flow Request
367 * generate the nsOperationKey
368 * generate the nsParameters
370 public void prepareSDNCRequest (DelegateExecution execution) {
371 logger.info(" ***** Started prepareSDNCRequest *****")
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")
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 = ""
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>
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>
453 <vnf-input-parameters>
454 $netowrkInputParameters
455 </vnf-input-parameters>
456 <request-version></request-version>
457 <vnf-name></vnf-name>
461 </sdncadapterworkflow:SDNCRequestData>
462 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
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()
520 // for SDWANConnectivity and SOTNConnectivity:
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()
570 String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
571 execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
572 logger.debug("sdncAdapterWorkflowRequest - " + "\n" + sndcTopologyCreateRequesAsString)
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)
580 logger.info(" ***** Exit prepareSDNCRequest *****")
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)
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"
599 execution.getVariable("operationId")
602 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
603 xmlns:ns="http://org.onap.so/requestsdb">
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>
616 </soapenv:Envelope>""";
618 setProgressUpdateVariables(execution, body)
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"
632 execution.getVariable("operationId")
635 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
636 xmlns:ns="http://org.onap.so/requestsdb">
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>
649 </soapenv:Envelope>""";
651 setProgressUpdateVariables(execution, body)
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")
659 def isActivateRequried = execution.getVariable("isActivateRequired")
660 if (StringUtils.equalsIgnoreCase(isActivateRequried, "true")) {
661 def instnaceId = getInstnaceId(execution)
662 execution.setVariable("networkInstanceId", instnaceId)
665 logger.info("response from sdnc, response code :" + responseCode + " response object :" + responseObj)
666 logger.info(" ***** Exit prepareSDNCRequest *****")
669 private def getInstnaceId(DelegateExecution execution) {
670 def response = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
672 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
673 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
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"
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"
688 // for SDWANConnectivity and SOTNConnectivity and default:
690 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
694 return val.toString()
697 public void sendSyncResponse (DelegateExecution execution) {
698 logger.debug(" *** sendSyncResponse *** ")
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)
708 } catch (Exception ex) {
709 String msg = "Exception in sendSyncResponse:" + ex.getMessage()
711 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
713 logger.debug(" ***** Exit sendSyncResponse *****")