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
25 import com.google.gson.Gson
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.aai.domain.yang.v13.Pnf
36 import org.onap.aai.domain.yang.v13.Pnfs
37 import org.onap.so.bpmn.common.recipe.ResourceInput
38 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
39 import org.onap.so.bpmn.common.scripts.AaiUtil
40 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
41 import org.onap.so.bpmn.common.scripts.ExceptionUtil
42 import org.onap.so.bpmn.common.scripts.MsoUtils
43 import org.onap.so.bpmn.core.domain.ModelInfo
44 import org.onap.so.bpmn.core.domain.ResourceType
45 import org.onap.so.bpmn.core.json.JsonUtils
46 import org.onap.so.bpmn.core.UrnPropertiesReader
47 import org.onap.so.client.aai.AAIObjectPlurals
48 import org.onap.so.client.aai.AAIResourcesClient
49 import org.onap.so.client.aai.AAIObjectType
50 import org.onap.so.client.aai.entities.uri.AAIResourceUri
51 import org.onap.so.client.aai.entities.uri.AAIUriFactory
52 import org.slf4j.Logger
53 import org.slf4j.LoggerFactory
55 import static org.apache.commons.lang3.StringUtils.*
58 * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
59 * flow for SDNC Network Resource Create
61 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
63 private static final Logger logger = LoggerFactory.getLogger( CreateSDNCNetworkResource.class);
64 String Prefix="CRESDNCRES_"
66 ExceptionUtil exceptionUtil = new ExceptionUtil()
68 JsonUtils jsonUtil = new JsonUtils()
70 MsoUtils msoUtils = new MsoUtils()
72 public void preProcessRequest(DelegateExecution execution){
74 logger.info(" ***** Started preProcessRequest *****")
77 //get bpmn inputs from resource request.
78 String requestId = execution.getVariable("mso-request-id")
79 String requestAction = execution.getVariable("requestAction")
80 logger.info("The requestAction is: " + requestAction)
81 String recipeParamsFromRequest = execution.getVariable("recipeParams")
82 logger.info("The recipeParams is: " + recipeParamsFromRequest)
83 String resourceInput = execution.getVariable("resourceInput")
84 logger.info("The resourceInput is: " + resourceInput)
85 //Get ResourceInput Object
86 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
87 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
89 //Deal with recipeParams
90 String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
91 String resourceName = resourceInputObj.getResourceInstanceName()
93 //For sdnc requestAction default is "createNetworkInstance"
94 String operationType = "Network"
95 if(!StringUtils.isBlank(recipeParamsFromRequest)){
96 //the operationType from worflow(first node) is second priority.
97 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
99 if(!StringUtils.isBlank(recipeParamsFromWf)){
100 //the operationType from worflow(first node) is highest priority.
101 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
104 String sdnc_svcAction = "create"
105 String sdnc_requestAction = sdnc_svcAction.capitalize() + UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".operation-type") + "Instance"
106 String isActivateRequired = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".activation-required")
107 execution.setVariable("isActivateRequired", isActivateRequired)
109 execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
110 execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
111 execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
112 execution.setVariable("mso-request-id", requestId)
113 execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
114 } catch (BpmnError e) {
116 } catch (Exception ex){
117 msg = "Exception in preProcessRequest " + ex.getMessage()
119 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
123 String customizeResourceParam(String networkInputParametersJson) {
124 List<Map<String, Object>> paramList = new ArrayList();
125 JSONObject jsonObject = new JSONObject(networkInputParametersJson);
126 Iterator iterator = jsonObject.keys();
127 while (iterator.hasNext()) {
128 String key = iterator.next();
129 HashMap<String, String> hashMap = new HashMap();
130 hashMap.put("name", key);
131 hashMap.put("value", jsonObject.get(key))
132 paramList.add(hashMap)
134 Map<String, List<Map<String, Object>>> paramMap = new HashMap();
135 paramMap.put("param", paramList);
137 return new JSONObject(paramMap).toString();
140 private List<Metadatum> getMetaDatum(String customerId,
141 String serviceType, String serId) {
142 logger.debug("Enter getPnfInstance")
143 AAIResourcesClient client = new AAIResourcesClient()
145 // think how AAI queried for PNF name using the name
146 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
147 customerId, serviceType, serId)
148 logger.debug("uri for pnf get:" + uri.toString())
150 Metadata metadata = client.get(uri).asBean(Metadata.class).get()
151 return metadata.getMetadatum()
155 * This method updates the resource input by collecting required info from AAI
158 public ResourceInput updateResourceInput(DelegateExecution execution) {
159 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
160 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
163 def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
164 String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
167 case ~/[\w\s\W]*OLT[\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")
178 List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
179 resourceInputObj.getServiceType(),
180 resourceInputObj.getServiceInstanceId())
181 for(Metadatum datum: metadatum) {
182 if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
183 cvlan = datum.getMetaval()
186 if (datum.getMetaname().equalsIgnoreCase("svlan")) {
187 svlan = datum.getMetaval()
190 if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
191 remoteId = datum.getMetaval()
195 logger.debug("cvlan: "+cvlan+" | svlan: "+svlan+" | remoteId: "+remoteId)
197 String manufacturer = jsonUtil.getJsonValue(serInput,
198 "service.parameters.requestInputs.ont_ont_manufacturer")
199 String ontsn = jsonUtil.getJsonValue(serInput,
200 "service.parameters.requestInputs.ont_ont_serial_num")
202 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
203 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
204 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.accessID", remoteId)
205 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
206 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
208 logger.debug("old resource input:" + resourceInputObj.toString())
209 resourceInputObj.setResourceParameters(uResourceInput)
210 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
211 logger.debug("new resource Input :" + resourceInputObj.toString())
214 case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ :
215 // get the required properties and update in resource input
216 def resourceInput = resourceInputObj.getResourceParameters()
217 String incomingRequest = resourceInputObj.getRequestsInputs()
218 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
219 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
220 JSONObject inputParameters = new JSONObject(requestInputs)
225 String manufacturer = jsonUtil.getJsonValue(serInput,
226 "service.parameters.requestInputs.ont_ont_manufacturer")
228 String ontsn = jsonUtil.getJsonValue(serInput,
229 "service.parameters.requestInputs.ont_ont_serial_num")
231 List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
232 resourceInputObj.getServiceType(),
233 resourceInputObj.getServiceInstanceId())
234 for(Metadatum datum: metadatum) {
235 if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
236 cvlan = datum.getMetaval()
239 if (datum.getMetaname().equalsIgnoreCase("svlan")) {
240 svlan = datum.getMetaval()
243 if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
244 remoteId = datum.getMetaval()
248 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
249 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
250 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
251 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_access_id", remoteId)
252 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
253 logger.debug("old resource input:" + resourceInputObj.toString())
254 resourceInputObj.setResourceParameters(uResourceInput)
255 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
256 logger.debug("new resource Input :" + resourceInputObj.toString())
260 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
262 def resourceInput = resourceInputObj.getResourceParameters()
263 String incomingRequest = resourceInputObj.getRequestsInputs()
264 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
265 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
266 JSONObject inputParameters = new JSONObject(requestInputs)
267 if(inputParameters.has("local-access-provider-id")) {
268 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
269 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
270 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
271 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
272 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
273 resourceInputObj.setResourceParameters(uResourceInput)
274 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
279 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
280 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
281 // fill attachment TP in networkInputParamJson
282 String customer = resourceInputObj.getGlobalSubscriberId()
283 String serviceType = resourceInputObj.getServiceType()
285 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
286 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
288 AAIResourcesClient client = new AAIResourcesClient()
289 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, customer, serviceType).queryParam("service-instance-name", parentServiceName)
290 ServiceInstances sis = client.get(uri).asBean(ServiceInstances.class).get()
291 ServiceInstance si = sis.getServiceInstance().get(0)
293 def parentServiceInstanceId = si.getServiceInstanceId()
294 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
300 return resourceInputObj
304 * Pre Process the BPMN Flow Request
306 * generate the nsOperationKey
307 * generate the nsParameters
309 public void prepareSDNCRequest (DelegateExecution execution) {
310 logger.info(" ***** Started prepareSDNCRequest *****")
314 String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
315 String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
316 String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
317 String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
319 String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
320 String hdrRequestId = execution.getVariable("mso-request-id")
321 String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
322 String source = execution.getVariable("source")
323 String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
324 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
325 String serviceType = resourceInputObj.getServiceType()
326 String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
327 String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
328 String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
329 String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
330 String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
331 String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
332 String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
333 String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
334 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
335 String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
336 String resourceInputPrameters = resourceInputObj.getResourceParameters()
337 String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
338 //here convert json string to xml string
339 String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
340 // 1. prepare assign topology via SDNC Adapter SUBFLOW call
341 String sdncTopologyCreateRequest = "";
345 //When a new resource creation request reaches SO, the parent resources information needs to be provided
346 //while creating the child resource.
348 String vnfmodelInvariantUuid = ""
349 String vnfmodelCustomizationUuid = ""
350 String vnfmodelUuid = ""
351 String vnfmodelVersion = ""
352 String vnfmodelName = ""
353 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
354 if(modelType.equalsIgnoreCase(ResourceType.GROUP.toString())) {
355 vnfid = resourceInputObj.getVnfId()
356 ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
357 vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
358 vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
359 vnfmodelUuid = vfModelInfo.getModelUuid()
360 vnfmodelVersion = vfModelInfo.getModelVersion()
361 vnfmodelName = vfModelInfo.getModelName()
366 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
367 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
368 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
369 <sdncadapter:RequestHeader>
370 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
371 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
372 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
373 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
374 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
375 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
376 </sdncadapter:RequestHeader>
377 <sdncadapterworkflow:SDNCRequestData>
378 <request-information>
379 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
380 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
381 <source>${msoUtils.xmlEscape(source)}</source>
382 <notification-url></notification-url>
383 <order-number></order-number>
384 <order-version></order-version>
385 </request-information>
386 <service-information>
387 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
388 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
389 <onap-model-information>
390 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
391 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
392 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
393 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
394 </onap-model-information>
395 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
396 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
397 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
398 </service-information>
400 <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
401 <vnf-type></vnf-type>
402 <onap-model-information>
403 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
404 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
405 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
406 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
407 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
408 </onap-model-information>
411 <vnf-input-parameters>
412 $netowrkInputParameters
413 </vnf-input-parameters>
414 <request-version></request-version>
415 <vnf-name></vnf-name>
419 </sdncadapterworkflow:SDNCRequestData>
420 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
423 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
424 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
425 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
426 <sdncadapter:RequestHeader>
427 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
428 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
429 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
430 <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
431 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
432 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
433 </sdncadapter:RequestHeader>
434 <sdncadapterworkflow:SDNCRequestData>
435 <request-information>
436 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
437 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
438 <source>${msoUtils.xmlEscape(source)}</source>
439 <notification-url></notification-url>
440 <order-number></order-number>
441 <order-version></order-version>
442 </request-information>
443 <service-information>
444 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
445 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
446 <onap-model-information>
447 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
448 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
449 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
450 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
451 </onap-model-information>
452 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
453 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
454 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
455 </service-information>
457 <onap-model-information>
458 <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
459 <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
460 <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
461 <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
462 <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
463 </onap-model-information>
464 <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
466 <vf-module-information>
467 <from-preload>false</from-preload>
468 <onap-model-information>
469 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
470 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
471 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
472 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
473 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
474 </onap-model-information>
475 </vf-module-information>
476 <vf-module-request-input>
477 <vf-module-input-parameters>
478 $netowrkInputParameters
479 </vf-module-input-parameters>
480 </vf-module-request-input>
481 </sdncadapterworkflow:SDNCRequestData>
482 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
485 // for SDWANConnectivity and SOTNConnectivity:
487 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
488 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
489 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
490 <sdncadapter:RequestHeader>
491 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
492 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
493 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
494 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
495 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
496 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
497 </sdncadapter:RequestHeader>
498 <sdncadapterworkflow:SDNCRequestData>
499 <request-information>
500 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
501 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
502 <source>${msoUtils.xmlEscape(source)}</source>
503 <notification-url></notification-url>
504 <order-number></order-number>
505 <order-version></order-version>
506 </request-information>
507 <service-information>
508 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
509 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
510 <onap-model-information>
511 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
512 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
513 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
514 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
515 </onap-model-information>
516 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
517 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
518 </service-information>
519 <network-information>
520 <onap-model-information>
521 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
522 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
523 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
524 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
525 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
526 </onap-model-information>
527 </network-information>
528 <network-request-input>
529 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
530 </network-request-input>
531 </sdncadapterworkflow:SDNCRequestData>
532 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
540 //switch (modelName) {
541 // case ~/[\w\s\W]*deviceVF[\w\s\W]*/
542 // case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
543 // case ~/[\w\s\W]*SiteVF[\w\s\W]*/:
544 /* sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
545 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
546 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
547 <sdncadapter:RequestHeader>
548 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
549 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
550 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
551 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
552 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
553 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
554 </sdncadapter:RequestHeader>
555 <sdncadapterworkflow:SDNCRequestData>
556 <request-information>
557 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
558 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
559 <source>${msoUtils.xmlEscape(source)}</source>
560 <notification-url></notification-url>
561 <order-number></order-number>
562 <order-version></order-version>
563 </request-information>
564 <service-information>
565 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
566 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
567 <onap-model-information>
568 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
569 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
570 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
571 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
572 </onap-model-information>
573 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
574 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
575 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
576 </service-information>
579 <vnf-type></vnf-type>
580 <onap-model-information>
581 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
582 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
583 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
584 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
585 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
586 </onap-model-information>
589 <vnf-input-parameters>
590 $netowrkInputParameters
591 </vnf-input-parameters>
592 <request-version></request-version>
593 <vnf-name></vnf-name>
597 </sdncadapterworkflow:SDNCRequestData>
598 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
603 //case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/
604 //case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
605 /* sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
606 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
607 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
608 <sdncadapter:RequestHeader>
609 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
610 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
611 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
612 <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
613 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
614 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
615 </sdncadapter:RequestHeader>
616 <sdncadapterworkflow:SDNCRequestData>
617 <request-information>
618 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
619 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
620 <source>${msoUtils.xmlEscape(source)}</source>
621 <notification-url></notification-url>
622 <order-number></order-number>
623 <order-version></order-version>
624 </request-information>
625 <service-information>
626 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
627 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
628 <onap-model-information>
629 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
630 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
631 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
632 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
633 </onap-model-information>
634 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
635 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
636 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
637 </service-information><vnf-information>
639 <vnf-type></vnf-type>
640 <onap-model-information>
641 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
642 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
643 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
644 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
645 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
646 </onap-model-information>
649 <vnf-input-parameters>
650 $netowrkInputParameters
651 </vnf-input-parameters>
652 <request-version></request-version>
653 <vnf-name></vnf-name>
657 <allotted-resource-information>
658 <!-- TODO: to be filled as per the request input -->
659 <allotted-resource-id></allotted-resource-id>
660 <allotted-resource-type></allotted-resource-type>
661 <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
662 <onap-model-information>
663 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
664 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
665 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
666 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
667 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
668 </onap-model-information>
669 </allotted-resource-information>
670 <connection-attachment-request-input>
671 $netowrkInputParameters
672 </connection-attachment-request-input>
673 </sdncadapterworkflow:SDNCRequestData>
674 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
677 // for SDWANConnectivity and SOTNConnectivity:
679 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
680 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
681 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
682 <sdncadapter:RequestHeader>
683 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
684 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
685 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
686 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
687 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
688 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
689 </sdncadapter:RequestHeader>
690 <sdncadapterworkflow:SDNCRequestData>
691 <request-information>
692 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
693 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
694 <source>${msoUtils.xmlEscape(source)}</source>
695 <notification-url></notification-url>
696 <order-number></order-number>
697 <order-version></order-version>
698 </request-information>
699 <service-information>
700 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
701 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
702 <onap-model-information>
703 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
704 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
705 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
706 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
707 </onap-model-information>
708 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
709 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
710 </service-information>
711 <network-information>
712 <onap-model-information>
713 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
714 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
715 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
716 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
717 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
718 </onap-model-information>
719 </network-information>
720 <network-request-input>
721 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
722 </network-request-input>
723 </sdncadapterworkflow:SDNCRequestData>
724 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
729 String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
730 execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
731 logger.debug("sdncAdapterWorkflowRequest - " + "\n" + sndcTopologyCreateRequesAsString)
733 } catch (Exception ex) {
734 String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
735 logger.debug(exceptionMessage)
736 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
739 logger.info(" ***** Exit prepareSDNCRequest *****")
742 private void setProgressUpdateVariables(DelegateExecution execution, String body) {
743 def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
744 execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
745 execution.setVariable("CVFMI_updateResOperStatusRequest", body)
748 public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
749 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
750 String operType = resourceInputObj.getOperationType()
751 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
752 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
753 String operationId = resourceInputObj.getOperationId()
754 String progress = "20"
755 String status = "processing"
756 String statusDescription = "SDCN resource creation invoked"
758 execution.getVariable("operationId")
761 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
762 xmlns:ns="http://org.onap.so/requestsdb">
765 <ns:updateResourceOperationStatus>
766 <operType>${msoUtils.xmlEscape(operType)}</operType>
767 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
768 <progress>${msoUtils.xmlEscape(progress)}</progress>
769 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
770 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
771 <status>${msoUtils.xmlEscape(status)}</status>
772 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
773 </ns:updateResourceOperationStatus>
775 </soapenv:Envelope>""";
777 setProgressUpdateVariables(execution, body)
781 public void prepareUpdateAfterCreateSDNCResource(execution) {
782 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
783 String operType = resourceInputObj.getOperationType()
784 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
785 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
786 String operationId = resourceInputObj.getOperationId()
787 String progress = "100"
788 String status = "finished"
789 String statusDescription = "SDCN resource creation and activation completed"
791 execution.getVariable("operationId")
794 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
795 xmlns:ns="http://org.onap.so/requestsdb">
798 <ns:updateResourceOperationStatus>
799 <operType>${msoUtils.xmlEscape(operType)}</operType>
800 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
801 <progress>${msoUtils.xmlEscape(progress)}</progress>
802 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
803 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
804 <status>${msoUtils.xmlEscape(status)}</status>
805 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
806 </ns:updateResourceOperationStatus>
808 </soapenv:Envelope>""";
810 setProgressUpdateVariables(execution, body)
813 public void afterCreateSDNCCall(DelegateExecution execution){
814 logger.info(" ***** Started prepareSDNCRequest *****")
815 String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
816 String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
818 def instnaceId = getInstnaceId(execution)
819 execution.setVariable("resourceInstanceId", instnaceId)
821 logger.info("response from sdnc, response code :" + responseCode + " response object :" + responseObj)
822 logger.info(" ***** Exit prepareSDNCRequest *****")
825 private def getInstnaceId(DelegateExecution execution) {
826 def response = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
828 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
829 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
833 //switch (modelName) {
834 // case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
835 // case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
836 // case ~/[\w\s\W]*Site[\w\s\W]*/:
837 // val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
840 // case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
841 // case ~/[\w\s\W]*sotnvpprepareUpdateAfterCreateSDNCResourcenattachment[\w\s\W]*/:
842 // val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
845 // for SDWANConnectivity and SOTNConnectivity and default:
847 // val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
852 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
855 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
858 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
861 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
864 return val.toString()
867 public void sendSyncResponse (DelegateExecution execution) {
868 logger.debug(" *** sendSyncResponse *** ")
871 String operationStatus = "finished"
872 // RESTResponse for main flow
873 String vnfid=execution.getVariable("resourceInstanceId");
874 String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
875 logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
876 sendWorkflowResponse(execution, 202, resourceOperationResp)
877 execution.setVariable("sentSyncResponse", true)
879 } catch (Exception ex) {
880 String msg = "Exception in sendSyncResponse:" + ex.getMessage()
882 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
884 logger.debug(" ***** Exit sendSyncResponse *****")