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]*AccessConnectivity[\w\s\W]*/ :
156 operationType = "AccessConnectivity"
157 execution.setVariable("isActivateRequired", "false")
160 case ~/[\w\s\W]*InternetProfile[\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 void 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]*AccessConnectivity[\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")
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")
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)
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())
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)
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")
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())
301 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
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())
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()
326 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
327 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
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)
334 def parentServiceInstanceId = si.getServiceInstanceId()
335 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
344 * Pre Process the BPMN Flow Request
346 * generate the nsOperationKey
347 * generate the nsParameters
349 public void prepareSDNCRequest (DelegateExecution execution) {
350 logger.info(" ***** Started prepareSDNCRequest *****")
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")
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 = ""
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>
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>
432 <vnf-input-parameters>
433 $netowrkInputParameters
434 </vnf-input-parameters>
435 <request-version></request-version>
436 <vnf-name></vnf-name>
440 </sdncadapterworkflow:SDNCRequestData>
441 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
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()
499 // for SDWANConnectivity and SOTNConnectivity:
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()
549 String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
550 execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
551 logger.debug("sdncAdapterWorkflowRequest - " + "\n" + sndcTopologyCreateRequesAsString)
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)
559 logger.info(" ***** Exit prepareSDNCRequest *****")
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)
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"
578 execution.getVariable("operationId")
581 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
582 xmlns:ns="http://org.onap.so/requestsdb">
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>
595 </soapenv:Envelope>""";
597 setProgressUpdateVariables(execution, body)
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"
611 execution.getVariable("operationId")
614 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
615 xmlns:ns="http://org.onap.so/requestsdb">
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>
628 </soapenv:Envelope>""";
630 setProgressUpdateVariables(execution, body)
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")
638 def isActivateRequried = execution.getVariable("isActivateRequired")
639 if (StringUtils.equalsIgnoreCase(isActivateRequried, "true")) {
640 def instnaceId = getInstnaceId(execution)
641 execution.setVariable("networkInstanceId", instnaceId)
644 logger.info("response from sdnc, response code :" + responseCode + " response object :" + responseObj)
645 logger.info(" ***** Exit prepareSDNCRequest *****")
648 private def getInstnaceId(DelegateExecution execution) {
649 def response = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
651 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
652 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
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"
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"
667 // for SDWANConnectivity and SOTNConnectivity and default:
669 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
673 return val.toString()
676 public void sendSyncResponse (DelegateExecution execution) {
677 logger.debug(" *** sendSyncResponse *** ")
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)
687 } catch (Exception ex) {
688 String msg = "Exception in sendSyncResponse:" + ex.getMessage()
690 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
692 logger.debug(" ***** Exit sendSyncResponse *****")