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
26 import org.apache.commons.lang3.*
27 import org.camunda.bpm.engine.delegate.BpmnError
28 import org.camunda.bpm.engine.delegate.DelegateExecution
29 import org.json.JSONObject
31 import org.onap.aai.domain.yang.ServiceInstance
32 import org.onap.aai.domain.yang.ServiceInstances
33 import org.onap.aai.domain.yang.v13.Metadata
34 import org.onap.aai.domain.yang.v13.Metadatum
35 import org.onap.so.bpmn.common.recipe.ResourceInput
36 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
37 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
38 import org.onap.so.bpmn.common.scripts.ExceptionUtil
39 import org.onap.so.bpmn.common.scripts.MsoUtils
40 import org.onap.so.bpmn.core.domain.ModelInfo
41 import org.onap.so.bpmn.core.domain.ResourceType
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
53 * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
54 * flow for SDNC Network Resource Create
56 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
58 private static final Logger logger = LoggerFactory.getLogger( CreateSDNCNetworkResource.class);
59 String Prefix="CRESDNCRES_"
61 ExceptionUtil exceptionUtil = new ExceptionUtil()
63 JsonUtils jsonUtil = new JsonUtils()
65 MsoUtils msoUtils = new MsoUtils()
67 public void preProcessRequest(DelegateExecution execution){
69 logger.info(" ***** Started preProcessRequest *****")
72 //get bpmn inputs from resource request.
73 String requestId = execution.getVariable("mso-request-id")
74 String requestAction = execution.getVariable("requestAction")
75 logger.info("The requestAction is: " + requestAction)
76 String recipeParamsFromRequest = execution.getVariable("recipeParams")
77 logger.info("The recipeParams is: " + recipeParamsFromRequest)
78 String resourceInput = execution.getVariable("resourceInput")
79 logger.info("The resourceInput is: " + resourceInput)
80 //Get ResourceInput Object
81 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
82 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
84 //Deal with recipeParams
85 String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
87 //For sdnc requestAction default is "createNetworkInstance"
88 String operationType = "Network"
89 if(!StringUtils.isBlank(recipeParamsFromRequest)){
90 //the operationType from worflow(first node) is second priority.
91 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
93 if(!StringUtils.isBlank(recipeParamsFromWf)){
94 //the operationType from worflow(first node) is highest priority.
95 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
97 String operationTypeFromConfig = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".operation-type")
98 if (StringUtils.isNotEmpty(operationTypeFromConfig)) {
99 // highest priority if operation type configured
100 operationType = operationTypeFromConfig
103 String sdnc_svcAction = "create"
104 String sdnc_requestAction = sdnc_svcAction.capitalize() + operationType + "Instance"
105 String isActivateRequired = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".activation-required")
106 execution.setVariable("isActivateRequired", isActivateRequired)
108 execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
109 execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
110 execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
111 execution.setVariable("mso-request-id", requestId)
112 execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
113 } catch (BpmnError e) {
115 } catch (Exception ex){
116 msg = "Exception in preProcessRequest " + ex.getMessage()
118 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
122 String customizeResourceParam(String networkInputParametersJson) {
123 List<Map<String, Object>> paramList = new ArrayList();
124 JSONObject jsonObject = new JSONObject(networkInputParametersJson);
125 Iterator iterator = jsonObject.keys();
126 while (iterator.hasNext()) {
127 String key = iterator.next();
128 HashMap<String, String> hashMap = new HashMap();
129 hashMap.put("name", key);
130 hashMap.put("value", jsonObject.get(key))
131 paramList.add(hashMap)
133 Map<String, List<Map<String, Object>>> paramMap = new HashMap();
134 paramMap.put("param", paramList);
136 return new JSONObject(paramMap).toString();
139 private List<Metadatum> getMetaDatum(String customerId,
140 String serviceType, String serId) {
141 logger.debug("Enter getPnfInstance")
142 AAIResourcesClient client = new AAIResourcesClient()
144 // think how AAI queried for PNF name using the name
145 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
146 customerId, serviceType, serId)
147 logger.debug("uri for pnf get:" + uri.toString())
149 Metadata metadata = client.get(uri).asBean(Metadata.class).get()
150 return metadata.getMetadatum()
154 * This method updates the resource input by collecting required info from AAI
157 public ResourceInput updateResourceInput(DelegateExecution execution) {
158 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
159 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
162 def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
163 String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
166 case ~/[\w\s\W]*OLT[\w\s\W]*/ :
167 // get the required properties and update in resource input
169 def resourceInput = resourceInputObj.getResourceParameters()
170 String incomingRequest = resourceInputObj.getRequestsInputs()
171 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
172 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
177 List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
178 resourceInputObj.getServiceType(),
179 resourceInputObj.getServiceInstanceId())
180 for(Metadatum datum: metadatum) {
181 if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
182 cvlan = datum.getMetaval()
185 if (datum.getMetaname().equalsIgnoreCase("svlan")) {
186 svlan = datum.getMetaval()
189 if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
190 remoteId = datum.getMetaval()
194 logger.debug("cvlan: "+cvlan+" | svlan: "+svlan+" | remoteId: "+remoteId)
196 String manufacturer = jsonUtil.getJsonValue(serInput,
197 "service.parameters.requestInputs.ont_ont_manufacturer")
198 String ontsn = jsonUtil.getJsonValue(serInput,
199 "service.parameters.requestInputs.ont_ont_serial_num")
201 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
202 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
203 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.remote_id", remoteId)
204 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
205 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
206 logger.debug("old resource input:" + resourceInputObj.toString())
207 resourceInputObj.setResourceParameters(uResourceInput)
208 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
209 logger.debug("new resource Input :" + resourceInputObj.toString())
212 case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ :
213 // get the required properties and update in resource input
214 def resourceInput = resourceInputObj.getResourceParameters()
215 String incomingRequest = resourceInputObj.getRequestsInputs()
216 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
217 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
218 JSONObject inputParameters = new JSONObject(requestInputs)
223 String manufacturer = jsonUtil.getJsonValue(serInput,
224 "service.parameters.requestInputs.ont_ont_manufacturer")
226 String ontsn = jsonUtil.getJsonValue(serInput,
227 "service.parameters.requestInputs.ont_ont_serial_num")
229 List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
230 resourceInputObj.getServiceType(),
231 resourceInputObj.getServiceInstanceId())
232 for(Metadatum datum: metadatum) {
233 if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
234 cvlan = datum.getMetaval()
237 if (datum.getMetaname().equalsIgnoreCase("svlan")) {
238 svlan = datum.getMetaval()
241 if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
242 remoteId = datum.getMetaval()
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.manufacturer", manufacturer)
249 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_access_id", remoteId)
250 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", 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())
258 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
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)
265 if(inputParameters.has("local-access-provider-id")) {
266 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
267 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
268 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
269 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
270 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
271 resourceInputObj.setResourceParameters(uResourceInput)
272 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
277 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
278 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
279 // fill attachment TP in networkInputParamJson
280 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
281 fillAttachmentTPInfo(resourceInputObj, modelName, execution, vpnName)
285 // Special case for handling alloted resource types
286 // in case name is different as expected
287 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
288 def vpnName = modelName + "_sotnVpnName"
289 fillAttachmentTPInfo(resourceInputObj, modelName, execution, vpnName)
293 return resourceInputObj
296 private void fillAttachmentTPInfo(ResourceInput resourceInputObj, String modelName, DelegateExecution execution, String vpnName) {
297 String customer = resourceInputObj.getGlobalSubscriberId()
298 String serviceType = resourceInputObj.getServiceType()
300 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
302 AAIResourcesClient client = new AAIResourcesClient()
303 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, customer, serviceType).queryParam("service-instance-name", parentServiceName)
304 ServiceInstances sis = client.get(uri).asBean(ServiceInstances.class).get()
305 logger.debug("Fetched AAI ServiceInstances for the vpnName:" + vpnName + " is " + sis.getServiceInstance().toString())
306 ServiceInstance si = sis.getServiceInstance().get(0)
308 def parentServiceInstanceId = si.getServiceInstanceId()
309 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
313 * Pre Process the BPMN Flow Request
315 * generate the nsOperationKey
316 * generate the nsParameters
318 public void prepareSDNCRequest (DelegateExecution execution) {
319 logger.info(" ***** Started prepareSDNCRequest *****")
323 String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
324 String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
325 String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
326 String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
328 String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
329 String hdrRequestId = execution.getVariable("mso-request-id")
330 String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
331 String source = execution.getVariable("source")
332 String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
333 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
334 String serviceType = resourceInputObj.getServiceType()
335 String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
336 String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
337 String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
338 String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
339 String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
340 String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
341 String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
342 String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
343 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
344 String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
345 String resourceInputPrameters = resourceInputObj.getResourceParameters()
346 String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
347 //here convert json string to xml string
348 String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
349 // 1. prepare assign topology via SDNC Adapter SUBFLOW call
350 String sdncTopologyCreateRequest = "";
352 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
356 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
357 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
358 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
359 <sdncadapter:RequestHeader>
360 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
361 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
362 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
363 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
364 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
365 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
366 </sdncadapter:RequestHeader>
367 <sdncadapterworkflow:SDNCRequestData>
368 <request-information>
369 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
370 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
371 <source>${msoUtils.xmlEscape(source)}</source>
372 <notification-url></notification-url>
373 <order-number></order-number>
374 <order-version></order-version>
375 </request-information>
376 <service-information>
377 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
378 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
379 <onap-model-information>
380 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
381 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
382 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
383 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
384 </onap-model-information>
385 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
386 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
387 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
388 </service-information>
390 <vnf-type></vnf-type>
391 <onap-model-information>
392 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
393 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
394 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
395 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
396 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
397 </onap-model-information>
400 <vnf-input-parameters>
401 $netowrkInputParameters
402 </vnf-input-parameters>
403 <request-version></request-version>
404 <vnf-name></vnf-name>
408 </sdncadapterworkflow:SDNCRequestData>
409 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
412 String vnfid = resourceInputObj.getVnfId()
413 ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
414 String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
415 String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
416 String vnfmodelUuid = vfModelInfo.getModelUuid()
417 String vnfmodelVersion = vfModelInfo.getModelVersion()
418 String vnfmodelName = vfModelInfo.getModelName()
419 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
420 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
421 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
422 <sdncadapter:RequestHeader>
423 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
424 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
425 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
426 <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
427 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
428 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
429 </sdncadapter:RequestHeader>
430 <sdncadapterworkflow:SDNCRequestData>
431 <request-information>
432 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
433 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
434 <source>${msoUtils.xmlEscape(source)}</source>
435 <notification-url></notification-url>
436 <order-number></order-number>
437 <order-version></order-version>
438 </request-information>
439 <service-information>
440 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
441 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
442 <onap-model-information>
443 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
444 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
445 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
446 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
447 </onap-model-information>
448 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
449 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
450 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
451 </service-information>
453 <onap-model-information>
454 <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
455 <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
456 <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
457 <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
458 <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
459 </onap-model-information>
460 <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
462 <vf-module-information>
463 <from-preload>false</from-preload>
464 <onap-model-information>
465 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
466 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
467 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
468 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
469 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
470 </onap-model-information>
471 </vf-module-information>
472 <vf-module-request-input>
473 <vf-module-input-parameters>
474 $netowrkInputParameters
475 </vf-module-input-parameters>
476 </vf-module-request-input>
477 </sdncadapterworkflow:SDNCRequestData>
478 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
481 // sdwanvpnattachment or sotnvpnattachment
482 case "ALLOTTED_RESOURCE" :
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>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
488 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
489 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
490 <sdncadapter:SvcOperation>connection-attachment-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 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
515 </service-information>
516 <allotted-resource-information>
517 <allotted-resource-id></allotted-resource-id>
518 <allotted-resource-type></allotted-resource-type>
519 <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
520 <onap-model-information>
521 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
522 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
523 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
524 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
525 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
526 </onap-model-information>
527 </allotted-resource-information>
528 <connection-attachment-request-input>
529 $netowrkInputParameters
530 </connection-attachment-request-input>
531 </sdncadapterworkflow:SDNCRequestData>
532 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
536 // for SDWANConnectivity and SOTNConnectivity:
538 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
539 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
540 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
541 <sdncadapter:RequestHeader>
542 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
543 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
544 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
545 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
546 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
547 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
548 </sdncadapter:RequestHeader>
549 <sdncadapterworkflow:SDNCRequestData>
550 <request-information>
551 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
552 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
553 <source>${msoUtils.xmlEscape(source)}</source>
554 <notification-url></notification-url>
555 <order-number></order-number>
556 <order-version></order-version>
557 </request-information>
558 <service-information>
559 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
560 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
561 <onap-model-information>
562 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
563 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
564 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
565 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
566 </onap-model-information>
567 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
568 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
569 </service-information>
570 <network-information>
571 <onap-model-information>
572 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
573 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
574 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
575 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
576 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
577 </onap-model-information>
578 </network-information>
579 <network-request-input>
580 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
581 </network-request-input>
582 </sdncadapterworkflow:SDNCRequestData>
583 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
588 String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
589 execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
590 logger.debug("sdncAdapterWorkflowRequest - " + "\n" + sndcTopologyCreateRequesAsString)
592 } catch (Exception ex) {
593 String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
594 logger.debug(exceptionMessage)
595 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
598 logger.info(" ***** Exit prepareSDNCRequest *****")
601 private void setProgressUpdateVariables(DelegateExecution execution, String body) {
602 def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
603 execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
604 execution.setVariable("CVFMI_updateResOperStatusRequest", body)
607 public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
608 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
609 String operType = resourceInputObj.getOperationType()
610 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
611 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
612 String operationId = resourceInputObj.getOperationId()
613 String progress = "20"
614 String status = "processing"
615 String statusDescription = "SDCN resource creation invoked"
617 execution.getVariable("operationId")
620 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
621 xmlns:ns="http://org.onap.so/requestsdb">
624 <ns:updateResourceOperationStatus>
625 <operType>${msoUtils.xmlEscape(operType)}</operType>
626 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
627 <progress>${msoUtils.xmlEscape(progress)}</progress>
628 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
629 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
630 <status>${msoUtils.xmlEscape(status)}</status>
631 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
632 </ns:updateResourceOperationStatus>
634 </soapenv:Envelope>""";
636 setProgressUpdateVariables(execution, body)
640 public void prepareUpdateAfterCreateSDNCResource(execution) {
641 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
642 String operType = resourceInputObj.getOperationType()
643 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
644 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
645 String operationId = resourceInputObj.getOperationId()
646 String progress = "100"
647 String status = "finished"
648 String statusDescription = "SDCN resource creation and activation completed"
650 execution.getVariable("operationId")
653 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
654 xmlns:ns="http://org.onap.so/requestsdb">
657 <ns:updateResourceOperationStatus>
658 <operType>${msoUtils.xmlEscape(operType)}</operType>
659 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
660 <progress>${msoUtils.xmlEscape(progress)}</progress>
661 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
662 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
663 <status>${msoUtils.xmlEscape(status)}</status>
664 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
665 </ns:updateResourceOperationStatus>
667 </soapenv:Envelope>""";
669 setProgressUpdateVariables(execution, body)
672 public void afterCreateSDNCCall(DelegateExecution execution){
673 logger.info(" ***** Started prepareSDNCRequest *****")
674 String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
675 String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
677 def instnaceId = getInstanceId(execution)
678 execution.setVariable("resourceInstanceId", instnaceId)
680 logger.info("response from sdnc, response code :" + responseCode + " response object :" + responseObj)
681 logger.info(" ***** Exit prepareSDNCRequest *****")
684 private def getInstanceId(DelegateExecution execution) {
685 def response = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
687 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
688 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
691 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
694 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
697 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
699 case "ALLOTTED_RESOURCE":
700 // sdwanvpnattachment or sotnvpnattachment
701 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
704 // SDWANConnectivity or SOTN Connectivity
705 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
708 return val.toString()
711 public void sendSyncResponse (DelegateExecution execution) {
712 logger.debug(" *** sendSyncResponse *** ")
715 String operationStatus = "finished"
716 // RESTResponse for main flow
717 String vnfid=execution.getVariable("resourceInstanceId");
718 String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
719 logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
720 sendWorkflowResponse(execution, 202, resourceOperationResp)
721 execution.setVariable("sentSyncResponse", true)
723 } catch (Exception ex) {
724 String msg = "Exception in sendSyncResponse:" + ex.getMessage()
726 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
728 logger.debug(" ***** Exit sendSyncResponse *****")