2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.
 
   6  * ================================================================================
 
   7  * Modifications Copyright (c) 2019 Samsung
 
   8  * ================================================================================
 
   9  * Licensed under the Apache License, Version 2.0 (the "License")
 
  10  * you may not use this file except in compliance with the License.
 
  11  * You may obtain a copy of the License at
 
  13  *      http://www.apache.org/licenses/LICENSE-2.0
 
  15  * Unless required by applicable law or agreed to in writing, software
 
  16  * distributed under the License is distributed on an "AS IS" BASIS,
 
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  18  * See the License for the specific language governing permissions and
 
  19  * limitations under the License.
 
  20  * ============LICENSE_END=========================================================
 
  23 package org.onap.so.bpmn.infrastructure.scripts
 
  26 import org.apache.commons.lang3.*
 
  27 import org.camunda.bpm.engine.delegate.BpmnError
 
  28 import org.camunda.bpm.engine.delegate.DelegateExecution
 
  29 import org.json.JSONObject
 
  31 import org.onap.aai.domain.yang.ServiceInstance
 
  32 import org.onap.aai.domain.yang.ServiceInstances
 
  33 import org.onap.aai.domain.yang.v13.Metadata
 
  34 import org.onap.aai.domain.yang.v13.Metadatum
 
  35 import org.onap.so.bpmn.common.recipe.ResourceInput
 
  36 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
 
  37 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 
  38 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 
  39 import org.onap.so.bpmn.common.scripts.MsoUtils
 
  40 import org.onap.so.bpmn.core.domain.ModelInfo
 
  41 import org.onap.so.bpmn.core.domain.ResourceType
 
  42 import org.onap.so.bpmn.core.json.JsonUtils
 
  43 import org.onap.so.bpmn.core.UrnPropertiesReader
 
  44 import org.onap.so.client.aai.AAIObjectPlurals
 
  45 import org.onap.so.client.aai.AAIResourcesClient
 
  46 import org.onap.so.client.aai.AAIObjectType
 
  47 import org.onap.so.client.aai.entities.uri.AAIResourceUri
 
  48 import org.onap.so.client.aai.entities.uri.AAIUriFactory
 
  49 import org.slf4j.Logger
 
  50 import org.slf4j.LoggerFactory
 
  53  * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
 
  54  * flow for SDNC Network Resource Create
 
  56 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
 
  58     private static final Logger logger = LoggerFactory.getLogger( CreateSDNCNetworkResource.class)
 
  59     String Prefix="CRESDNCRES_"
 
  61     ExceptionUtil exceptionUtil = new ExceptionUtil()
 
  63     JsonUtils jsonUtil = new JsonUtils()
 
  65     MsoUtils msoUtils = new MsoUtils()
 
  67     public void preProcessRequest(DelegateExecution execution){
 
  69         logger.info(" ***** Started preProcessRequest *****")
 
  72             //get bpmn inputs from resource request.
 
  73             String requestId = execution.getVariable("mso-request-id")
 
  74             String requestAction = execution.getVariable("requestAction")
 
  75             logger.info("The requestAction is: " + requestAction)
 
  76             String recipeParamsFromRequest = execution.getVariable("recipeParams")
 
  77             logger.info("The recipeParams is: " + recipeParamsFromRequest)
 
  78             String resourceInput = execution.getVariable("resourceInput")
 
  79             logger.info("The resourceInput is: " + resourceInput)
 
  80             //Get ResourceInput Object
 
  81             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
 
  82             execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
 
  84             //Deal with recipeParams
 
  85             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
 
  87             //For sdnc requestAction default is "createNetworkInstance"
 
  88             String operationType = "Network"
 
  89             if(!StringUtils.isBlank(recipeParamsFromRequest)){
 
  90                 //the operationType from worflow(first node) is second priority.
 
  91                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
 
  93             if(!StringUtils.isBlank(recipeParamsFromWf)){
 
  94                 //the operationType from worflow(first node) is highest priority.
 
  95                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
 
  97             String operationTypeFromConfig = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".operation-type")
 
  98             if (StringUtils.isNotEmpty(operationTypeFromConfig)) {
 
  99                 // highest priority if operation type configured
 
 100                 operationType = operationTypeFromConfig
 
 103             String sdnc_svcAction = "create"
 
 104             String sdnc_requestAction = sdnc_svcAction.capitalize() + operationType + "Instance"
 
 105             String isActivateRequired = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".activation-required")
 
 106             execution.setVariable("isActivateRequired", isActivateRequired)
 
 108             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
 
 109             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
 
 110             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
 
 111             execution.setVariable("mso-request-id", requestId)
 
 112             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
 
 113         } catch (BpmnError e) {
 
 115         } catch (Exception ex){
 
 116             msg = "Exception in preProcessRequest " + ex.getMessage()
 
 118             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 122     String customizeResourceParam(String networkInputParametersJson) {
 
 123         List<Map<String, Object>> paramList = new ArrayList()
 
 124         JSONObject jsonObject = new JSONObject(networkInputParametersJson)
 
 125         Iterator iterator = jsonObject.keys()
 
 126         while (iterator.hasNext()) {
 
 127             String key = iterator.next()
 
 128             HashMap<String, String> hashMap = new HashMap()
 
 129             hashMap.put("name", key)
 
 130             if(jsonObject.get(key)==null){
 
 131                  hashMap.put("value", "")
 
 133                  hashMap.put("value", jsonObject.get(key))
 
 135             paramList.add(hashMap)
 
 137         Map<String, List<Map<String, Object>>> paramMap = new HashMap()
 
 138         paramMap.put("param", paramList)
 
 140         return  new JSONObject(paramMap).toString()
 
 143     private List<Metadatum> getMetaDatum(String customerId,
 
 144                                          String serviceType, String serId) {
 
 145         logger.debug("Enter getPnfInstance")
 
 146         AAIResourcesClient client = new AAIResourcesClient()
 
 148         // think how AAI queried for PNF name using the name
 
 149         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
 
 150                 customerId, serviceType, serId)
 
 151         logger.debug("uri for pnf get:" + uri.toString())
 
 153         Metadata metadata = client.get(uri).asBean(Metadata.class).get()
 
 154         return metadata.getMetadatum()
 
 158      * This method updates the resource input by collecting required info from AAI
 
 161     public ResourceInput updateResourceInput(DelegateExecution execution) {
 
 162         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 163         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
 
 166         def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
 
 167         String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
 
 170             case ~/[\w\s\W]*OLT[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
 
 171             case ~/[\w\s\W]*AccessConnectivity[\w\s\W]*/ :
 
 172                 // get the required properties and update in resource input
 
 174                 def resourceInput = resourceInputObj.getResourceParameters()
 
 175                 String incomingRequest = resourceInputObj.getRequestsInputs()
 
 176                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
 
 177                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
 
 178                 String cvlan = jsonUtil.getJsonValue(serInput,
 
 179                         "service.parameters.requestInputs.cvlan")
 
 180                 String svlan = jsonUtil.getJsonValue(serInput,
 
 181                         "service.parameters.requestInputs.svlan")
 
 182                 String remoteId = jsonUtil.getJsonValue(serInput,
 
 183                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
 
 184                 String manufacturer = jsonUtil.getJsonValue(serInput,
 
 185                         "service.parameters.requestInputs.ont_ont_manufacturer")
 
 186                 String ontsn = jsonUtil.getJsonValue(serInput,
 
 187                         "service.parameters.requestInputs.ont_ont_serial_num")
 
 189                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
 
 190                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
 
 191                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.remote_id", remoteId)
 
 192                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
 
 193                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
 
 194                 logger.debug("old resource input:" + resourceInputObj.toString())
 
 195                 resourceInputObj.setResourceParameters(uResourceInput)
 
 196                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
 
 197                 logger.debug("new resource Input :" + resourceInputObj.toString())
 
 200             case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
 
 201             case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
 
 202                 // get the required properties and update in resource input
 
 203                 def resourceInput = resourceInputObj.getResourceParameters()
 
 204                 String incomingRequest = resourceInputObj.getRequestsInputs()
 
 205                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
 
 206                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
 
 207                 JSONObject inputParameters = new JSONObject(requestInputs)
 
 209                 String cvlan = jsonUtil.getJsonValue(serInput,
 
 210                         "service.parameters.requestInputs.cvlan")
 
 211                 String svlan = jsonUtil.getJsonValue(serInput,
 
 212                         "service.parameters.requestInputs.svlan")
 
 213                 String manufacturer = jsonUtil.getJsonValue(serInput,
 
 214                         "service.parameters.requestInputs.ont_ont_manufacturer")
 
 215                 String remoteId = jsonUtil.getJsonValue(serInput,
 
 216                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
 
 217                 String ontsn = jsonUtil.getJsonValue(serInput,
 
 218                         "service.parameters.requestInputs.ont_ont_serial_num")
 
 219                 String serviceType = jsonUtil.getJsonValue(serInput,
 
 220                         "service.parameters.requestInputs.edgeinternetprofile_ip_service_type")
 
 221                 String macAddr = jsonUtil.getJsonValue(serInput,
 
 222                         "service.parameters.requestInputs.edgeinternetprofile_ip_rg_mac_addr")
 
 223                 String upStream = jsonUtil.getJsonValue(serInput,
 
 224                         "service.parameters.requestInputs.edgeinternetprofile_ip_upstream_speed")
 
 225                 String downStream = jsonUtil.getJsonValue(serInput,
 
 226                         "service.parameters.requestInputs.edgeinternetprofile_ip_downstream_speed")
 
 228                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
 
 229                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
 
 230                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
 
 231                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_remote_id", remoteId)
 
 232                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
 
 233                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_service_type", serviceType)
 
 234                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_rg_mac_addr", macAddr)
 
 235                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_upstream_speed", upStream)
 
 236                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_downstream_speed", downStream)
 
 237                 logger.debug("old resource input:" + resourceInputObj.toString())
 
 238                 resourceInputObj.setResourceParameters(uResourceInput)
 
 239                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
 
 240                 logger.debug("new resource Input :" + resourceInputObj.toString())
 
 244             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
 
 246                 def resourceInput = resourceInputObj.getResourceParameters()
 
 247                 String incomingRequest = resourceInputObj.getRequestsInputs()
 
 248                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
 
 249                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
 
 250                 JSONObject inputParameters = new JSONObject(requestInputs)
 
 251                 if(inputParameters.has("local-access-provider-id")) {
 
 252                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
 
 253                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
 
 254                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
 
 255                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
 
 256                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
 
 257                     resourceInputObj.setResourceParameters(uResourceInput)
 
 258                     execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
 
 263             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
 
 264             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
 
 265             case ~/[\w\s\W]*SOTN-Attachment[\w\s\W]*/ :
 
 266                 // fill attachment TP in networkInputParamJson
 
 267                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : (StringUtils.containsIgnoreCase(modelName, "SOTN-Attachment") ? "elinesotnattachmentvf0_elinesotnattachmentvfc0_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName")
 
 268                 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
 
 272                 // Special case for handling alloted resource types
 
 273                 // in case name is different as expected
 
 274                 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
 
 275                     def vpnName = modelName + "_sotnVpnName"
 
 276                     fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
 
 280         return resourceInputObj
 
 283     private void fillAttachmentTPInfo(ResourceInput resourceInputObj, DelegateExecution execution, String vpnName) {
 
 285         String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
 
 287         AAIResourcesClient client = new AAIResourcesClient()
 
 288         logger.info("sending request to resolve vpn-name:" + vpnName)
 
 289         AAIResourceUri uri = AAIUriFactory.createResourceUri(new AAIObjectPlurals("/nodes", "/service-instances", "queryByName")).queryParam("service-instance-name", parentServiceName)
 
 290         Optional<ServiceInstances> serviceInstancesOpt = client.get(ServiceInstances.class, uri)
 
 292         if(serviceInstancesOpt.isPresent()) {
 
 293             List<ServiceInstance> serviceInstanceList = serviceInstancesOpt.get().getServiceInstance()
 
 294             logger.info("response from aai:" + serviceInstanceList.toString())
 
 295             if (serviceInstanceList.size() > 0) {
 
 296                 ServiceInstance si = serviceInstanceList.get(0)
 
 297                 String parentServiceInstanceId = si.getServiceInstanceId()
 
 298                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
 
 299                 logger.info("setting parentService id:" + parentServiceInstanceId)
 
 301                 logger.error("No service instance found for given name.")
 
 304             logger.error("No nodes found with this name" + vpnName)
 
 309      * Pre Process the BPMN Flow Request
 
 311      * generate the nsOperationKey
 
 312      * generate the nsParameters
 
 314     public void prepareSDNCRequest (DelegateExecution execution) {
 
 315         logger.info(" ***** Started prepareSDNCRequest *****")
 
 319             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
 
 320             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
 
 321             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
 
 322             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
 
 324             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
 
 325             String hdrRequestId = execution.getVariable("mso-request-id")
 
 326             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
 
 327             String source = execution.getVariable("source")
 
 328             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
 
 329             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 330             String serviceType = resourceInputObj.getServiceType()
 
 331             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
 
 332             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
 
 333             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
 
 334             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
 
 335             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
 
 336             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid()
 
 337             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
 
 338             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
 
 339             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
 
 340             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
 
 341             String resourceInputPrameters = resourceInputObj.getResourceParameters()
 
 342             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
 
 343             //here convert json string to xml string
 
 344             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
 
 345             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
 
 346             String sdncTopologyCreateRequest = ""
 
 348             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
 
 352                                         if(modelName.contains("UNI") && "MDONS_OTN".equals(serviceType)){
 
 354                                                 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 355                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 356                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 357                                  <sdncadapter:RequestHeader>
 
 358                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 359                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 360                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 361                                     <sdncadapter:SvcOperation>optical-service-create</sdncadapter:SvcOperation>
 
 362                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 363                                     <sdncadapter:MsoAction>opticalservice</sdncadapter:MsoAction>
 
 364                                  </sdncadapter:RequestHeader>
 
 365                                  <sdncadapterworkflow:SDNCRequestData>
 
 366                                     <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 367                                     <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 368                                     <service-type>${msoUtils.xmlEscape(serviceType)}</service-type>
 
 369                                     <notification-url>sdncCallback</notification-url>
 
 370                                     <source>${msoUtils.xmlEscape(source)}</source>
 
 371                                     <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 373                                          $netowrkInputParameters
 
 375                                 </sdncadapterworkflow:SDNCRequestData>
 
 376                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 378                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 379                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 380                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 381                                  <sdncadapter:RequestHeader>
 
 382                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 383                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 384                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 385                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
 
 386                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 387                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 388                                  </sdncadapter:RequestHeader>
 
 389                                  <sdncadapterworkflow:SDNCRequestData>
 
 390                                      <request-information>
 
 391                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 392                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 393                                         <source>${msoUtils.xmlEscape(source)}</source>
 
 394                                         <notification-url></notification-url>
 
 395                                         <order-number></order-number>
 
 396                                         <order-version></order-version>
 
 397                                      </request-information>
 
 398                                      <service-information>
 
 399                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 400                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 401                                         <onap-model-information>
 
 402                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 403                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 404                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 405                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 406                                         </onap-model-information>
 
 407                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 408                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 409                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
 
 410                                      </service-information>
 
 412                                         <vnf-type></vnf-type>
 
 413                                         <onap-model-information>
 
 414                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 415                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 416                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 417                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 418                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 419                                         </onap-model-information>
 
 422                                          <vnf-input-parameters>
 
 423                                            $netowrkInputParameters
 
 424                                          </vnf-input-parameters>
 
 425                                          <request-version></request-version>
 
 426                                          <vnf-name></vnf-name>
 
 430                                 </sdncadapterworkflow:SDNCRequestData>
 
 431                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 435                     String vnfid = resourceInputObj.getVnfId()
 
 436                     ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
 
 437                     String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
 
 438                     String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
 
 439                     String vnfmodelUuid = vfModelInfo.getModelUuid()
 
 440                     String vnfmodelVersion = vfModelInfo.getModelVersion()
 
 441                     String vnfmodelName = vfModelInfo.getModelName()
 
 442                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 443                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 444                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 445                                  <sdncadapter:RequestHeader>
 
 446                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 447                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 448                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 449                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
 
 450                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 451                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 452                                  </sdncadapter:RequestHeader>
 
 453                                  <sdncadapterworkflow:SDNCRequestData>
 
 454                                      <request-information>
 
 455                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 456                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 457                                         <source>${msoUtils.xmlEscape(source)}</source>
 
 458                                         <notification-url></notification-url>
 
 459                                         <order-number></order-number>
 
 460                                         <order-version></order-version>
 
 461                                      </request-information>
 
 462                                      <service-information>
 
 463                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 464                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 465                                         <onap-model-information>
 
 466                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 467                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 468                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 469                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 470                                         </onap-model-information>
 
 471                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 472                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 473                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
 
 474                                      </service-information>
 
 476                                         <onap-model-information>
 
 477                                              <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
 
 478                                              <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
 
 479                                              <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
 
 480                                              <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
 
 481                                              <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
 
 482                                         </onap-model-information>
 
 483                                         <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
 
 485                                      <vf-module-information>
 
 486                                         <from-preload>false</from-preload>
 
 487                                         <onap-model-information>
 
 488                                             <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 489                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 490                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 491                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 492                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 493                                         </onap-model-information>
 
 494                                      </vf-module-information>
 
 495                                      <vf-module-request-input>
 
 496                                          <vf-module-input-parameters>
 
 497                                            $netowrkInputParameters
 
 498                                          </vf-module-input-parameters>
 
 499                                       </vf-module-request-input>
 
 500                                 </sdncadapterworkflow:SDNCRequestData>
 
 501                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 504                 // sdwanvpnattachment or sotnvpnattachment
 
 505                 case "ALLOTTED_RESOURCE" :
 
 506                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 507                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 508                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 509                                  <sdncadapter:RequestHeader>
 
 510                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 511                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 512                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 513                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
 
 514                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 515                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 516                                  </sdncadapter:RequestHeader>
 
 517                                  <sdncadapterworkflow:SDNCRequestData>
 
 518                                      <request-information>
 
 519                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 520                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 521                                         <source>${msoUtils.xmlEscape(source)}</source>
 
 522                                         <notification-url></notification-url>
 
 523                                         <order-number></order-number>
 
 524                                         <order-version></order-version>
 
 525                                      </request-information>
 
 526                                      <service-information>
 
 527                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 528                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 529                                         <onap-model-information>
 
 530                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 531                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 532                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 533                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 534                                         </onap-model-information>
 
 535                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 536                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 537                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
 
 538                                      </service-information>
 
 539                                      <allotted-resource-information>
 
 540                                         <allotted-resource-id></allotted-resource-id>
 
 541                                         <allotted-resource-type></allotted-resource-type>
 
 542                                         <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
 
 543                                         <onap-model-information>
 
 544                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 545                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 546                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 547                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 548                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 549                                         </onap-model-information>
 
 550                                      </allotted-resource-information>
 
 551                                      <connection-attachment-request-input>
 
 552                                        $netowrkInputParameters
 
 553                                      </connection-attachment-request-input>
 
 554                                 </sdncadapterworkflow:SDNCRequestData>
 
 555                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 559                 // for SDWANConnectivity and SOTNConnectivity:
 
 561                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 562                                                xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 563                                                xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 564                                   <sdncadapter:RequestHeader>
 
 565                                      <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
 
 566                                      <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 567                                      <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 568                                      <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
 
 569                                      <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 570                                      <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 571                                   </sdncadapter:RequestHeader>
 
 572                                   <sdncadapterworkflow:SDNCRequestData>
 
 573                                       <request-information>
 
 574                                          <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 575                                          <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 576                                          <source>${msoUtils.xmlEscape(source)}</source>
 
 577                                          <notification-url></notification-url>
 
 578                                          <order-number></order-number>
 
 579                                          <order-version></order-version>
 
 580                                       </request-information>
 
 581                                       <service-information>
 
 582                                          <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 583                                          <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 584                                          <onap-model-information>
 
 585                                               <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 586                                               <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 587                                               <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 588                                               <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 589                                          </onap-model-information>
 
 590                                          <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 591                                          <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 592                                       </service-information>
 
 593                                       <network-information>
 
 594                                          <onap-model-information>
 
 595                                               <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 596                                               <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 597                                               <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 598                                               <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 599                                               <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 600                                          </onap-model-information>
 
 601                                       </network-information>
 
 602                                       <network-request-input>
 
 603                                         <network-input-parameters>$netowrkInputParameters</network-input-parameters>
 
 604                                       </network-request-input>
 
 605                                  </sdncadapterworkflow:SDNCRequestData>
 
 606                               </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 611             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
 
 612             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
 
 613             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
 
 615         } catch (Exception ex) {
 
 616             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
 
 617             logger.debug(exceptionMessage)
 
 618             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
 
 621         logger.info(" ***** Exit prepareSDNCRequest *****")
 
 624     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
 
 625         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
 
 626         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
 
 627         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
 
 630     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
 
 631         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 632         String operType = resourceInputObj.getOperationType()
 
 633         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
 
 634         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
 
 635         String operationId = resourceInputObj.getOperationId()
 
 636         String progress = "20"
 
 637         String status = "processing"
 
 638         String statusDescription = "SDCN resource creation invoked"
 
 640         execution.getVariable("operationId")
 
 643                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 
 644                         xmlns:ns="http://org.onap.so/requestsdb">
 
 647                     <ns:updateResourceOperationStatus>
 
 648                                <operType>${msoUtils.xmlEscape(operType)}</operType>
 
 649                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
 
 650                                <progress>${msoUtils.xmlEscape(progress)}</progress>
 
 651                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
 
 652                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
 
 653                                <status>${msoUtils.xmlEscape(status)}</status>
 
 654                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
 
 655                     </ns:updateResourceOperationStatus>
 
 657                 </soapenv:Envelope>"""
 
 659         setProgressUpdateVariables(execution, body)
 
 663     public void prepareUpdateAfterCreateSDNCResource(execution) {
 
 664         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 665         String operType = resourceInputObj.getOperationType()
 
 666         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
 
 667         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
 
 668         String operationId = resourceInputObj.getOperationId()
 
 669         String progress = "100"
 
 670         String status = "finished"
 
 671         String statusDescription = "SDCN resource creation and activation completed"
 
 673         execution.getVariable("operationId")
 
 676                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 
 677                         xmlns:ns="http://org.onap.so/requestsdb">
 
 680                     <ns:updateResourceOperationStatus>
 
 681                                <operType>${msoUtils.xmlEscape(operType)}</operType>
 
 682                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
 
 683                                <progress>${msoUtils.xmlEscape(progress)}</progress>
 
 684                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
 
 685                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
 
 686                                <status>${msoUtils.xmlEscape(status)}</status>
 
 687                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
 
 688                     </ns:updateResourceOperationStatus>
 
 690                 </soapenv:Envelope>"""
 
 692         setProgressUpdateVariables(execution, body)
 
 695     public void afterCreateSDNCCall(DelegateExecution execution){
 
 696         logger.info(" ***** Started prepareSDNCRequest *****")
 
 697         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
 
 698         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
 
 700         def instnaceId = getInstanceId(execution)
 
 701         execution.setVariable("resourceInstanceId", instnaceId)
 
 703         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
 
 704         logger.info(" ***** Exit prepareSDNCRequest *****")
 
 707     private def getInstanceId(DelegateExecution execution) {
 
 708         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
 
 710         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 711         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
 
 714         String modelType = resourceInputObj.getResourceModelInfo().getModelType()
 
 717                 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
 
 720                 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
 
 722             case "ALLOTTED_RESOURCE":
 
 723                 // sdwanvpnattachment or sotnvpnattachment
 
 724                 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
 
 727                 // SDWANConnectivity or SOTN Connectivity
 
 728                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
 
 731         return val.toString()
 
 734     public void sendSyncResponse (DelegateExecution execution) {
 
 735         logger.debug(" *** sendSyncResponse *** ")
 
 738             String operationStatus = "finished"
 
 739             // RESTResponse for main flow
 
 740             String vnfid=execution.getVariable("resourceInstanceId")
 
 741             String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
 
 742             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
 
 743             sendWorkflowResponse(execution, 202, resourceOperationResp)
 
 744             execution.setVariable("sentSyncResponse", true)
 
 746         } catch (Exception ex) {
 
 747             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
 
 749             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 751         logger.debug(" ***** Exit sendSyncResponse *****")