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]*/ : // for backward compatibilty only, this case will be deprecated
167 case ~/[\w\s\W]*AccessConnectivity[\w\s\W]*/ :
168 // get the required properties and update in resource input
170 def resourceInput = resourceInputObj.getResourceParameters()
171 String incomingRequest = resourceInputObj.getRequestsInputs()
172 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
173 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
174 String cvlan = jsonUtil.getJsonValue(serInput,
175 "service.parameters.requestInputs.cvlan")
176 String svlan = jsonUtil.getJsonValue(serInput,
177 "service.parameters.requestInputs.svlan")
178 String remoteId = jsonUtil.getJsonValue(serInput,
179 "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
180 String manufacturer = jsonUtil.getJsonValue(serInput,
181 "service.parameters.requestInputs.ont_ont_manufacturer")
182 String ontsn = jsonUtil.getJsonValue(serInput,
183 "service.parameters.requestInputs.ont_ont_serial_num")
185 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
186 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
187 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.remote_id", remoteId)
188 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
189 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
190 logger.debug("old resource input:" + resourceInputObj.toString())
191 resourceInputObj.setResourceParameters(uResourceInput)
192 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
193 logger.debug("new resource Input :" + resourceInputObj.toString())
196 case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
197 case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
198 // get the required properties and update in resource input
199 def resourceInput = resourceInputObj.getResourceParameters()
200 String incomingRequest = resourceInputObj.getRequestsInputs()
201 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
202 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
203 JSONObject inputParameters = new JSONObject(requestInputs)
205 String cvlan = jsonUtil.getJsonValue(serInput,
206 "service.parameters.requestInputs.cvlan")
207 String svlan = jsonUtil.getJsonValue(serInput,
208 "service.parameters.requestInputs.svlan")
209 String manufacturer = jsonUtil.getJsonValue(serInput,
210 "service.parameters.requestInputs.ont_ont_manufacturer")
211 String remoteId = jsonUtil.getJsonValue(serInput,
212 "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
213 String ontsn = jsonUtil.getJsonValue(serInput,
214 "service.parameters.requestInputs.ont_ont_serial_num")
215 String serviceType = jsonUtil.getJsonValue(serInput,
216 "service.parameters.requestInputs.edgeinternetprofile_ip_service_type")
217 String macAddr = jsonUtil.getJsonValue(serInput,
218 "service.parameters.requestInputs.edgeinternetprofile_ip_rg_mac_addr")
219 String upStream = jsonUtil.getJsonValue(serInput,
220 "service.parameters.requestInputs.edgeinternetprofile_ip_upstream_speed")
221 String downStream = jsonUtil.getJsonValue(serInput,
222 "service.parameters.requestInputs.edgeinternetprofile_ip_downstream_speed")
224 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
225 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
226 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
227 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_remote_id", remoteId)
228 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
229 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_service_type", serviceType)
230 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_rg_mac_addr", macAddr)
231 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_upstream_speed", upStream)
232 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_downstream_speed", downStream)
233 logger.debug("old resource input:" + resourceInputObj.toString())
234 resourceInputObj.setResourceParameters(uResourceInput)
235 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
236 logger.debug("new resource Input :" + resourceInputObj.toString())
240 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
242 def resourceInput = resourceInputObj.getResourceParameters()
243 String incomingRequest = resourceInputObj.getRequestsInputs()
244 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
245 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
246 JSONObject inputParameters = new JSONObject(requestInputs)
247 if(inputParameters.has("local-access-provider-id")) {
248 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
249 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
250 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
251 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
252 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
253 resourceInputObj.setResourceParameters(uResourceInput)
254 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
259 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
260 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
261 case ~/[\w\s\W]*SOTN-Attachment[\w\s\W]*/ :
262 // fill attachment TP in networkInputParamJson
263 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : (StringUtils.containsIgnoreCase(modelName, "SOTN-Attachment") ? "elinesotnattachmentvf0_elinesotnattachmentvfc0_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName")
264 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
268 // Special case for handling alloted resource types
269 // in case name is different as expected
270 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
271 def vpnName = modelName + "_sotnVpnName"
272 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
276 return resourceInputObj
279 private void fillAttachmentTPInfo(ResourceInput resourceInputObj, DelegateExecution execution, String vpnName) {
281 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
283 AAIResourcesClient client = new AAIResourcesClient()
284 logger.info("sending request to resolve vpn-name:" + vpnName)
285 AAIResourceUri uri = AAIUriFactory.createResourceUri(new AAIObjectPlurals("/nodes", "/service-instances", "queryByName")).queryParam("service-instance-name", parentServiceName)
286 Optional<ServiceInstances> serviceInstancesOpt = client.get(ServiceInstances.class, uri)
288 if(serviceInstancesOpt.isPresent()) {
289 List<ServiceInstance> serviceInstanceList = serviceInstancesOpt.get().getServiceInstance()
290 logger.info("response from aai:" + serviceInstanceList.toString())
291 if (serviceInstanceList.size() > 0) {
292 ServiceInstance si = serviceInstanceList.get(0)
293 String parentServiceInstanceId = si.getServiceInstanceId()
294 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
295 logger.info("setting parentService id:" + parentServiceInstanceId)
297 logger.error("No service instance found for given name.")
300 logger.error("No nodes found with this name" + vpnName)
305 * Pre Process the BPMN Flow Request
307 * generate the nsOperationKey
308 * generate the nsParameters
310 public void prepareSDNCRequest (DelegateExecution execution) {
311 logger.info(" ***** Started prepareSDNCRequest *****")
315 String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
316 String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
317 String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
318 String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
320 String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
321 String hdrRequestId = execution.getVariable("mso-request-id")
322 String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
323 String source = execution.getVariable("source")
324 String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
325 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
326 String serviceType = resourceInputObj.getServiceType()
327 String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
328 String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
329 String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
330 String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
331 String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
332 String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid()
333 String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
334 String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
335 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
336 String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
337 String resourceInputPrameters = resourceInputObj.getResourceParameters()
338 String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
339 //here convert json string to xml string
340 String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
341 // 1. prepare assign topology via SDNC Adapter SUBFLOW call
342 String sdncTopologyCreateRequest = ""
344 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
348 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
349 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
350 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
351 <sdncadapter:RequestHeader>
352 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
353 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
354 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
355 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
356 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
357 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
358 </sdncadapter:RequestHeader>
359 <sdncadapterworkflow:SDNCRequestData>
360 <request-information>
361 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
362 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
363 <source>${msoUtils.xmlEscape(source)}</source>
364 <notification-url></notification-url>
365 <order-number></order-number>
366 <order-version></order-version>
367 </request-information>
368 <service-information>
369 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
370 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
371 <onap-model-information>
372 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
373 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
374 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
375 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
376 </onap-model-information>
377 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
378 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
379 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
380 </service-information>
382 <vnf-type></vnf-type>
383 <onap-model-information>
384 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
385 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
386 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
387 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
388 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
389 </onap-model-information>
392 <vnf-input-parameters>
393 $netowrkInputParameters
394 </vnf-input-parameters>
395 <request-version></request-version>
396 <vnf-name></vnf-name>
400 </sdncadapterworkflow:SDNCRequestData>
401 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
404 String vnfid = resourceInputObj.getVnfId()
405 ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
406 String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
407 String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
408 String vnfmodelUuid = vfModelInfo.getModelUuid()
409 String vnfmodelVersion = vfModelInfo.getModelVersion()
410 String vnfmodelName = vfModelInfo.getModelName()
411 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
412 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
413 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
414 <sdncadapter:RequestHeader>
415 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
416 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
417 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
418 <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
419 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
420 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
421 </sdncadapter:RequestHeader>
422 <sdncadapterworkflow:SDNCRequestData>
423 <request-information>
424 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
425 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
426 <source>${msoUtils.xmlEscape(source)}</source>
427 <notification-url></notification-url>
428 <order-number></order-number>
429 <order-version></order-version>
430 </request-information>
431 <service-information>
432 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
433 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
434 <onap-model-information>
435 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
436 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
437 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
438 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
439 </onap-model-information>
440 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
441 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
442 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
443 </service-information>
445 <onap-model-information>
446 <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
447 <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
448 <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
449 <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
450 <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
451 </onap-model-information>
452 <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
454 <vf-module-information>
455 <from-preload>false</from-preload>
456 <onap-model-information>
457 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
458 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
459 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
460 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
461 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
462 </onap-model-information>
463 </vf-module-information>
464 <vf-module-request-input>
465 <vf-module-input-parameters>
466 $netowrkInputParameters
467 </vf-module-input-parameters>
468 </vf-module-request-input>
469 </sdncadapterworkflow:SDNCRequestData>
470 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
473 // sdwanvpnattachment or sotnvpnattachment
474 case "ALLOTTED_RESOURCE" :
475 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
476 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
477 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
478 <sdncadapter:RequestHeader>
479 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
480 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
481 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
482 <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
483 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
484 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
485 </sdncadapter:RequestHeader>
486 <sdncadapterworkflow:SDNCRequestData>
487 <request-information>
488 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
489 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
490 <source>${msoUtils.xmlEscape(source)}</source>
491 <notification-url></notification-url>
492 <order-number></order-number>
493 <order-version></order-version>
494 </request-information>
495 <service-information>
496 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
497 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
498 <onap-model-information>
499 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
500 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
501 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
502 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
503 </onap-model-information>
504 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
505 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
506 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
507 </service-information>
508 <allotted-resource-information>
509 <allotted-resource-id></allotted-resource-id>
510 <allotted-resource-type></allotted-resource-type>
511 <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
512 <onap-model-information>
513 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
514 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
515 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
516 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
517 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
518 </onap-model-information>
519 </allotted-resource-information>
520 <connection-attachment-request-input>
521 $netowrkInputParameters
522 </connection-attachment-request-input>
523 </sdncadapterworkflow:SDNCRequestData>
524 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
528 // for SDWANConnectivity and SOTNConnectivity:
530 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
531 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
532 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
533 <sdncadapter:RequestHeader>
534 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
535 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
536 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
537 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
538 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
539 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
540 </sdncadapter:RequestHeader>
541 <sdncadapterworkflow:SDNCRequestData>
542 <request-information>
543 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
544 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
545 <source>${msoUtils.xmlEscape(source)}</source>
546 <notification-url></notification-url>
547 <order-number></order-number>
548 <order-version></order-version>
549 </request-information>
550 <service-information>
551 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
552 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
553 <onap-model-information>
554 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
555 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
556 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
557 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
558 </onap-model-information>
559 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
560 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
561 </service-information>
562 <network-information>
563 <onap-model-information>
564 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
565 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
566 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
567 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
568 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
569 </onap-model-information>
570 </network-information>
571 <network-request-input>
572 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
573 </network-request-input>
574 </sdncadapterworkflow:SDNCRequestData>
575 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
580 String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
581 execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
582 logger.debug("sdncAdapterWorkflowRequest - " + "\n" + sndcTopologyCreateRequesAsString)
584 } catch (Exception ex) {
585 String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
586 logger.debug(exceptionMessage)
587 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
590 logger.info(" ***** Exit prepareSDNCRequest *****")
593 private void setProgressUpdateVariables(DelegateExecution execution, String body) {
594 def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
595 execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
596 execution.setVariable("CVFMI_updateResOperStatusRequest", body)
599 public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
600 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
601 String operType = resourceInputObj.getOperationType()
602 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
603 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
604 String operationId = resourceInputObj.getOperationId()
605 String progress = "20"
606 String status = "processing"
607 String statusDescription = "SDCN resource creation invoked"
609 execution.getVariable("operationId")
612 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
613 xmlns:ns="http://org.onap.so/requestsdb">
616 <ns:updateResourceOperationStatus>
617 <operType>${msoUtils.xmlEscape(operType)}</operType>
618 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
619 <progress>${msoUtils.xmlEscape(progress)}</progress>
620 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
621 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
622 <status>${msoUtils.xmlEscape(status)}</status>
623 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
624 </ns:updateResourceOperationStatus>
626 </soapenv:Envelope>"""
628 setProgressUpdateVariables(execution, body)
632 public void prepareUpdateAfterCreateSDNCResource(execution) {
633 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
634 String operType = resourceInputObj.getOperationType()
635 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
636 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
637 String operationId = resourceInputObj.getOperationId()
638 String progress = "100"
639 String status = "finished"
640 String statusDescription = "SDCN resource creation and activation completed"
642 execution.getVariable("operationId")
645 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
646 xmlns:ns="http://org.onap.so/requestsdb">
649 <ns:updateResourceOperationStatus>
650 <operType>${msoUtils.xmlEscape(operType)}</operType>
651 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
652 <progress>${msoUtils.xmlEscape(progress)}</progress>
653 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
654 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
655 <status>${msoUtils.xmlEscape(status)}</status>
656 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
657 </ns:updateResourceOperationStatus>
659 </soapenv:Envelope>"""
661 setProgressUpdateVariables(execution, body)
664 public void afterCreateSDNCCall(DelegateExecution execution){
665 logger.info(" ***** Started prepareSDNCRequest *****")
666 String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
667 String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
669 def instnaceId = getInstanceId(execution)
670 execution.setVariable("resourceInstanceId", instnaceId)
672 logger.info("response from sdnc, response code :" + responseCode + " response object :" + responseObj)
673 logger.info(" ***** Exit prepareSDNCRequest *****")
676 private def getInstanceId(DelegateExecution execution) {
677 def response = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
679 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
680 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
683 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
686 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
689 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
691 case "ALLOTTED_RESOURCE":
692 // sdwanvpnattachment or sotnvpnattachment
693 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
696 // SDWANConnectivity or SOTN Connectivity
697 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
700 return val.toString()
703 public void sendSyncResponse (DelegateExecution execution) {
704 logger.debug(" *** sendSyncResponse *** ")
707 String operationStatus = "finished"
708 // RESTResponse for main flow
709 String vnfid=execution.getVariable("resourceInstanceId")
710 String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
711 logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
712 sendWorkflowResponse(execution, 202, resourceOperationResp)
713 execution.setVariable("sentSyncResponse", true)
715 } catch (Exception ex) {
716 String msg = "Exception in sendSyncResponse:" + ex.getMessage()
718 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
720 logger.debug(" ***** Exit sendSyncResponse *****")