2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  # Copyright (c) 2020, CMCC Technologies Co., Ltd.
 
   7  # Licensed under the Apache License, Version 2.0 (the "License")
 
   8  # you may not use this file except in compliance with the License.
 
   9  # You may obtain a copy of the License at
 
  11  #       http://www.apache.org/licenses/LICENSE-2.0
 
  13  # Unless required by applicable law or agreed to in writing, software
 
  14  # distributed under the License is distributed on an "AS IS" BASIS,
 
  15  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  # See the License for the specific language governing permissions and
 
  17  # limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.so.bpmn.infrastructure.scripts
 
  23 import com.fasterxml.jackson.databind.ObjectMapper
 
  24 import org.onap.aai.domain.yang.ServiceInstance
 
  25 import org.onap.aaiclient.client.aai.AAIObjectType
 
  26 import org.onap.aaiclient.client.aai.AAIResourcesClient
 
  27 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
 
  28 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
 
  29 import org.onap.so.beans.nsmf.EsrInfo
 
  30 import org.onap.so.beans.nsmf.NssmfAdapterNBIRequest
 
  31 import org.onap.so.beans.nsmf.SliceTaskParamsAdapter
 
  32 import org.onap.so.beans.nsmf.oof.TemplateInfo
 
  33 import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
 
  34 import org.onap.so.bpmn.core.domain.ServiceDecomposition
 
  36 import static org.apache.commons.lang3.StringUtils.*
 
  37 import org.springframework.web.util.UriUtils
 
  38 import groovy.json.JsonSlurper
 
  39 import org.camunda.bpm.engine.delegate.BpmnError
 
  40 import org.camunda.bpm.engine.delegate.DelegateExecution
 
  41 import org.onap.so.beans.nsmf.SliceTaskParams
 
  42 import org.onap.so.db.request.beans.OrchestrationTask
 
  43 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 
  44 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 
  45 import org.onap.so.bpmn.common.scripts.OofUtils
 
  46 import org.onap.so.bpmn.core.UrnPropertiesReader
 
  47 import org.onap.so.bpmn.common.scripts.MsoUtils
 
  48 import org.onap.so.bpmn.core.json.JsonUtils
 
  49 import org.onap.logging.filter.base.ErrorCode
 
  50 import org.onap.so.logger.LoggingAnchor
 
  51 import org.onap.so.logger.MessageEnum
 
  52 import org.slf4j.Logger
 
  53 import org.slf4j.LoggerFactory
 
  55 public class CreateSliceService extends AbstractServiceTaskProcessor {
 
  56     String Prefix = "CRESS_"
 
  58     ExceptionUtil exceptionUtil = new ExceptionUtil()
 
  59     JsonUtils jsonUtil = new JsonUtils()
 
  60     JsonSlurper jsonSlurper = new JsonSlurper()
 
  61     ObjectMapper objectMapper = new ObjectMapper()
 
  62     OofUtils oofUtils = new OofUtils()
 
  63     NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
 
  64     AAIResourcesClient client = getAAIClient()
 
  66     private static final Logger logger = LoggerFactory.getLogger(CreateSliceService.class)
 
  68     public void preProcessRequest(DelegateExecution execution) {
 
  69         logger.debug("Start preProcessRequest")
 
  70         execution.setVariable("prefix", Prefix)
 
  74             String ssRequest = execution.getVariable("bpmnRequest")
 
  75             logger.debug(ssRequest)
 
  77             String requestId = execution.getVariable("mso-request-id")
 
  78             execution.setVariable("msoRequestId", requestId)
 
  79             logger.debug("Input Request:" + ssRequest + " reqId:" + requestId)
 
  81             String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
  82             if (isBlank(serviceInstanceId)) {
 
  83                 serviceInstanceId = UUID.randomUUID().toString()
 
  86             String operationId = UUID.randomUUID().toString()
 
  87             execution.setVariable("operationId", operationId)
 
  89             logger.debug("Generated new Service Instance:" + serviceInstanceId)
 
  90             serviceInstanceId = UriUtils.encode(serviceInstanceId, "UTF-8")
 
  91             execution.setVariable("serviceInstanceId", serviceInstanceId)
 
  94             String globalSubscriberId = jsonUtil.getJsonValue(ssRequest, "requestDetails.subscriberInfo.globalSubscriberId")
 
  95             if (isBlank(globalSubscriberId)) {
 
  96                 msg = "Input globalSubscriberId' is null"
 
  97                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
  99                 execution.setVariable("globalSubscriberId", globalSubscriberId)
 
 103             execution.setVariable("source", jsonUtil.getJsonValue(ssRequest, "requestDetails.requestInfo.source"))
 
 104             execution.setVariable("serviceInstanceName", jsonUtil.getJsonValue(ssRequest, "requestDetails.requestInfo.instanceName"))
 
 105             execution.setVariable("disableRollback", jsonUtil.getJsonValue(ssRequest, "requestDetails.requestInfo.suppressRollback"))
 
 106             String productFamilyId = jsonUtil.getJsonValue(ssRequest, "requestDetails.requestInfo.productFamilyId")
 
 107             if (isBlank(productFamilyId)) {
 
 108                 msg = "Input productFamilyId is null"
 
 110                 //exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
 112                 execution.setVariable("productFamilyId", productFamilyId)
 
 116             String serviceModelInfo = jsonUtil.getJsonValue(ssRequest, "requestDetails.modelInfo")
 
 117             if (isBlank(serviceModelInfo)) {
 
 118                 msg = "Input serviceModelInfo is null"
 
 120                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
 122                 execution.setVariable("serviceModelInfo", serviceModelInfo)
 
 125             logger.debug("modelInfo: " + serviceModelInfo)
 
 128             String subscriptionServiceType = jsonUtil.getJsonValue(ssRequest, "requestDetails.requestParameters.subscriptionServiceType")
 
 129             if (isBlank(subscriptionServiceType)) {
 
 130                 msg = "Input subscriptionServiceType is null"
 
 132                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
 134                 execution.setVariable("subscriptionServiceType", subscriptionServiceType)
 
 136             logger.debug("subscriptionServiceType: " + subscriptionServiceType)
 
 139             * Extracting User Parameters from incoming Request and converting into a Map
 
 141             Map reqMap = jsonSlurper.parseText(ssRequest)
 
 144             def userParamsList = reqMap.requestDetails?.requestParameters?.userParams
 
 146             Map<String, String> inputMap = [:]
 
 147             if (userParamsList) {
 
 148                 for (def i = 0; i < userParamsList.size(); i++) {
 
 149                     def userParams1 = userParamsList.get(i)
 
 150                     userParams1.each { param -> inputMap.put(param.key, param.value) }
 
 154             logger.debug("User Input Parameters map: " + inputMap.toString())
 
 155             String uuiRequest = inputMap.get("UUIRequest")
 
 156             Map uuiReqMap = jsonSlurper.parseText(uuiRequest) as Map
 
 157             Map<String, Object> serviceObject = (Map<String, Object>) uuiReqMap.get("service")
 
 158             Map<String, Object> parameterObject = (Map<String, Object>) serviceObject.get("parameters")
 
 159             Map<String, Object> requestInputs = (Map<String, Object>) parameterObject.get("requestInputs")
 
 161             def serviceProfile = [:]
 
 162             for(entry in requestInputs) {
 
 163                 serviceProfile[entry.key] = entry.value
 
 166             execution.setVariable("serviceInputParams", inputMap)
 
 167             execution.setVariable("uuiRequest", uuiRequest)
 
 168             execution.setVariable("se" +
 
 169                     "rviceProfile", serviceProfile)
 
 172             //execution.setVariable("serviceInputParams", jsonUtil.getJsonValue(siRequest, "requestDetails.requestParameters.userParams"))
 
 173             //execution.setVariable("failExists", true)
 
 175         } catch (BpmnError e) {
 
 177         } catch (Exception ex) {
 
 178             msg = "Exception in preProcessRequest " + ex.getMessage()
 
 180             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 182         logger.debug("Finish preProcessRequest")
 
 189     public void prepareInitServiceOperationStatus(DelegateExecution execution) {
 
 190         logger.debug("Start prepareInitServiceOperationStatus")
 
 192             String serviceId = execution.getVariable("serviceInstanceId")
 
 193             String operationId = execution.getVariable("operationId")
 
 194             String operationType = "CREATE"
 
 195             String userId = execution.getVariable("globalSubscriberId")
 
 196             String result = "processing"
 
 197             String progress = "0"
 
 199             String operationContent = "Prepare service creation"
 
 200             logger.debug("Generated new operation for Service Instance serviceId:" + serviceId + " operationId:" + operationId)
 
 201             serviceId = UriUtils.encode(serviceId,"UTF-8")
 
 202             execution.setVariable("serviceInstanceId", serviceId)
 
 203             execution.setVariable("operationType", operationType)
 
 205             def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint",execution)
 
 206             execution.setVariable("CSSOS_dbAdapterEndpoint", dbAdapterEndpoint)
 
 207             logger.debug("DB Adapter Endpoint is: " + dbAdapterEndpoint)
 
 208             def dbAdapterAuth = UrnPropertiesReader.getVariable("mso.requestDb.auth")
 
 209             Map<String, String> CSSOS_headerMap = [:]
 
 210             CSSOS_headerMap.put("content-type", "application/soap+xml")
 
 211             CSSOS_headerMap.put("Authorization", dbAdapterAuth)
 
 212             execution.setVariable("CSSOS_headerMap", CSSOS_headerMap)
 
 213             logger.debug("DB Adapter Header is: " + CSSOS_headerMap)
 
 216                     """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 
 217                         xmlns:ns="http://org.onap.so/requestsdb">
 
 220                             <ns:initServiceOperationStatus xmlns:ns="http://org.onap.so/requestsdb">
 
 221                             <serviceId>${MsoUtils.xmlEscape(serviceId)}</serviceId>
 
 222                             <operationId>${MsoUtils.xmlEscape(operationId)}</operationId>
 
 223                             <operationType>${MsoUtils.xmlEscape(operationType)}</operationType>
 
 224                             <userId>${MsoUtils.xmlEscape(userId)}</userId>
 
 225                             <result>${MsoUtils.xmlEscape(result)}</result>
 
 226                             <operationContent>${MsoUtils.xmlEscape(operationContent)}</operationContent>
 
 227                             <progress>${MsoUtils.xmlEscape(progress)}</progress>
 
 228                             <reason>${MsoUtils.xmlEscape(reason)}</reason>
 
 229                         </ns:initServiceOperationStatus>
 
 231                 </soapenv:Envelope>"""
 
 233             payload = utils.formatXml(payload)
 
 234             execution.setVariable("CSSOS_updateServiceOperStatusRequest", payload)
 
 235             logger.debug("Outgoing updateServiceOperStatusRequest: \n" + payload)
 
 237             logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
 
 238                     "Exception Occured Processing prepareInitServiceOperationStatus.", "BPMN",
 
 239                     ErrorCode.UnknownError.getValue(), "Exception is:\n" + e)
 
 241         logger.debug("Finish prepareInitServiceOperationStatus")
 
 245      * prepare create OrchestrationTask
 
 248     public void prepareCreateOrchestrationTask(DelegateExecution execution) {
 
 249         logger.debug("Start createOrchestrationTask")
 
 250         String taskId = execution.getBusinessKey()
 
 251         execution.setVariable("orchestrationTaskId", taskId)
 
 252         logger.debug("BusinessKey: " + taskId)
 
 253         String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
 254         String serviceInstanceName = execution.getVariable("serviceInstanceName")
 
 255         String taskName = "SliceServiceTask"
 
 256         String taskStatus = "Planning"
 
 257         String isManual = "false"
 
 258         String requestMethod = "POST"
 
 259         execution.setVariable("CSSOT_taskId", taskId)
 
 260         execution.setVariable("CSSOT_name", taskName)
 
 261         execution.setVariable("CSSOT_status", taskStatus)
 
 262         execution.setVariable("CSSOT_isManual", isManual)
 
 263         execution.setVariable("CSSOT_requestMethod", requestMethod)
 
 265         Map<String, Object> serviceProfile = execution.getVariable("serviceProfile") as Map<String, Object>
 
 267         SliceTaskParamsAdapter sliceTaskParams = new SliceTaskParamsAdapter()
 
 268         sliceTaskParams.setServiceId(serviceInstanceId)
 
 269         sliceTaskParams.setServiceName(serviceInstanceName)
 
 270         sliceTaskParams.setServiceProfile(serviceProfile)
 
 272         execution.setVariable("sliceTaskParams", sliceTaskParams)
 
 274         //todo:----------------------------------------
 
 275 //        String paramJson = sliceTaskParams.convertToJson()
 
 276 //        execution.setVariable("CSSOT_paramJson", paramJson)
 
 277         /*-------------------------------------------*/
 
 279         logger.debug("Finish createOrchestrationTask")
 
 283      *  send sync response to csmf
 
 286     public void sendSyncResponse(DelegateExecution execution) {
 
 287         logger.debug("Start sendSyncResponse")
 
 289             String operationId = execution.getVariable("operationId")
 
 290             String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
 291             // RESTResponse for API Handler (APIH) Reply Task
 
 292             String createServiceRestRequest = """
 
 295                         "serviceId":"${serviceInstanceId}",
 
 296                         "operationId":"${operationId}"
 
 301             logger.debug("sendSyncResponse to APIH:" + "\n" + createServiceRestRequest)
 
 302             sendWorkflowResponse(execution, 202, createServiceRestRequest)
 
 303             execution.setVariable("sentSyncResponse", true)
 
 304         } catch (Exception e) {
 
 305             String msg = "Exceptuion in sendSyncResponse:" + e.getMessage()
 
 307             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 309         logger.debug("Finish sendSyncResponse")
 
 312     public void prepareSelectNSTRequest(DelegateExecution execution) {
 
 313         logger.debug("Start prepareSelectNSTRequest")
 
 314         String requestId = execution.getVariable("msoRequestId")
 
 315         String messageType = "NSTSelectionResponse"
 
 316         Map<String, Object> serviceProfile = execution.getVariable("serviceProfile") as Map<String, Object>
 
 317         execution.setVariable("nstSelectionUrl", "/api/oof/v1/selection/nst")
 
 318         execution.setVariable("nstSelection_messageType", messageType)
 
 319         execution.setVariable("nstSelection_correlator", requestId)
 
 320         String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
 
 321         execution.setVariable("nstSelection_timeout", timeout)
 
 322         String oofRequest = oofUtils.buildSelectNSTRequest(requestId, messageType, serviceProfile)
 
 323         execution.setVariable("nstSelection_oofRequest", oofRequest)
 
 324         logger.debug("Finish prepareSelectNSTRequest")
 
 329      * process async response of oof, put the {@solutions} at {@nstSolution}
 
 332     public void processNSTSolutions(DelegateExecution execution) {
 
 333         Map<String, Object> nstSolution
 
 335             logger.debug("Start processing NSTSolutions")
 
 336             Map<String, Object> resMap =
 
 337                     objectMapper.readValue(execution.getVariable("nstSelection_oofResponse") as String,
 
 340             List<Map<String, Object>> nstSolutions = (List<Map<String, Object>>) resMap.get("solutions")
 
 341             nstSolution = nstSolutions.get(0)
 
 342             execution.setVariable("nstSolution", nstSolution)
 
 344             //set nst info into sliceTaskParams
 
 345             SliceTaskParamsAdapter sliceTaskParams =
 
 346                     execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 347             TemplateInfo nstInfo = new TemplateInfo()
 
 348             nstInfo.setUUID(nstSolution.get("UUID") as String)
 
 349             nstInfo.setInvariantUUID(nstSolution.get("invariantUUID") as String)
 
 350             nstInfo.setName(nstSolution.get("name") as String)
 
 352             sliceTaskParams.setNSTInfo(nstInfo)
 
 354             execution.setVariable("sliceTaskParams", sliceTaskParams)
 
 356         } catch (Exception ex) {
 
 357             logger.debug( "Failed to get NST solution suggested by OOF.")
 
 358             exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Failed to get NST solution suggested by OOF.")
 
 363     public void prepareUpdateOrchestrationTask(DelegateExecution execution) {
 
 364         logger.debug("Start prepareUpdateOrchestrationTask")
 
 365         String requestMethod = "PUT"
 
 366         String taskStatus = execution.getVariable("taskStatus")
 
 367         SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams")
 
 368         String paramJson = sliceTaskParams.convertToJson()
 
 369         execution.setVariable("CSSOT_status", taskStatus)
 
 370         execution.setVariable("CSSOT_paramJson", paramJson)
 
 371         execution.setVariable("CSSOT_requestMethod", requestMethod)
 
 372         logger.debug("Finish prepareUpdateOrchestrationTask")
 
 376     public void prepareGetUserOptions(DelegateExecution execution) {
 
 377         logger.debug("Start prepareGetUserOptions")
 
 378         String requestMethod = "GET"
 
 379         execution.setVariable("taskAction", "commit")
 
 380         String taskAction = execution.getVariable("taskAction")
 
 381         logger.debug("task action is: " + taskAction)
 
 382         if (!"commit".equals(taskAction) && !"abort".equals(taskAction)) {
 
 383             String msg = "Unknown task action: " + taskAction
 
 385             exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
 387         execution.setVariable("CSSOT_requestMethod", requestMethod)
 
 388         logger.debug("Finish prepareGetUserOptions")
 
 391     public void processUserOptions(DelegateExecution execution) {
 
 392         logger.debug("Start processUserOptions")
 
 393         String response = execution.getVariable("CSSOT_dbResponse")
 
 394         OrchestrationTask orchestrationTask = objectMapper.readValue(response, OrchestrationTask.class)
 
 395         String paramJson = orchestrationTask.getParams()
 
 396         logger.debug("paramJson: " + paramJson)
 
 397         SliceTaskParams sliceTaskParams = new SliceTaskParams()
 
 398         sliceTaskParams.convertFromJson(paramJson)
 
 399         execution.setVariable("sliceTaskParams", sliceTaskParams)
 
 400         logger.debug("Finish processUserOptions")
 
 403     public void updateAAIOrchStatus(DelegateExecution execution) {
 
 404         logger.debug("Start updateAAIOrchStatus")
 
 405         String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
 406         String orchStatus = execution.getVariable("orchestrationStatus")
 
 409             ServiceInstance si = new ServiceInstance()
 
 410             si.setOrchestrationStatus(orchStatus)
 
 411             AAIResourcesClient client = new AAIResourcesClient()
 
 412             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId)
 
 413             client.update(uri, si)
 
 414         } catch (BpmnError e) {
 
 416         } catch (Exception ex) {
 
 417             String msg = "Exception in CreateSliceService.updateAAIOrchStatus " + ex.getMessage()
 
 419             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 422         logger.debug("Finish updateAAIOrchStatus")
 
 425     public void prepareUpdateServiceOperationStatus(DelegateExecution execution) {
 
 426         logger.debug("Start preUpdateServiceOperationStatus")
 
 428             String serviceId = execution.getVariable("serviceInstanceId")
 
 429             String operationId = execution.getVariable("operationId")
 
 430             String operationType = execution.getVariable("operationType")
 
 431             String userId = execution.getVariable("globalSubscriberId")
 
 432             String result = execution.getVariable("operationResult")
 
 433             String progress = execution.getVariable("operationProgress")
 
 434             String reason = execution.getVariable("operationReason")
 
 435             String operationContent = "service: " + result + " progress: " + progress
 
 438                     """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 
 439                         xmlns:ns="http://org.onap.so/requestsdb">
 
 442                             <ns:initServiceOperationStatus xmlns:ns="http://org.onap.so/requestsdb">
 
 443                             <serviceId>${MsoUtils.xmlEscape(serviceId)}</serviceId>
 
 444                             <operationId>${MsoUtils.xmlEscape(operationId)}</operationId>
 
 445                             <operationType>${MsoUtils.xmlEscape(operationType)}</operationType>
 
 446                             <userId>${MsoUtils.xmlEscape(userId)}</userId>
 
 447                             <result>${MsoUtils.xmlEscape(result)}</result>
 
 448                             <operationContent>${MsoUtils.xmlEscape(operationContent)}</operationContent>
 
 449                             <progress>${MsoUtils.xmlEscape(progress)}</progress>
 
 450                             <reason>${MsoUtils.xmlEscape(reason)}</reason>
 
 451                         </ns:initServiceOperationStatus>
 
 453                 </soapenv:Envelope>"""
 
 455             payload = utils.formatXml(payload)
 
 456             execution.setVariable("CSSOS_updateServiceOperStatusRequest", payload)
 
 457             logger.debug("Outgoing updateServiceOperStatusRequest: \n" + payload)
 
 460             logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
 
 461                     "Exception Occured Processing preUpdateServiceOperationStatus.", "BPMN",
 
 462                     ErrorCode.UnknownError.getValue(), "Exception is:\n" + e.getMessage())
 
 464         logger.debug("Finish preUpdateServiceOperationStatus")
 
 469     public void prepareCompletionRequest (DelegateExecution execution) {
 
 470         logger.trace("Start prepareCompletionRequest")
 
 472             String requestId = execution.getVariable("msoRequestId")
 
 473             String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
 474             String source = execution.getVariable("source")
 
 476             String msoCompletionRequest =
 
 477                     """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
 
 478                                 xmlns:ns="http://org.onap/so/request/types/v1">
 
 479                         <request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
 
 480                             <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
 
 481                             <action>CREATE</action>
 
 482                             <source>${MsoUtils.xmlEscape(source)}</source>
 
 484                         <status-message>Service Instance was created successfully.</status-message>
 
 485                         <serviceInstanceId>${MsoUtils.xmlEscape(serviceInstanceId)}</serviceInstanceId>
 
 486                         <mso-bpel-name>CreateGenericALaCarteServiceInstance</mso-bpel-name>
 
 487                     </aetgt:MsoCompletionRequest>"""
 
 490             String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
 
 492             execution.setVariable("completionRequest", xmlMsoCompletionRequest)
 
 493             logger.debug("Overall SUCCESS Response going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest)
 
 495         } catch (Exception ex) {
 
 496             String msg = " Exception in prepareCompletion:" + ex.getMessage()
 
 498             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 500         logger.trace("Finish prepareCompletionRequest")