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 case ~/[\w\s\W]*SOTN-Attachment[\w\s\W]*/ :
280 // fill attachment TP in networkInputParamJson
281 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : (StringUtils.containsIgnoreCase(modelName, "SOTN-Attachment") ? "elinesotnattachmentvf0_elinesotnattachmentvfc0_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName")
282 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
286 // Special case for handling alloted resource types
287 // in case name is different as expected
288 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
289 def vpnName = modelName + "_sotnVpnName"
290 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
294 return resourceInputObj
297 private void fillAttachmentTPInfo(ResourceInput resourceInputObj, DelegateExecution execution, String vpnName) {
299 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
301 AAIResourcesClient client = new AAIResourcesClient()
302 logger.info("sending request to resolve vpn-name:" + vpnName)
303 AAIResourceUri uri = AAIUriFactory.createResourceUri(new AAIObjectPlurals("/nodes", "/service-instances", "queryByName")).queryParam("service-instance-name", parentServiceName)
304 Optional<ServiceInstances> serviceInstancesOpt = client.get(ServiceInstances.class, uri)
306 if(serviceInstancesOpt.isPresent()) {
307 List<ServiceInstance> serviceInstanceList = serviceInstancesOpt.get().getServiceInstance()
308 logger.info("response from aai:" + serviceInstanceList.toString())
309 if (serviceInstanceList.size() > 0) {
310 ServiceInstance si = serviceInstanceList.get(0)
311 String parentServiceInstanceId = si.getServiceInstanceId()
312 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
313 logger.info("setting parentService id:" + parentServiceInstanceId)
315 logger.error("No service instance found for given name.")
318 logger.error("No nodes found with this name" + vpnName)
323 * Pre Process the BPMN Flow Request
325 * generate the nsOperationKey
326 * generate the nsParameters
328 public void prepareSDNCRequest (DelegateExecution execution) {
329 logger.info(" ***** Started prepareSDNCRequest *****")
333 String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
334 String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
335 String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
336 String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
338 String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
339 String hdrRequestId = execution.getVariable("mso-request-id")
340 String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
341 String source = execution.getVariable("source")
342 String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
343 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
344 String serviceType = resourceInputObj.getServiceType()
345 String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
346 String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
347 String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
348 String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
349 String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
350 String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
351 String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
352 String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
353 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
354 String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
355 String resourceInputPrameters = resourceInputObj.getResourceParameters()
356 String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
357 //here convert json string to xml string
358 String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
359 // 1. prepare assign topology via SDNC Adapter SUBFLOW call
360 String sdncTopologyCreateRequest = "";
362 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
366 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
367 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
368 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
369 <sdncadapter:RequestHeader>
370 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
371 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
372 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
373 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
374 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
375 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
376 </sdncadapter:RequestHeader>
377 <sdncadapterworkflow:SDNCRequestData>
378 <request-information>
379 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
380 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
381 <source>${msoUtils.xmlEscape(source)}</source>
382 <notification-url></notification-url>
383 <order-number></order-number>
384 <order-version></order-version>
385 </request-information>
386 <service-information>
387 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
388 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
389 <onap-model-information>
390 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
391 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
392 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
393 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
394 </onap-model-information>
395 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
396 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
397 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
398 </service-information>
400 <vnf-type></vnf-type>
401 <onap-model-information>
402 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
403 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
404 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
405 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
406 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
407 </onap-model-information>
410 <vnf-input-parameters>
411 $netowrkInputParameters
412 </vnf-input-parameters>
413 <request-version></request-version>
414 <vnf-name></vnf-name>
418 </sdncadapterworkflow:SDNCRequestData>
419 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
422 String vnfid = resourceInputObj.getVnfId()
423 ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
424 String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
425 String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
426 String vnfmodelUuid = vfModelInfo.getModelUuid()
427 String vnfmodelVersion = vfModelInfo.getModelVersion()
428 String vnfmodelName = vfModelInfo.getModelName()
429 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
430 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
431 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
432 <sdncadapter:RequestHeader>
433 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
434 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
435 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
436 <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
437 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
438 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
439 </sdncadapter:RequestHeader>
440 <sdncadapterworkflow:SDNCRequestData>
441 <request-information>
442 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
443 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
444 <source>${msoUtils.xmlEscape(source)}</source>
445 <notification-url></notification-url>
446 <order-number></order-number>
447 <order-version></order-version>
448 </request-information>
449 <service-information>
450 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
451 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
452 <onap-model-information>
453 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
454 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
455 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
456 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
457 </onap-model-information>
458 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
459 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
460 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
461 </service-information>
463 <onap-model-information>
464 <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
465 <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
466 <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
467 <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
468 <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
469 </onap-model-information>
470 <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
472 <vf-module-information>
473 <from-preload>false</from-preload>
474 <onap-model-information>
475 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
476 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
477 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
478 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
479 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
480 </onap-model-information>
481 </vf-module-information>
482 <vf-module-request-input>
483 <vf-module-input-parameters>
484 $netowrkInputParameters
485 </vf-module-input-parameters>
486 </vf-module-request-input>
487 </sdncadapterworkflow:SDNCRequestData>
488 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
491 // sdwanvpnattachment or sotnvpnattachment
492 case "ALLOTTED_RESOURCE" :
493 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
494 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
495 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
496 <sdncadapter:RequestHeader>
497 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
498 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
499 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
500 <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
501 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
502 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
503 </sdncadapter:RequestHeader>
504 <sdncadapterworkflow:SDNCRequestData>
505 <request-information>
506 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
507 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
508 <source>${msoUtils.xmlEscape(source)}</source>
509 <notification-url></notification-url>
510 <order-number></order-number>
511 <order-version></order-version>
512 </request-information>
513 <service-information>
514 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
515 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
516 <onap-model-information>
517 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
518 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
519 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
520 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
521 </onap-model-information>
522 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
523 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
524 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
525 </service-information>
526 <allotted-resource-information>
527 <allotted-resource-id></allotted-resource-id>
528 <allotted-resource-type></allotted-resource-type>
529 <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
530 <onap-model-information>
531 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
532 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
533 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
534 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
535 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
536 </onap-model-information>
537 </allotted-resource-information>
538 <connection-attachment-request-input>
539 $netowrkInputParameters
540 </connection-attachment-request-input>
541 </sdncadapterworkflow:SDNCRequestData>
542 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
546 // for SDWANConnectivity and SOTNConnectivity:
548 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
549 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
550 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
551 <sdncadapter:RequestHeader>
552 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
553 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
554 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
555 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
556 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
557 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
558 </sdncadapter:RequestHeader>
559 <sdncadapterworkflow:SDNCRequestData>
560 <request-information>
561 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
562 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
563 <source>${msoUtils.xmlEscape(source)}</source>
564 <notification-url></notification-url>
565 <order-number></order-number>
566 <order-version></order-version>
567 </request-information>
568 <service-information>
569 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
570 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
571 <onap-model-information>
572 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
573 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
574 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
575 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
576 </onap-model-information>
577 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
578 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
579 </service-information>
580 <network-information>
581 <onap-model-information>
582 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
583 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
584 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
585 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
586 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
587 </onap-model-information>
588 </network-information>
589 <network-request-input>
590 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
591 </network-request-input>
592 </sdncadapterworkflow:SDNCRequestData>
593 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
598 String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
599 execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
600 logger.debug("sdncAdapterWorkflowRequest - " + "\n" + sndcTopologyCreateRequesAsString)
602 } catch (Exception ex) {
603 String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
604 logger.debug(exceptionMessage)
605 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
608 logger.info(" ***** Exit prepareSDNCRequest *****")
611 private void setProgressUpdateVariables(DelegateExecution execution, String body) {
612 def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
613 execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
614 execution.setVariable("CVFMI_updateResOperStatusRequest", body)
617 public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
618 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
619 String operType = resourceInputObj.getOperationType()
620 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
621 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
622 String operationId = resourceInputObj.getOperationId()
623 String progress = "20"
624 String status = "processing"
625 String statusDescription = "SDCN resource creation invoked"
627 execution.getVariable("operationId")
630 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
631 xmlns:ns="http://org.onap.so/requestsdb">
634 <ns:updateResourceOperationStatus>
635 <operType>${msoUtils.xmlEscape(operType)}</operType>
636 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
637 <progress>${msoUtils.xmlEscape(progress)}</progress>
638 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
639 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
640 <status>${msoUtils.xmlEscape(status)}</status>
641 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
642 </ns:updateResourceOperationStatus>
644 </soapenv:Envelope>""";
646 setProgressUpdateVariables(execution, body)
650 public void prepareUpdateAfterCreateSDNCResource(execution) {
651 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
652 String operType = resourceInputObj.getOperationType()
653 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
654 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
655 String operationId = resourceInputObj.getOperationId()
656 String progress = "100"
657 String status = "finished"
658 String statusDescription = "SDCN resource creation and activation completed"
660 execution.getVariable("operationId")
663 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
664 xmlns:ns="http://org.onap.so/requestsdb">
667 <ns:updateResourceOperationStatus>
668 <operType>${msoUtils.xmlEscape(operType)}</operType>
669 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
670 <progress>${msoUtils.xmlEscape(progress)}</progress>
671 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
672 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
673 <status>${msoUtils.xmlEscape(status)}</status>
674 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
675 </ns:updateResourceOperationStatus>
677 </soapenv:Envelope>""";
679 setProgressUpdateVariables(execution, body)
682 public void afterCreateSDNCCall(DelegateExecution execution){
683 logger.info(" ***** Started prepareSDNCRequest *****")
684 String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
685 String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
687 def instnaceId = getInstanceId(execution)
688 execution.setVariable("resourceInstanceId", instnaceId)
690 logger.info("response from sdnc, response code :" + responseCode + " response object :" + responseObj)
691 logger.info(" ***** Exit prepareSDNCRequest *****")
694 private def getInstanceId(DelegateExecution execution) {
695 def response = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
697 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
698 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
701 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
704 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
707 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
709 case "ALLOTTED_RESOURCE":
710 // sdwanvpnattachment or sotnvpnattachment
711 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
714 // SDWANConnectivity or SOTN Connectivity
715 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
718 return val.toString()
721 public void sendSyncResponse (DelegateExecution execution) {
722 logger.debug(" *** sendSyncResponse *** ")
725 String operationStatus = "finished"
726 // RESTResponse for main flow
727 String vnfid=execution.getVariable("resourceInstanceId");
728 String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
729 logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
730 sendWorkflowResponse(execution, 202, resourceOperationResp)
731 execution.setVariable("sentSyncResponse", true)
733 } catch (Exception ex) {
734 String msg = "Exception in sendSyncResponse:" + ex.getMessage()
736 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
738 logger.debug(" ***** Exit sendSyncResponse *****")