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 if(jsonObject.get(key)==null){
131 hashMap.put("value", "")
133 hashMap.put("value", jsonObject.get(key))
135 paramList.add(hashMap)
137 Map<String, List<Map<String, Object>>> paramMap = new HashMap()
138 paramMap.put("param", paramList)
140 return new JSONObject(paramMap).toString()
143 private List<Metadatum> getMetaDatum(String customerId,
144 String serviceType, String serId) {
145 logger.debug("Enter getPnfInstance")
146 AAIResourcesClient client = new AAIResourcesClient()
148 // think how AAI queried for PNF name using the name
149 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
150 customerId, serviceType, serId)
151 logger.debug("uri for pnf get:" + uri.toString())
153 Metadata metadata = client.get(uri).asBean(Metadata.class).get()
154 return metadata.getMetadatum()
158 * This method updates the resource input by collecting required info from AAI
161 public ResourceInput updateResourceInput(DelegateExecution execution) {
162 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
163 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
166 def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
167 String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
170 case ~/[\w\s\W]*OLT[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
171 case ~/[\w\s\W]*AccessConnectivity[\w\s\W]*/ :
172 // get the required properties and update in resource input
174 def resourceInput = resourceInputObj.getResourceParameters()
175 String incomingRequest = resourceInputObj.getRequestsInputs()
176 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
177 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
178 String cvlan = jsonUtil.getJsonValue(serInput,
179 "service.parameters.requestInputs.cvlan")
180 String svlan = jsonUtil.getJsonValue(serInput,
181 "service.parameters.requestInputs.svlan")
182 String remoteId = jsonUtil.getJsonValue(serInput,
183 "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
184 String manufacturer = jsonUtil.getJsonValue(serInput,
185 "service.parameters.requestInputs.ont_ont_manufacturer")
186 String ontsn = jsonUtil.getJsonValue(serInput,
187 "service.parameters.requestInputs.ont_ont_serial_num")
189 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
190 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
191 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.remote_id", remoteId)
192 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
193 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
194 logger.debug("old resource input:" + resourceInputObj.toString())
195 resourceInputObj.setResourceParameters(uResourceInput)
196 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
197 logger.debug("new resource Input :" + resourceInputObj.toString())
200 case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
201 case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
202 // get the required properties and update in resource input
203 def resourceInput = resourceInputObj.getResourceParameters()
204 String incomingRequest = resourceInputObj.getRequestsInputs()
205 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
206 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
207 JSONObject inputParameters = new JSONObject(requestInputs)
209 String cvlan = jsonUtil.getJsonValue(serInput,
210 "service.parameters.requestInputs.cvlan")
211 String svlan = jsonUtil.getJsonValue(serInput,
212 "service.parameters.requestInputs.svlan")
213 String manufacturer = jsonUtil.getJsonValue(serInput,
214 "service.parameters.requestInputs.ont_ont_manufacturer")
215 String remoteId = jsonUtil.getJsonValue(serInput,
216 "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
217 String ontsn = jsonUtil.getJsonValue(serInput,
218 "service.parameters.requestInputs.ont_ont_serial_num")
219 String serviceType = jsonUtil.getJsonValue(serInput,
220 "service.parameters.requestInputs.edgeinternetprofile_ip_service_type")
221 String macAddr = jsonUtil.getJsonValue(serInput,
222 "service.parameters.requestInputs.edgeinternetprofile_ip_rg_mac_addr")
223 String upStream = jsonUtil.getJsonValue(serInput,
224 "service.parameters.requestInputs.edgeinternetprofile_ip_upstream_speed")
225 String downStream = jsonUtil.getJsonValue(serInput,
226 "service.parameters.requestInputs.edgeinternetprofile_ip_downstream_speed")
228 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
229 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
230 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
231 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_remote_id", remoteId)
232 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
233 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_service_type", serviceType)
234 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_rg_mac_addr", macAddr)
235 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_upstream_speed", upStream)
236 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_downstream_speed", downStream)
237 logger.debug("old resource input:" + resourceInputObj.toString())
238 resourceInputObj.setResourceParameters(uResourceInput)
239 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
240 logger.debug("new resource Input :" + resourceInputObj.toString())
244 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
246 def resourceInput = resourceInputObj.getResourceParameters()
247 String incomingRequest = resourceInputObj.getRequestsInputs()
248 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
249 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
250 JSONObject inputParameters = new JSONObject(requestInputs)
251 if(inputParameters.has("local-access-provider-id")) {
252 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
253 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
254 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
255 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
256 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
257 resourceInputObj.setResourceParameters(uResourceInput)
258 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
263 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
264 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
265 case ~/[\w\s\W]*SOTN-Attachment[\w\s\W]*/ :
266 // fill attachment TP in networkInputParamJson
267 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : (StringUtils.containsIgnoreCase(modelName, "SOTN-Attachment") ? "elinesotnattachmentvf0_elinesotnattachmentvfc0_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName")
268 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
272 // Special case for handling alloted resource types
273 // in case name is different as expected
274 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
275 def vpnName = modelName + "_sotnVpnName"
276 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
280 return resourceInputObj
283 private void fillAttachmentTPInfo(ResourceInput resourceInputObj, DelegateExecution execution, String vpnName) {
285 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
287 AAIResourcesClient client = new AAIResourcesClient()
288 logger.info("sending request to resolve vpn-name:" + vpnName)
289 AAIResourceUri uri = AAIUriFactory.createResourceUri(new AAIObjectPlurals("/nodes", "/service-instances", "queryByName")).queryParam("service-instance-name", parentServiceName)
290 Optional<ServiceInstances> serviceInstancesOpt = client.get(ServiceInstances.class, uri)
292 if(serviceInstancesOpt.isPresent()) {
293 List<ServiceInstance> serviceInstanceList = serviceInstancesOpt.get().getServiceInstance()
294 logger.info("response from aai:" + serviceInstanceList.toString())
295 if (serviceInstanceList.size() > 0) {
296 ServiceInstance si = serviceInstanceList.get(0)
297 String parentServiceInstanceId = si.getServiceInstanceId()
298 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
299 logger.info("setting parentService id:" + parentServiceInstanceId)
301 logger.error("No service instance found for given name.")
304 logger.error("No nodes found with this name" + vpnName)
309 * Pre Process the BPMN Flow Request
311 * generate the nsOperationKey
312 * generate the nsParameters
314 public void prepareSDNCRequest (DelegateExecution execution) {
315 logger.info(" ***** Started prepareSDNCRequest *****")
319 String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
320 String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
321 String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
322 String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
324 String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
325 String hdrRequestId = execution.getVariable("mso-request-id")
326 String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
327 String source = execution.getVariable("source")
328 String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
329 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
330 String serviceType = resourceInputObj.getServiceType()
331 String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
332 String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
333 String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
334 String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
335 String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
336 String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid()
337 String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
338 String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
339 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
340 String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
341 String resourceInputPrameters = resourceInputObj.getResourceParameters()
342 String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
343 //here convert json string to xml string
344 String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
345 // 1. prepare assign topology via SDNC Adapter SUBFLOW call
346 String sdncTopologyCreateRequest = ""
348 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
352 if(modelName.contains("UNI") && "MDONS_OTN".equals(serviceType)){
354 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
355 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
356 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
357 <sdncadapter:RequestHeader>
358 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
359 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
360 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
361 <sdncadapter:SvcOperation>optical-service-create</sdncadapter:SvcOperation>
362 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
363 <sdncadapter:MsoAction>opticalservice</sdncadapter:MsoAction>
364 </sdncadapter:RequestHeader>
365 <sdncadapterworkflow:SDNCRequestData>
366 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
367 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
368 <service-type>${msoUtils.xmlEscape(serviceType)}</service-type>
369 <notification-url>sdncCallback</notification-url>
370 <source>${msoUtils.xmlEscape(source)}</source>
371 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
373 $netowrkInputParameters
375 </sdncadapterworkflow:SDNCRequestData>
376 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
378 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
379 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
380 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
381 <sdncadapter:RequestHeader>
382 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
383 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
384 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
385 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
386 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
387 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
388 </sdncadapter:RequestHeader>
389 <sdncadapterworkflow:SDNCRequestData>
390 <request-information>
391 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
392 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
393 <source>${msoUtils.xmlEscape(source)}</source>
394 <notification-url></notification-url>
395 <order-number></order-number>
396 <order-version></order-version>
397 </request-information>
398 <service-information>
399 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
400 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
401 <onap-model-information>
402 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
403 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
404 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
405 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
406 </onap-model-information>
407 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
408 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
409 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
410 </service-information>
412 <vnf-type></vnf-type>
413 <onap-model-information>
414 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
415 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
416 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
417 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
418 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
419 </onap-model-information>
422 <vnf-input-parameters>
423 $netowrkInputParameters
424 </vnf-input-parameters>
425 <request-version></request-version>
426 <vnf-name></vnf-name>
430 </sdncadapterworkflow:SDNCRequestData>
431 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
435 String vnfid = resourceInputObj.getVnfId()
436 ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
437 String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
438 String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
439 String vnfmodelUuid = vfModelInfo.getModelUuid()
440 String vnfmodelVersion = vfModelInfo.getModelVersion()
441 String vnfmodelName = vfModelInfo.getModelName()
442 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
443 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
444 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
445 <sdncadapter:RequestHeader>
446 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
447 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
448 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
449 <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
450 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
451 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
452 </sdncadapter:RequestHeader>
453 <sdncadapterworkflow:SDNCRequestData>
454 <request-information>
455 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
456 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
457 <source>${msoUtils.xmlEscape(source)}</source>
458 <notification-url></notification-url>
459 <order-number></order-number>
460 <order-version></order-version>
461 </request-information>
462 <service-information>
463 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
464 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
465 <onap-model-information>
466 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
467 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
468 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
469 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
470 </onap-model-information>
471 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
472 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
473 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
474 </service-information>
476 <onap-model-information>
477 <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
478 <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
479 <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
480 <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
481 <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
482 </onap-model-information>
483 <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
485 <vf-module-information>
486 <from-preload>false</from-preload>
487 <onap-model-information>
488 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
489 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
490 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
491 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
492 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
493 </onap-model-information>
494 </vf-module-information>
495 <vf-module-request-input>
496 <vf-module-input-parameters>
497 $netowrkInputParameters
498 </vf-module-input-parameters>
499 </vf-module-request-input>
500 </sdncadapterworkflow:SDNCRequestData>
501 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
504 // sdwanvpnattachment or sotnvpnattachment
505 case "ALLOTTED_RESOURCE" :
506 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
507 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
508 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
509 <sdncadapter:RequestHeader>
510 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
511 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
512 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
513 <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
514 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
515 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
516 </sdncadapter:RequestHeader>
517 <sdncadapterworkflow:SDNCRequestData>
518 <request-information>
519 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
520 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
521 <source>${msoUtils.xmlEscape(source)}</source>
522 <notification-url></notification-url>
523 <order-number></order-number>
524 <order-version></order-version>
525 </request-information>
526 <service-information>
527 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
528 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
529 <onap-model-information>
530 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
531 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
532 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
533 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
534 </onap-model-information>
535 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
536 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
537 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
538 </service-information>
539 <allotted-resource-information>
540 <allotted-resource-id></allotted-resource-id>
541 <allotted-resource-type></allotted-resource-type>
542 <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
543 <onap-model-information>
544 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
545 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
546 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
547 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
548 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
549 </onap-model-information>
550 </allotted-resource-information>
551 <connection-attachment-request-input>
552 $netowrkInputParameters
553 </connection-attachment-request-input>
554 </sdncadapterworkflow:SDNCRequestData>
555 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
559 // for SDWANConnectivity and SOTNConnectivity:
561 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
562 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
563 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
564 <sdncadapter:RequestHeader>
565 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
566 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
567 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
568 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
569 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
570 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
571 </sdncadapter:RequestHeader>
572 <sdncadapterworkflow:SDNCRequestData>
573 <request-information>
574 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
575 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
576 <source>${msoUtils.xmlEscape(source)}</source>
577 <notification-url></notification-url>
578 <order-number></order-number>
579 <order-version></order-version>
580 </request-information>
581 <service-information>
582 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
583 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
584 <onap-model-information>
585 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
586 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
587 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
588 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
589 </onap-model-information>
590 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
591 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
592 </service-information>
593 <network-information>
594 <onap-model-information>
595 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
596 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
597 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
598 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
599 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
600 </onap-model-information>
601 </network-information>
602 <network-request-input>
603 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
604 </network-request-input>
605 </sdncadapterworkflow:SDNCRequestData>
606 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
611 String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
612 execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
613 logger.debug("sdncAdapterWorkflowRequest - " + "\n" + sndcTopologyCreateRequesAsString)
615 } catch (Exception ex) {
616 String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
617 logger.debug(exceptionMessage)
618 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
621 logger.info(" ***** Exit prepareSDNCRequest *****")
624 private void setProgressUpdateVariables(DelegateExecution execution, String body) {
625 def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
626 execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
627 execution.setVariable("CVFMI_updateResOperStatusRequest", body)
630 public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
631 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
632 String operType = resourceInputObj.getOperationType()
633 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
634 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
635 String operationId = resourceInputObj.getOperationId()
636 String progress = "20"
637 String status = "processing"
638 String statusDescription = "SDCN resource creation invoked"
640 execution.getVariable("operationId")
643 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
644 xmlns:ns="http://org.onap.so/requestsdb">
647 <ns:updateResourceOperationStatus>
648 <operType>${msoUtils.xmlEscape(operType)}</operType>
649 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
650 <progress>${msoUtils.xmlEscape(progress)}</progress>
651 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
652 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
653 <status>${msoUtils.xmlEscape(status)}</status>
654 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
655 </ns:updateResourceOperationStatus>
657 </soapenv:Envelope>"""
659 setProgressUpdateVariables(execution, body)
663 public void prepareUpdateAfterCreateSDNCResource(execution) {
664 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
665 String operType = resourceInputObj.getOperationType()
666 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
667 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
668 String operationId = resourceInputObj.getOperationId()
669 String progress = "100"
670 String status = "finished"
671 String statusDescription = "SDCN resource creation and activation completed"
673 execution.getVariable("operationId")
676 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
677 xmlns:ns="http://org.onap.so/requestsdb">
680 <ns:updateResourceOperationStatus>
681 <operType>${msoUtils.xmlEscape(operType)}</operType>
682 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
683 <progress>${msoUtils.xmlEscape(progress)}</progress>
684 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
685 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
686 <status>${msoUtils.xmlEscape(status)}</status>
687 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
688 </ns:updateResourceOperationStatus>
690 </soapenv:Envelope>"""
692 setProgressUpdateVariables(execution, body)
695 public void afterCreateSDNCCall(DelegateExecution execution){
696 logger.info(" ***** Started prepareSDNCRequest *****")
697 String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
698 String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
700 def instnaceId = getInstanceId(execution)
701 execution.setVariable("resourceInstanceId", instnaceId)
703 logger.info("response from sdnc, response code :" + responseCode + " response object :" + responseObj)
704 logger.info(" ***** Exit prepareSDNCRequest *****")
707 private def getInstanceId(DelegateExecution execution) {
708 def response = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
710 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
711 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
714 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
717 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
720 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
722 case "ALLOTTED_RESOURCE":
723 // sdwanvpnattachment or sotnvpnattachment
724 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
727 // SDWANConnectivity or SOTN Connectivity
728 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
731 return val.toString()
734 public void sendSyncResponse (DelegateExecution execution) {
735 logger.debug(" *** sendSyncResponse *** ")
738 String operationStatus = "finished"
739 // RESTResponse for main flow
740 String vnfid=execution.getVariable("resourceInstanceId")
741 String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
742 logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
743 sendWorkflowResponse(execution, 202, resourceOperationResp)
744 execution.setVariable("sentSyncResponse", true)
746 } catch (Exception ex) {
747 String msg = "Exception in sendSyncResponse:" + ex.getMessage()
749 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
751 logger.debug(" ***** Exit sendSyncResponse *****")