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