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.remote_id", remoteId)
205 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
206 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
207 logger.debug("old resource input:" + resourceInputObj.toString())
208 resourceInputObj.setResourceParameters(uResourceInput)
209 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
210 logger.debug("new resource Input :" + resourceInputObj.toString())
213 case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ :
214 // get the required properties and update in resource input
215 def resourceInput = resourceInputObj.getResourceParameters()
216 String incomingRequest = resourceInputObj.getRequestsInputs()
217 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
218 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
219 JSONObject inputParameters = new JSONObject(requestInputs)
224 String manufacturer = jsonUtil.getJsonValue(serInput,
225 "service.parameters.requestInputs.ont_ont_manufacturer")
227 String ontsn = jsonUtil.getJsonValue(serInput,
228 "service.parameters.requestInputs.ont_ont_serial_num")
230 List<Metadatum> metadatum = getMetaDatum(resourceInputObj.getGlobalSubscriberId(),
231 resourceInputObj.getServiceType(),
232 resourceInputObj.getServiceInstanceId())
233 for(Metadatum datum: metadatum) {
234 if (datum.getMetaname().equalsIgnoreCase("cvlan")) {
235 cvlan = datum.getMetaval()
238 if (datum.getMetaname().equalsIgnoreCase("svlan")) {
239 svlan = datum.getMetaval()
242 if (datum.getMetaname().equalsIgnoreCase("remoteId")) {
243 remoteId = datum.getMetaval()
247 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
248 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
249 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
250 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_access_id", remoteId)
251 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
252 logger.debug("old resource input:" + resourceInputObj.toString())
253 resourceInputObj.setResourceParameters(uResourceInput)
254 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
255 logger.debug("new resource Input :" + resourceInputObj.toString())
259 case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
261 def resourceInput = resourceInputObj.getResourceParameters()
262 String incomingRequest = resourceInputObj.getRequestsInputs()
263 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
264 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
265 JSONObject inputParameters = new JSONObject(requestInputs)
266 if(inputParameters.has("local-access-provider-id")) {
267 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
268 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
269 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
270 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
271 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
272 resourceInputObj.setResourceParameters(uResourceInput)
273 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
278 case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
279 case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
280 // fill attachment TP in networkInputParamJson
281 String customer = resourceInputObj.getGlobalSubscriberId()
282 String serviceType = resourceInputObj.getServiceType()
284 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName"
285 String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
287 AAIResourcesClient client = new AAIResourcesClient()
288 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.SERVICE_INSTANCE, customer, serviceType).queryParam("service-instance-name", parentServiceName)
289 ServiceInstances sis = client.get(uri).asBean(ServiceInstances.class).get()
290 ServiceInstance si = sis.getServiceInstance().get(0)
292 def parentServiceInstanceId = si.getServiceInstanceId()
293 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
299 return resourceInputObj
303 * Pre Process the BPMN Flow Request
305 * generate the nsOperationKey
306 * generate the nsParameters
308 public void prepareSDNCRequest (DelegateExecution execution) {
309 logger.info(" ***** Started prepareSDNCRequest *****")
313 String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
314 String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
315 String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
316 String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
318 String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
319 String hdrRequestId = execution.getVariable("mso-request-id")
320 String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
321 String source = execution.getVariable("source")
322 String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
323 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
324 String serviceType = resourceInputObj.getServiceType()
325 String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
326 String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
327 String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
328 String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
329 String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
330 String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
331 String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
332 String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
333 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
334 String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
335 String resourceInputPrameters = resourceInputObj.getResourceParameters()
336 String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
337 //here convert json string to xml string
338 String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
339 // 1. prepare assign topology via SDNC Adapter SUBFLOW call
340 String sdncTopologyCreateRequest = "";
344 //When a new resource creation request reaches SO, the parent resources information needs to be provided
345 //while creating the child resource.
347 String vnfmodelInvariantUuid = ""
348 String vnfmodelCustomizationUuid = ""
349 String vnfmodelUuid = ""
350 String vnfmodelVersion = ""
351 String vnfmodelName = ""
352 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
353 if(modelType.equalsIgnoreCase(ResourceType.GROUP.toString())) {
354 vnfid = resourceInputObj.getVnfId()
355 ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
356 vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
357 vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
358 vnfmodelUuid = vfModelInfo.getModelUuid()
359 vnfmodelVersion = vfModelInfo.getModelVersion()
360 vnfmodelName = vfModelInfo.getModelName()
365 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
366 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
367 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
368 <sdncadapter:RequestHeader>
369 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
370 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
371 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
372 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
373 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
374 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
375 </sdncadapter:RequestHeader>
376 <sdncadapterworkflow:SDNCRequestData>
377 <request-information>
378 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
379 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
380 <source>${msoUtils.xmlEscape(source)}</source>
381 <notification-url></notification-url>
382 <order-number></order-number>
383 <order-version></order-version>
384 </request-information>
385 <service-information>
386 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
387 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
388 <onap-model-information>
389 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
390 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
391 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
392 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
393 </onap-model-information>
394 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
395 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
396 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
397 </service-information>
399 <vnf-type></vnf-type>
400 <onap-model-information>
401 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
402 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
403 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
404 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
405 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
406 </onap-model-information>
409 <vnf-input-parameters>
410 $netowrkInputParameters
411 </vnf-input-parameters>
412 <request-version></request-version>
413 <vnf-name></vnf-name>
417 </sdncadapterworkflow:SDNCRequestData>
418 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
421 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
422 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
423 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
424 <sdncadapter:RequestHeader>
425 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
426 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
427 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
428 <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
429 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
430 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
431 </sdncadapter:RequestHeader>
432 <sdncadapterworkflow:SDNCRequestData>
433 <request-information>
434 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
435 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
436 <source>${msoUtils.xmlEscape(source)}</source>
437 <notification-url></notification-url>
438 <order-number></order-number>
439 <order-version></order-version>
440 </request-information>
441 <service-information>
442 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
443 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
444 <onap-model-information>
445 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
446 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
447 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
448 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
449 </onap-model-information>
450 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
451 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
452 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
453 </service-information>
455 <onap-model-information>
456 <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
457 <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
458 <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
459 <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
460 <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
461 </onap-model-information>
462 <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
464 <vf-module-information>
465 <from-preload>false</from-preload>
466 <onap-model-information>
467 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
468 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
469 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
470 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
471 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
472 </onap-model-information>
473 </vf-module-information>
474 <vf-module-request-input>
475 <vf-module-input-parameters>
476 $netowrkInputParameters
477 </vf-module-input-parameters>
478 </vf-module-request-input>
479 </sdncadapterworkflow:SDNCRequestData>
480 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
483 // for SDWANConnectivity and SOTNConnectivity:
485 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
486 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
487 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
488 <sdncadapter:RequestHeader>
489 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
490 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
491 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
492 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
493 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
494 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
495 </sdncadapter:RequestHeader>
496 <sdncadapterworkflow:SDNCRequestData>
497 <request-information>
498 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
499 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
500 <source>${msoUtils.xmlEscape(source)}</source>
501 <notification-url></notification-url>
502 <order-number></order-number>
503 <order-version></order-version>
504 </request-information>
505 <service-information>
506 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
507 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
508 <onap-model-information>
509 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
510 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
511 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
512 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
513 </onap-model-information>
514 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
515 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
516 </service-information>
517 <network-information>
518 <onap-model-information>
519 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
520 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
521 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
522 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
523 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
524 </onap-model-information>
525 </network-information>
526 <network-request-input>
527 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
528 </network-request-input>
529 </sdncadapterworkflow:SDNCRequestData>
530 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
538 //switch (modelName) {
539 // case ~/[\w\s\W]*deviceVF[\w\s\W]*/
540 // case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
541 // case ~/[\w\s\W]*SiteVF[\w\s\W]*/:
542 /* sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
543 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
544 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
545 <sdncadapter:RequestHeader>
546 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
547 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
548 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
549 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
550 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
551 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
552 </sdncadapter:RequestHeader>
553 <sdncadapterworkflow:SDNCRequestData>
554 <request-information>
555 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
556 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
557 <source>${msoUtils.xmlEscape(source)}</source>
558 <notification-url></notification-url>
559 <order-number></order-number>
560 <order-version></order-version>
561 </request-information>
562 <service-information>
563 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
564 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
565 <onap-model-information>
566 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
567 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
568 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
569 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
570 </onap-model-information>
571 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
572 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
573 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
574 </service-information>
577 <vnf-type></vnf-type>
578 <onap-model-information>
579 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
580 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
581 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
582 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
583 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
584 </onap-model-information>
587 <vnf-input-parameters>
588 $netowrkInputParameters
589 </vnf-input-parameters>
590 <request-version></request-version>
591 <vnf-name></vnf-name>
595 </sdncadapterworkflow:SDNCRequestData>
596 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
601 //case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/
602 //case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
603 /* sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
604 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
605 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
606 <sdncadapter:RequestHeader>
607 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
608 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
609 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
610 <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
611 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
612 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
613 </sdncadapter:RequestHeader>
614 <sdncadapterworkflow:SDNCRequestData>
615 <request-information>
616 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
617 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
618 <source>${msoUtils.xmlEscape(source)}</source>
619 <notification-url></notification-url>
620 <order-number></order-number>
621 <order-version></order-version>
622 </request-information>
623 <service-information>
624 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
625 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
626 <onap-model-information>
627 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
628 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
629 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
630 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
631 </onap-model-information>
632 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
633 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
634 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
635 </service-information><vnf-information>
637 <vnf-type></vnf-type>
638 <onap-model-information>
639 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
640 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
641 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
642 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
643 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
644 </onap-model-information>
647 <vnf-input-parameters>
648 $netowrkInputParameters
649 </vnf-input-parameters>
650 <request-version></request-version>
651 <vnf-name></vnf-name>
655 <allotted-resource-information>
656 <!-- TODO: to be filled as per the request input -->
657 <allotted-resource-id></allotted-resource-id>
658 <allotted-resource-type></allotted-resource-type>
659 <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
660 <onap-model-information>
661 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
662 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
663 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
664 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
665 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
666 </onap-model-information>
667 </allotted-resource-information>
668 <connection-attachment-request-input>
669 $netowrkInputParameters
670 </connection-attachment-request-input>
671 </sdncadapterworkflow:SDNCRequestData>
672 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
675 // for SDWANConnectivity and SOTNConnectivity:
677 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
678 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
679 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
680 <sdncadapter:RequestHeader>
681 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
682 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
683 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
684 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
685 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
686 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
687 </sdncadapter:RequestHeader>
688 <sdncadapterworkflow:SDNCRequestData>
689 <request-information>
690 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
691 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
692 <source>${msoUtils.xmlEscape(source)}</source>
693 <notification-url></notification-url>
694 <order-number></order-number>
695 <order-version></order-version>
696 </request-information>
697 <service-information>
698 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
699 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
700 <onap-model-information>
701 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
702 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
703 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
704 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
705 </onap-model-information>
706 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
707 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
708 </service-information>
709 <network-information>
710 <onap-model-information>
711 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
712 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
713 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
714 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
715 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
716 </onap-model-information>
717 </network-information>
718 <network-request-input>
719 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
720 </network-request-input>
721 </sdncadapterworkflow:SDNCRequestData>
722 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
727 String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
728 execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
729 logger.debug("sdncAdapterWorkflowRequest - " + "\n" + sndcTopologyCreateRequesAsString)
731 } catch (Exception ex) {
732 String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
733 logger.debug(exceptionMessage)
734 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
737 logger.info(" ***** Exit prepareSDNCRequest *****")
740 private void setProgressUpdateVariables(DelegateExecution execution, String body) {
741 def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
742 execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
743 execution.setVariable("CVFMI_updateResOperStatusRequest", body)
746 public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
747 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
748 String operType = resourceInputObj.getOperationType()
749 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
750 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
751 String operationId = resourceInputObj.getOperationId()
752 String progress = "20"
753 String status = "processing"
754 String statusDescription = "SDCN resource creation invoked"
756 execution.getVariable("operationId")
759 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
760 xmlns:ns="http://org.onap.so/requestsdb">
763 <ns:updateResourceOperationStatus>
764 <operType>${msoUtils.xmlEscape(operType)}</operType>
765 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
766 <progress>${msoUtils.xmlEscape(progress)}</progress>
767 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
768 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
769 <status>${msoUtils.xmlEscape(status)}</status>
770 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
771 </ns:updateResourceOperationStatus>
773 </soapenv:Envelope>""";
775 setProgressUpdateVariables(execution, body)
779 public void prepareUpdateAfterCreateSDNCResource(execution) {
780 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
781 String operType = resourceInputObj.getOperationType()
782 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
783 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
784 String operationId = resourceInputObj.getOperationId()
785 String progress = "100"
786 String status = "finished"
787 String statusDescription = "SDCN resource creation and activation completed"
789 execution.getVariable("operationId")
792 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
793 xmlns:ns="http://org.onap.so/requestsdb">
796 <ns:updateResourceOperationStatus>
797 <operType>${msoUtils.xmlEscape(operType)}</operType>
798 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
799 <progress>${msoUtils.xmlEscape(progress)}</progress>
800 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
801 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
802 <status>${msoUtils.xmlEscape(status)}</status>
803 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
804 </ns:updateResourceOperationStatus>
806 </soapenv:Envelope>""";
808 setProgressUpdateVariables(execution, body)
811 public void afterCreateSDNCCall(DelegateExecution execution){
812 logger.info(" ***** Started prepareSDNCRequest *****")
813 String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
814 String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
816 def instnaceId = getInstnaceId(execution)
817 execution.setVariable("resourceInstanceId", instnaceId)
819 logger.info("response from sdnc, response code :" + responseCode + " response object :" + responseObj)
820 logger.info(" ***** Exit prepareSDNCRequest *****")
823 private def getInstnaceId(DelegateExecution execution) {
824 def response = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
826 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
827 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
831 //switch (modelName) {
832 // case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
833 // case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
834 // case ~/[\w\s\W]*Site[\w\s\W]*/:
835 // val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
838 // case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
839 // case ~/[\w\s\W]*sotnvpprepareUpdateAfterCreateSDNCResourcenattachment[\w\s\W]*/:
840 // val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
843 // for SDWANConnectivity and SOTNConnectivity and default:
845 // val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
850 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
853 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
856 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
859 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
862 return val.toString()
865 public void sendSyncResponse (DelegateExecution execution) {
866 logger.debug(" *** sendSyncResponse *** ")
869 String operationStatus = "finished"
870 // RESTResponse for main flow
871 String vnfid=execution.getVariable("resourceInstanceId");
872 String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
873 logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
874 sendWorkflowResponse(execution, 202, resourceOperationResp)
875 execution.setVariable("sentSyncResponse", true)
877 } catch (Exception ex) {
878 String msg = "Exception in sendSyncResponse:" + ex.getMessage()
880 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
882 logger.debug(" ***** Exit sendSyncResponse *****")