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