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.aaiclient.client.aai.AAIObjectPlurals
 
  45 import org.onap.aaiclient.client.aai.AAIResourcesClient
 
  46 import org.onap.aaiclient.client.aai.AAIObjectType
 
  47 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
 
  48 import org.onap.aaiclient.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             hashMap.put("value", jsonObject.get(key))
 
 131             paramList.add(hashMap)
 
 133         Map<String, List<Map<String, Object>>> paramMap = new HashMap()
 
 134         paramMap.put("param", paramList)
 
 136         return  new JSONObject(paramMap).toString()
 
 139     private List<Metadatum> getMetaDatum(String customerId,
 
 140                                          String serviceType, String serId) {
 
 141         logger.debug("Enter getPnfInstance")
 
 142         AAIResourcesClient client = new AAIResourcesClient()
 
 144         // think how AAI queried for PNF name using the name
 
 145         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
 
 146                 customerId, serviceType, serId)
 
 147         logger.debug("uri for pnf get:" + uri.toString())
 
 149         Metadata metadata = client.get(uri).asBean(Metadata.class).get()
 
 150         return metadata.getMetadatum()
 
 154      * This method updates the resource input by collecting required info from AAI
 
 157     public ResourceInput updateResourceInput(DelegateExecution execution) {
 
 158         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 159         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
 
 162         def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
 
 163         String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
 
 166             case ~/[\w\s\W]*OLT[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
 
 167             case ~/[\w\s\W]*AccessConnectivity[\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")
 
 174                 String cvlan = jsonUtil.getJsonValue(serInput,
 
 175                         "service.parameters.requestInputs.cvlan")
 
 176                 String svlan = jsonUtil.getJsonValue(serInput,
 
 177                         "service.parameters.requestInputs.svlan")
 
 178                 String remoteId = jsonUtil.getJsonValue(serInput,
 
 179                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
 
 180                 String manufacturer = jsonUtil.getJsonValue(serInput,
 
 181                         "service.parameters.requestInputs.ont_ont_manufacturer")
 
 182                 String ontsn = jsonUtil.getJsonValue(serInput,
 
 183                         "service.parameters.requestInputs.ont_ont_serial_num")
 
 185                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
 
 186                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
 
 187                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.remote_id", remoteId)
 
 188                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
 
 189                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
 
 190                 logger.debug("old resource input:" + resourceInputObj.toString())
 
 191                 resourceInputObj.setResourceParameters(uResourceInput)
 
 192                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
 
 193                 logger.debug("new resource Input :" + resourceInputObj.toString())
 
 196             case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
 
 197             case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
 
 198                 // get the required properties and update in resource input
 
 199                 def resourceInput = resourceInputObj.getResourceParameters()
 
 200                 String incomingRequest = resourceInputObj.getRequestsInputs()
 
 201                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
 
 202                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
 
 203                 JSONObject inputParameters = new JSONObject(requestInputs)
 
 205                 String cvlan = jsonUtil.getJsonValue(serInput,
 
 206                         "service.parameters.requestInputs.cvlan")
 
 207                 String svlan = jsonUtil.getJsonValue(serInput,
 
 208                         "service.parameters.requestInputs.svlan")
 
 209                 String manufacturer = jsonUtil.getJsonValue(serInput,
 
 210                         "service.parameters.requestInputs.ont_ont_manufacturer")
 
 211                 String remoteId = jsonUtil.getJsonValue(serInput,
 
 212                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
 
 213                 String ontsn = jsonUtil.getJsonValue(serInput,
 
 214                         "service.parameters.requestInputs.ont_ont_serial_num")
 
 215                 String serviceType = jsonUtil.getJsonValue(serInput,
 
 216                         "service.parameters.requestInputs.edgeinternetprofile_ip_service_type")
 
 217                 String macAddr = jsonUtil.getJsonValue(serInput,
 
 218                         "service.parameters.requestInputs.edgeinternetprofile_ip_rg_mac_addr")
 
 219                 String upStream = jsonUtil.getJsonValue(serInput,
 
 220                         "service.parameters.requestInputs.edgeinternetprofile_ip_upstream_speed")
 
 221                 String downStream = jsonUtil.getJsonValue(serInput,
 
 222                         "service.parameters.requestInputs.edgeinternetprofile_ip_downstream_speed")
 
 224                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
 
 225                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
 
 226                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
 
 227                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_remote_id", remoteId)
 
 228                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
 
 229                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_service_type", serviceType)
 
 230                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_rg_mac_addr", macAddr)
 
 231                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_upstream_speed", upStream)
 
 232                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_downstream_speed", downStream)
 
 233                 logger.debug("old resource input:" + resourceInputObj.toString())
 
 234                 resourceInputObj.setResourceParameters(uResourceInput)
 
 235                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
 
 236                 logger.debug("new resource Input :" + resourceInputObj.toString())
 
 240             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
 
 242                 def resourceInput = resourceInputObj.getResourceParameters()
 
 243                 String incomingRequest = resourceInputObj.getRequestsInputs()
 
 244                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
 
 245                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
 
 246                 JSONObject inputParameters = new JSONObject(requestInputs)
 
 247                 if(inputParameters.has("local-access-provider-id")) {
 
 248                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
 
 249                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
 
 250                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
 
 251                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
 
 252                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
 
 253                     resourceInputObj.setResourceParameters(uResourceInput)
 
 254                     execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
 
 259             case ~/[\w\s\W]*UNI[\w\s\W]*/ :
 
 260                 def resourceInput = resourceInputObj.getResourceParameters()
 
 261                 String incomingRequest = resourceInputObj.getRequestsInputs()
 
 262                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
 
 263                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
 
 264                 JSONObject inputParameters = new JSONObject(requestInputs)
 
 265                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.service-name", inputParameters.get("name"))
 
 266                 resourceInputObj.setResourceParameters(uResourceInput)
 
 267                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
 
 268                 execution.setVariable("isAsyncRequired", "Yes")
 
 271             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
 
 272             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
 
 273             case ~/[\w\s\W]*SOTN-Attachment[\w\s\W]*/ :
 
 274                 // fill attachment TP in networkInputParamJson
 
 275                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : (StringUtils.containsIgnoreCase(modelName, "SOTN-Attachment") ? "elinesotnattachmentvf0_elinesotnattachmentvfc0_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName")
 
 276                 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
 
 280                 // Special case for handling alloted resource types
 
 281                 // in case name is different as expected
 
 282                 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
 
 283                     def vpnName = modelName + "_sotnVpnName"
 
 284                     fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
 
 288         return resourceInputObj
 
 291     private void fillAttachmentTPInfo(ResourceInput resourceInputObj, DelegateExecution execution, String vpnName) {
 
 293         String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
 
 295         AAIResourcesClient client = new AAIResourcesClient()
 
 296         logger.info("sending request to resolve vpn-name:" + vpnName)
 
 297         AAIResourceUri uri = AAIUriFactory.createResourceUri(new AAIObjectPlurals("/nodes", "/service-instances", "queryByName")).queryParam("service-instance-name", parentServiceName)
 
 298         Optional<ServiceInstances> serviceInstancesOpt = client.get(ServiceInstances.class, uri)
 
 300         if(serviceInstancesOpt.isPresent()) {
 
 301             List<ServiceInstance> serviceInstanceList = serviceInstancesOpt.get().getServiceInstance()
 
 302             logger.info("response from aai:" + serviceInstanceList.toString())
 
 303             if (serviceInstanceList.size() > 0) {
 
 304                 ServiceInstance si = serviceInstanceList.get(0)
 
 305                 String parentServiceInstanceId = si.getServiceInstanceId()
 
 306                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
 
 307                 logger.info("setting parentService id:" + parentServiceInstanceId)
 
 309                 logger.error("No service instance found for given name.")
 
 312             logger.error("No nodes found with this name" + vpnName)
 
 317      * Pre Process the BPMN Flow Request
 
 319      * generate the nsOperationKey
 
 320      * generate the nsParameters
 
 322     public void prepareSDNCRequest (DelegateExecution execution) {
 
 323         logger.info(" ***** Started prepareSDNCRequest *****")
 
 327             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
 
 328             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
 
 329             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
 
 330             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
 
 332             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
 
 333             String hdrRequestId = execution.getVariable("mso-request-id")
 
 334             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
 
 335             String source = execution.getVariable("source")
 
 336             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
 
 337             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 338             String serviceType = resourceInputObj.getServiceType()
 
 339             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
 
 340             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
 
 341             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
 
 342             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
 
 343             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
 
 344             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid()
 
 345             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
 
 346             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
 
 347             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
 
 348             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
 
 349             String resourceInputPrameters = resourceInputObj.getResourceParameters()
 
 350             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
 
 351             //here convert json string to xml string
 
 352             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
 
 353             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
 
 354             String sdncTopologyCreateRequest = ""
 
 356             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
 
 360                                         if(modelName.contains("UNI") && "MDONS_OTN".equals(serviceType)){
 
 362                                                 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 363                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 364                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 365                                  <sdncadapter:RequestHeader>
 
 366                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 367                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 368                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 369                                     <sdncadapter:SvcOperation>optical-service-create</sdncadapter:SvcOperation>
 
 370                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 371                                     <sdncadapter:MsoAction>opticalservice</sdncadapter:MsoAction>
 
 372                                  </sdncadapter:RequestHeader>
 
 373                                  <sdncadapterworkflow:SDNCRequestData>
 
 374                                     <request-id>${msoUtils.xmlEscape(serviceInstanceId)}</request-id>
 
 375                                     <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 376                                     <service-type>${msoUtils.xmlEscape(serviceType)}</service-type>
 
 377                                     <notification-url>sdncCallback</notification-url>
 
 378                                     <source>${msoUtils.xmlEscape(source)}</source>
 
 379                                     <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 381                                          $netowrkInputParameters
 
 383                                 </sdncadapterworkflow:SDNCRequestData>
 
 384                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 386                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 387                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 388                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 389                                  <sdncadapter:RequestHeader>
 
 390                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 391                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 392                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 393                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
 
 394                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 395                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 396                                  </sdncadapter:RequestHeader>
 
 397                                  <sdncadapterworkflow:SDNCRequestData>
 
 398                                      <request-information>
 
 399                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 400                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 401                                         <source>${msoUtils.xmlEscape(source)}</source>
 
 402                                         <notification-url></notification-url>
 
 403                                         <order-number></order-number>
 
 404                                         <order-version></order-version>
 
 405                                      </request-information>
 
 406                                      <service-information>
 
 407                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 408                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 409                                         <onap-model-information>
 
 410                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 411                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 412                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 413                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 414                                         </onap-model-information>
 
 415                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 416                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 417                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
 
 418                                      </service-information>
 
 420                                         <vnf-type></vnf-type>
 
 421                                         <onap-model-information>
 
 422                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 423                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 424                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 425                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 426                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 427                                         </onap-model-information>
 
 430                                          <vnf-input-parameters>
 
 431                                            $netowrkInputParameters
 
 432                                          </vnf-input-parameters>
 
 433                                          <request-version></request-version>
 
 434                                          <vnf-name></vnf-name>
 
 438                                 </sdncadapterworkflow:SDNCRequestData>
 
 439                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 443                     String vnfid = resourceInputObj.getVnfId()
 
 444                     ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
 
 445                     String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
 
 446                     String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
 
 447                     String vnfmodelUuid = vfModelInfo.getModelUuid()
 
 448                     String vnfmodelVersion = vfModelInfo.getModelVersion()
 
 449                     String vnfmodelName = vfModelInfo.getModelName()
 
 450                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 451                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 452                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 453                                  <sdncadapter:RequestHeader>
 
 454                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 455                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 456                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 457                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
 
 458                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 459                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 460                                  </sdncadapter:RequestHeader>
 
 461                                  <sdncadapterworkflow:SDNCRequestData>
 
 462                                      <request-information>
 
 463                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 464                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 465                                         <source>${msoUtils.xmlEscape(source)}</source>
 
 466                                         <notification-url></notification-url>
 
 467                                         <order-number></order-number>
 
 468                                         <order-version></order-version>
 
 469                                      </request-information>
 
 470                                      <service-information>
 
 471                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 472                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 473                                         <onap-model-information>
 
 474                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 475                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 476                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 477                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 478                                         </onap-model-information>
 
 479                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 480                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 481                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
 
 482                                      </service-information>
 
 484                                         <onap-model-information>
 
 485                                              <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
 
 486                                              <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
 
 487                                              <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
 
 488                                              <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
 
 489                                              <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
 
 490                                         </onap-model-information>
 
 491                                         <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
 
 493                                      <vf-module-information>
 
 494                                         <from-preload>false</from-preload>
 
 495                                         <onap-model-information>
 
 496                                             <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 497                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 498                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 499                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 500                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 501                                         </onap-model-information>
 
 502                                      </vf-module-information>
 
 503                                      <vf-module-request-input>
 
 504                                          <vf-module-input-parameters>
 
 505                                            $netowrkInputParameters
 
 506                                          </vf-module-input-parameters>
 
 507                                       </vf-module-request-input>
 
 508                                 </sdncadapterworkflow:SDNCRequestData>
 
 509                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 512                 // sdwanvpnattachment or sotnvpnattachment
 
 513                 case "ALLOTTED_RESOURCE" :
 
 514                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 515                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 516                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 517                                  <sdncadapter:RequestHeader>
 
 518                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
 
 519                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 520                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 521                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
 
 522                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 523                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 524                                  </sdncadapter:RequestHeader>
 
 525                                  <sdncadapterworkflow:SDNCRequestData>
 
 526                                      <request-information>
 
 527                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 528                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 529                                         <source>${msoUtils.xmlEscape(source)}</source>
 
 530                                         <notification-url></notification-url>
 
 531                                         <order-number></order-number>
 
 532                                         <order-version></order-version>
 
 533                                      </request-information>
 
 534                                      <service-information>
 
 535                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 536                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 537                                         <onap-model-information>
 
 538                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 539                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 540                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 541                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 542                                         </onap-model-information>
 
 543                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 544                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 545                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
 
 546                                      </service-information>
 
 547                                      <allotted-resource-information>
 
 548                                         <allotted-resource-id></allotted-resource-id>
 
 549                                         <allotted-resource-type></allotted-resource-type>
 
 550                                         <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
 
 551                                         <onap-model-information>
 
 552                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 553                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 554                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 555                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 556                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 557                                         </onap-model-information>
 
 558                                      </allotted-resource-information>
 
 559                                      <connection-attachment-request-input>
 
 560                                        $netowrkInputParameters
 
 561                                      </connection-attachment-request-input>
 
 562                                 </sdncadapterworkflow:SDNCRequestData>
 
 563                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 567                 // for SDWANConnectivity and SOTNConnectivity:
 
 569                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 570                                                xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
 
 571                                                xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
 
 572                                   <sdncadapter:RequestHeader>
 
 573                                      <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
 
 574                                      <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
 
 575                                      <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
 
 576                                      <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
 
 577                                      <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
 
 578                                      <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
 
 579                                   </sdncadapter:RequestHeader>
 
 580                                   <sdncadapterworkflow:SDNCRequestData>
 
 581                                       <request-information>
 
 582                                          <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
 
 583                                          <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
 
 584                                          <source>${msoUtils.xmlEscape(source)}</source>
 
 585                                          <notification-url></notification-url>
 
 586                                          <order-number></order-number>
 
 587                                          <order-version></order-version>
 
 588                                       </request-information>
 
 589                                       <service-information>
 
 590                                          <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
 
 591                                          <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
 
 592                                          <onap-model-information>
 
 593                                               <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
 
 594                                               <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
 
 595                                               <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
 
 596                                               <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
 
 597                                          </onap-model-information>
 
 598                                          <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
 
 599                                          <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
 
 600                                       </service-information>
 
 601                                       <network-information>
 
 602                                          <onap-model-information>
 
 603                                               <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
 
 604                                               <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
 
 605                                               <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
 
 606                                               <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
 
 607                                               <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
 
 608                                          </onap-model-information>
 
 609                                       </network-information>
 
 610                                       <network-request-input>
 
 611                                         <network-input-parameters>$netowrkInputParameters</network-input-parameters>
 
 612                                       </network-request-input>
 
 613                                  </sdncadapterworkflow:SDNCRequestData>
 
 614                               </aetgt:SDNCAdapterWorkflowRequest>""".trim()
 
 619             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
 
 620             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
 
 621             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
 
 623         } catch (Exception ex) {
 
 624             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
 
 625             logger.debug(exceptionMessage)
 
 626             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
 
 629         logger.info(" ***** Exit prepareSDNCRequest *****")
 
 632     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
 
 633         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
 
 634         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
 
 635         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
 
 638     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
 
 639         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 640         String operType = resourceInputObj.getOperationType()
 
 641         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
 
 642         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
 
 643         String operationId = resourceInputObj.getOperationId()
 
 644         String progress = "20"
 
 645         String status = "processing"
 
 646         String statusDescription = "SDCN resource creation invoked"
 
 648         execution.getVariable("operationId")
 
 651                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 
 652                         xmlns:ns="http://org.onap.so/requestsdb">
 
 655                     <ns:updateResourceOperationStatus>
 
 656                                <operType>${msoUtils.xmlEscape(operType)}</operType>
 
 657                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
 
 658                                <progress>${msoUtils.xmlEscape(progress)}</progress>
 
 659                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
 
 660                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
 
 661                                <status>${msoUtils.xmlEscape(status)}</status>
 
 662                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
 
 663                     </ns:updateResourceOperationStatus>
 
 665                 </soapenv:Envelope>"""
 
 667         setProgressUpdateVariables(execution, body)
 
 671     public void prepareUpdateAfterCreateSDNCResource(execution) {
 
 672         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 673         String operType = resourceInputObj.getOperationType()
 
 674         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
 
 675         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
 
 676         String operationId = resourceInputObj.getOperationId()
 
 677         String progress = "100"
 
 678         String status = "finished"
 
 679         String statusDescription = "SDCN resource creation and activation completed"
 
 681         execution.getVariable("operationId")
 
 684                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 
 685                         xmlns:ns="http://org.onap.so/requestsdb">
 
 688                     <ns:updateResourceOperationStatus>
 
 689                                <operType>${msoUtils.xmlEscape(operType)}</operType>
 
 690                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
 
 691                                <progress>${msoUtils.xmlEscape(progress)}</progress>
 
 692                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
 
 693                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
 
 694                                <status>${msoUtils.xmlEscape(status)}</status>
 
 695                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
 
 696                     </ns:updateResourceOperationStatus>
 
 698                 </soapenv:Envelope>"""
 
 700         setProgressUpdateVariables(execution, body)
 
 703     public void afterCreateSDNCCall(DelegateExecution execution){
 
 704         logger.info(" ***** Started prepareSDNCRequest *****")
 
 705         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
 
 706         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
 
 708         def instnaceId = getInstanceId(execution)
 
 709         execution.setVariable("resourceInstanceId", instnaceId)
 
 711         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
 
 712         logger.info(" ***** Exit prepareSDNCRequest *****")
 
 715     private def getInstanceId(DelegateExecution execution) {
 
 716         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
 
 718         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
 
 719         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
 
 722         String modelType = resourceInputObj.getResourceModelInfo().getModelType()
 
 725                 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
 
 728                 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
 
 730             case "ALLOTTED_RESOURCE":
 
 731                 // sdwanvpnattachment or sotnvpnattachment
 
 732                 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
 
 735                 // SDWANConnectivity or SOTN Connectivity
 
 736                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
 
 739         return val.toString()
 
 742     public void sendSyncResponse (DelegateExecution execution) {
 
 743         logger.debug(" *** sendSyncResponse *** ")
 
 746             String operationStatus = "finished"
 
 747             // RESTResponse for main flow
 
 748             String vnfid=execution.getVariable("resourceInstanceId")
 
 749             String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
 
 750             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
 
 751             sendWorkflowResponse(execution, 202, resourceOperationResp)
 
 752             execution.setVariable("sentSyncResponse", true)
 
 754         } catch (Exception ex) {
 
 755             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
 
 757             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 759         logger.debug(" ***** Exit sendSyncResponse *****")