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