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 = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".operation-type")
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>network-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 <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
458 <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
459 <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
460 <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
461 <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
464 <vnf-input-parameters>
465 $netowrkInputParameters
466 </vnf-input-parameters>
467 <request-version></request-version>
468 <vnf-name></vnf-name>
472 <connection-attachment-request-input>
473 $netowrkInputParameters
474 </connection-attachment-request-input>
475 </sdncadapterworkflow:SDNCRequestData>
476 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
479 // for SDWANConnectivity and SOTNConnectivity:
481 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
482 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
483 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
484 <sdncadapter:RequestHeader>
485 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
486 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
487 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
488 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
489 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
490 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
491 </sdncadapter:RequestHeader>
492 <sdncadapterworkflow:SDNCRequestData>
493 <request-information>
494 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
495 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
496 <source>${msoUtils.xmlEscape(source)}</source>
497 <notification-url></notification-url>
498 <order-number></order-number>
499 <order-version></order-version>
500 </request-information>
501 <service-information>
502 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
503 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
504 <onap-model-information>
505 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
506 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
507 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
508 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
509 </onap-model-information>
510 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
511 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
512 </service-information>
513 <network-information>
514 <onap-model-information>
515 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
516 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
517 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
518 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
519 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
520 </onap-model-information>
521 </network-information>
522 <network-request-input>
523 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
524 </network-request-input>
525 </sdncadapterworkflow:SDNCRequestData>
526 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
534 //switch (modelName) {
535 // case ~/[\w\s\W]*deviceVF[\w\s\W]*/
536 // case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
537 // case ~/[\w\s\W]*SiteVF[\w\s\W]*/:
538 /* sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
539 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
540 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
541 <sdncadapter:RequestHeader>
542 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
543 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
544 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
545 <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
546 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
547 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
548 </sdncadapter:RequestHeader>
549 <sdncadapterworkflow:SDNCRequestData>
550 <request-information>
551 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
552 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
553 <source>${msoUtils.xmlEscape(source)}</source>
554 <notification-url></notification-url>
555 <order-number></order-number>
556 <order-version></order-version>
557 </request-information>
558 <service-information>
559 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
560 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
561 <onap-model-information>
562 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
563 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
564 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
565 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
566 </onap-model-information>
567 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
568 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
569 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
570 </service-information>
573 <vnf-type></vnf-type>
574 <onap-model-information>
575 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
576 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
577 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
578 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
579 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
580 </onap-model-information>
583 <vnf-input-parameters>
584 $netowrkInputParameters
585 </vnf-input-parameters>
586 <request-version></request-version>
587 <vnf-name></vnf-name>
591 </sdncadapterworkflow:SDNCRequestData>
592 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
597 //case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/
598 //case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
599 /* sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
600 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
601 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
602 <sdncadapter:RequestHeader>
603 <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
604 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
605 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
606 <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
607 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
608 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
609 </sdncadapter:RequestHeader>
610 <sdncadapterworkflow:SDNCRequestData>
611 <request-information>
612 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
613 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
614 <source>${msoUtils.xmlEscape(source)}</source>
615 <notification-url></notification-url>
616 <order-number></order-number>
617 <order-version></order-version>
618 </request-information>
619 <service-information>
620 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
621 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
622 <onap-model-information>
623 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
624 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
625 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
626 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
627 </onap-model-information>
628 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
629 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
630 <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
631 </service-information><vnf-information>
633 <vnf-type></vnf-type>
634 <onap-model-information>
635 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
636 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
637 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
638 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
639 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
640 </onap-model-information>
643 <vnf-input-parameters>
644 $netowrkInputParameters
645 </vnf-input-parameters>
646 <request-version></request-version>
647 <vnf-name></vnf-name>
651 <allotted-resource-information>
652 <!-- TODO: to be filled as per the request input -->
653 <allotted-resource-id></allotted-resource-id>
654 <allotted-resource-type></allotted-resource-type>
655 <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
656 <onap-model-information>
657 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
658 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
659 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
660 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
661 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
662 </onap-model-information>
663 </allotted-resource-information>
664 <connection-attachment-request-input>
665 $netowrkInputParameters
666 </connection-attachment-request-input>
667 </sdncadapterworkflow:SDNCRequestData>
668 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
671 // for SDWANConnectivity and SOTNConnectivity:
673 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
674 xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
675 xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
676 <sdncadapter:RequestHeader>
677 <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
678 <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
679 <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
680 <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
681 <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
682 <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
683 </sdncadapter:RequestHeader>
684 <sdncadapterworkflow:SDNCRequestData>
685 <request-information>
686 <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
687 <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
688 <source>${msoUtils.xmlEscape(source)}</source>
689 <notification-url></notification-url>
690 <order-number></order-number>
691 <order-version></order-version>
692 </request-information>
693 <service-information>
694 <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
695 <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
696 <onap-model-information>
697 <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
698 <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
699 <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
700 <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
701 </onap-model-information>
702 <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
703 <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
704 </service-information>
705 <network-information>
706 <onap-model-information>
707 <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
708 <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
709 <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
710 <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
711 <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
712 </onap-model-information>
713 </network-information>
714 <network-request-input>
715 <network-input-parameters>$netowrkInputParameters</network-input-parameters>
716 </network-request-input>
717 </sdncadapterworkflow:SDNCRequestData>
718 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
723 String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
724 execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
725 logger.debug("sdncAdapterWorkflowRequest - " + "\n" + sndcTopologyCreateRequesAsString)
727 } catch (Exception ex) {
728 String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
729 logger.debug(exceptionMessage)
730 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
733 logger.info(" ***** Exit prepareSDNCRequest *****")
736 private void setProgressUpdateVariables(DelegateExecution execution, String body) {
737 def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
738 execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
739 execution.setVariable("CVFMI_updateResOperStatusRequest", body)
742 public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
743 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
744 String operType = resourceInputObj.getOperationType()
745 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
746 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
747 String operationId = resourceInputObj.getOperationId()
748 String progress = "20"
749 String status = "processing"
750 String statusDescription = "SDCN resource creation invoked"
752 execution.getVariable("operationId")
755 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
756 xmlns:ns="http://org.onap.so/requestsdb">
759 <ns:updateResourceOperationStatus>
760 <operType>${msoUtils.xmlEscape(operType)}</operType>
761 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
762 <progress>${msoUtils.xmlEscape(progress)}</progress>
763 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
764 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
765 <status>${msoUtils.xmlEscape(status)}</status>
766 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
767 </ns:updateResourceOperationStatus>
769 </soapenv:Envelope>""";
771 setProgressUpdateVariables(execution, body)
775 public void prepareUpdateAfterCreateSDNCResource(execution) {
776 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
777 String operType = resourceInputObj.getOperationType()
778 String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
779 String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
780 String operationId = resourceInputObj.getOperationId()
781 String progress = "100"
782 String status = "finished"
783 String statusDescription = "SDCN resource creation and activation completed"
785 execution.getVariable("operationId")
788 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
789 xmlns:ns="http://org.onap.so/requestsdb">
792 <ns:updateResourceOperationStatus>
793 <operType>${msoUtils.xmlEscape(operType)}</operType>
794 <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
795 <progress>${msoUtils.xmlEscape(progress)}</progress>
796 <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
797 <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
798 <status>${msoUtils.xmlEscape(status)}</status>
799 <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
800 </ns:updateResourceOperationStatus>
802 </soapenv:Envelope>""";
804 setProgressUpdateVariables(execution, body)
807 public void afterCreateSDNCCall(DelegateExecution execution){
808 logger.info(" ***** Started prepareSDNCRequest *****")
809 String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
810 String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
812 def instnaceId = getInstnaceId(execution)
813 execution.setVariable("resourceInstanceId", instnaceId)
815 logger.info("response from sdnc, response code :" + responseCode + " response object :" + responseObj)
816 logger.info(" ***** Exit prepareSDNCRequest *****")
819 private def getInstnaceId(DelegateExecution execution) {
820 def response = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
822 ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
823 String modelName = resourceInputObj.getResourceModelInfo().getModelName()
827 //switch (modelName) {
828 // case ~/[\w\s\W]*deviceVF[\w\s\W]*/ :
829 // case ~/[\w\s\W]*SiteWANVF[\w\s\W]*/ :
830 // case ~/[\w\s\W]*Site[\w\s\W]*/:
831 // val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
834 // case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
835 // case ~/[\w\s\W]*sotnvpprepareUpdateAfterCreateSDNCResourcenattachment[\w\s\W]*/:
836 // val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
839 // for SDWANConnectivity and SOTNConnectivity and default:
841 // val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
846 String modelType = resourceInputObj.getResourceModelInfo().getModelType()
849 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
852 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
855 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
858 return val.toString()
861 public void sendSyncResponse (DelegateExecution execution) {
862 logger.debug(" *** sendSyncResponse *** ")
865 String operationStatus = "finished"
866 // RESTResponse for main flow
867 String vnfid=execution.getVariable("resourceInstanceId");
868 String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
869 logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
870 sendWorkflowResponse(execution, 202, resourceOperationResp)
871 execution.setVariable("sentSyncResponse", true)
873 } catch (Exception ex) {
874 String msg = "Exception in sendSyncResponse:" + ex.getMessage()
876 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
878 logger.debug(" ***** Exit sendSyncResponse *****")