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