2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  # Copyright (c) 2019, 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 groovy.json.JsonSlurper
 
  24 import org.camunda.bpm.engine.delegate.BpmnError
 
  25 import org.camunda.bpm.engine.delegate.DelegateExecution
 
  26 import org.json.JSONObject
 
  27 import org.onap.aai.domain.yang.Relationship
 
  28 import org.onap.aai.domain.yang.ServiceInstance
 
  29 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 
  30 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 
  31 import org.onap.so.bpmn.common.scripts.MsoUtils
 
  32 import org.onap.so.bpmn.common.scripts.RequestDBUtil
 
  33 import org.onap.so.bpmn.core.UrnPropertiesReader
 
  34 import org.onap.so.bpmn.core.WorkflowException
 
  35 import org.onap.so.bpmn.core.domain.ServiceDecomposition
 
  36 import org.onap.so.bpmn.core.domain.ServiceInfo
 
  37 import org.onap.so.bpmn.core.domain.ServiceProxy
 
  38 import org.onap.so.bpmn.core.json.JsonUtils
 
  39 import org.onap.so.client.aai.AAIObjectType
 
  40 import org.onap.so.client.aai.AAIResourcesClient
 
  41 import org.onap.so.client.aai.entities.uri.AAIResourceUri
 
  42 import org.onap.so.client.aai.entities.uri.AAIUriFactory
 
  43 import org.onap.so.db.request.beans.OperationStatus
 
  44 import org.slf4j.Logger
 
  45 import org.slf4j.LoggerFactory
 
  46 import org.springframework.web.util.UriUtils
 
  48 import static org.apache.commons.lang3.StringUtils.isBlank
 
  51  * This groovy class supports the <class>DoCreateCommunicationService.bpmn</class> process.
 
  52  * AlaCarte flow for 1702 ServiceInstance Create
 
  55 class CreateCommunicationService extends AbstractServiceTaskProcessor {
 
  59     ExceptionUtil exceptionUtil = new ExceptionUtil()
 
  61     RequestDBUtil requestDBUtil = new RequestDBUtil()
 
  63     JsonUtils jsonUtil = new JsonUtils()
 
  65     AAIResourcesClient client = getAAIClient()
 
  67     private static final Logger logger = LoggerFactory.getLogger(CreateCommunicationService.class)
 
  70     void preProcessRequest(DelegateExecution execution) {
 
  71         logger.debug(Prefix + "preProcessRequest Start")
 
  72         execution.setVariable("prefix", Prefix)
 
  73         execution.setVariable("startTime", System.currentTimeMillis())
 
  75         //execution.setVariable("bpmnRequest", InputString)
 
  78             String siRequest = execution.getVariable("bpmnRequest")
 
  79             logger.debug(siRequest)
 
  81             //String requestId = execution.getVariable("mso-request-id")
 
  82             String requestId = execution.getVariable("mso-request-id")
 
  83             execution.setVariable("msoRequestId", requestId)
 
  84             logger.debug("Input Request:" + siRequest + " reqId:" + requestId)
 
  86             String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
  87             if (isBlank(serviceInstanceId)) {
 
  88                 serviceInstanceId = UUID.randomUUID().toString()
 
  90             logger.debug("Generated new Service Instance:" + serviceInstanceId)
 
  91             serviceInstanceId = UriUtils.encode(serviceInstanceId,"UTF-8")
 
  92             execution.setVariable("serviceInstanceId", serviceInstanceId)
 
  95             String globalSubscriberId = jsonUtil.getJsonValue(siRequest, "requestDetails.subscriberInfo.globalSubscriberId")
 
  96             if (isBlank(globalSubscriberId)) {
 
  97                 msg = "Input globalSubscriberId' is null"
 
  98                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
 100                 execution.setVariable("globalSubscriberId", globalSubscriberId)
 
 104             execution.setVariable("source", jsonUtil.getJsonValue(siRequest, "requestDetails.requestInfo.source"))
 
 105             execution.setVariable("serviceInstanceName", jsonUtil.getJsonValue(siRequest, "requestDetails.requestInfo.instanceName"))
 
 106             execution.setVariable("disableRollback", jsonUtil.getJsonValue(siRequest, "requestDetails.requestInfo.suppressRollback"))
 
 107             String productFamilyId = jsonUtil.getJsonValue(siRequest, "requestDetails.requestInfo.productFamilyId")
 
 108             if (isBlank(productFamilyId))
 
 110                 msg = "Input productFamilyId is null"
 
 112                 //exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
 114                 execution.setVariable("productFamilyId", productFamilyId)
 
 118             String serviceModelInfo = jsonUtil.getJsonValue(siRequest, "requestDetails.modelInfo")
 
 119             if (isBlank(serviceModelInfo)) {
 
 120                 msg = "Input serviceModelInfo is null"
 
 122                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
 125                 execution.setVariable("csServiceModelInfo", serviceModelInfo)
 
 128             logger.debug("modelInfo: " + serviceModelInfo)
 
 130             //requestParameters, subscriptionServiceType is 5G
 
 131             String subscriptionServiceType = jsonUtil.getJsonValue(siRequest, "requestDetails.requestParameters.subscriptionServiceType")
 
 132             if (isBlank(subscriptionServiceType)) {
 
 133                 msg = "Input subscriptionServiceType is null"
 
 135                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
 137                 // todo: in create e2e interface, this value is write "MOG", so write it as "5G"
 
 138                 execution.setVariable("subscriptionServiceType", "5G")
 
 143              * Extracting User Parameters from incoming Request and converting into a Map
 
 145             def jsonSlurper = new JsonSlurper()
 
 147             Map reqMap = jsonSlurper.parseText(siRequest) as Map
 
 150             def userParamsList = reqMap.requestDetails?.requestParameters?.userParams
 
 152             Map<String, String> inputMap = [:]
 
 153             if (userParamsList) {
 
 154                 for (def i=0; i<userParamsList.size(); i++) {
 
 155                     def userParams1 = userParamsList.get(i)
 
 156                     userParams1.each { param -> inputMap.put(param.key, param.value)}
 
 160             logger.debug("User Input Parameters map: " + inputMap.toString())
 
 161             execution.setVariable("serviceInputParams", inputMap)
 
 162             execution.setVariable("uuiRequest", inputMap.get("UUIRequest"))
 
 163             execution.setVariable("isAllNSMFFinished", "false")
 
 164             String operationId = UUID.randomUUID().toString()
 
 165             execution.setVariable("operationId", operationId)
 
 167         } catch(BpmnError e) {
 
 169         } catch(Exception ex) {
 
 170             msg = "Exception in CreateCommunicationService.preProcessRequest " + ex.getMessage()
 
 172             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 174         logger.debug(Prefix + "preProcessRequest Exit")
 
 179      * create operation status in request db
 
 181      * Init the Operation Status
 
 183     def prepareInitOperationStatus = { DelegateExecution execution ->
 
 184         logger.debug(Prefix + "prepareInitOperationStatus Start")
 
 186         String serviceId = execution.getVariable("serviceInstanceId")
 
 188         String operationId = execution.getVariable("operationId")
 
 189         logger.debug("Generated new operation for Service Instance serviceId:" + serviceId + " operationId:" + operationId)
 
 191         OperationStatus initStatus = new OperationStatus()
 
 192         initStatus.setServiceId(serviceId)
 
 193         initStatus.setOperationId(operationId)
 
 194         initStatus.setOperation("CREATE")
 
 195         initStatus.setUserId(execution.getVariable("globalSubscriberId") as String)
 
 196         initStatus.setResult("processing")
 
 197         initStatus.setProgress("0")
 
 198         initStatus.setReason("")
 
 199         initStatus.setOperationContent("communication service create operation start")
 
 201         requestDBUtil.prepareUpdateOperationStatus(execution, initStatus)
 
 203         logger.debug(Prefix + "prepareInitOperationStatus Exit")
 
 208      * return sync response
 
 210     def sendSyncResponse = { DelegateExecution execution ->
 
 211         logger.debug(Prefix + "sendSyncResponse Start")
 
 213             String operationId = execution.getVariable("operationId")
 
 214             String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
 215             String createServiceRestRequest = """
 
 218                             "serviceId":"${serviceInstanceId}",
 
 219                             "operationId":"${operationId}"
 
 222                     """.trim().replaceAll(" ", "")
 
 224             logger.debug("sendSyncResponse to APIH:" + "\n" + createServiceRestRequest)
 
 225             sendWorkflowResponse(execution, 202, createServiceRestRequest)
 
 227             execution.setVariable("sentSyncResponse", true)
 
 228         } catch (Exception ex) {
 
 229             String msg = "Exceptuion in sendSyncResponse:" + ex.getMessage()
 
 231             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 233         logger.debug(Prefix + "sendSyncResponse Exit")
 
 241     def prepareDoComposeE2E = { DelegateExecution execution ->
 
 242         logger.debug(Prefix + "prepareDoComposeE2E Start")
 
 244             ServiceDecomposition serviceDecomposition = execution.getVariable(
 
 245                     "csServiceDecomposition") as ServiceDecomposition
 
 247             logger.debug("serviceDecomposition is:" + serviceDecomposition.toJsonString())
 
 249             List<ServiceProxy> serviceProxies = serviceDecomposition.getServiceProxy()
 
 250             String sourceModelUuid = serviceProxies.get(0).getSourceModelUuid()
 
 252             JSONObject queryJson = new JSONObject()
 
 253             queryJson.put("modelUuid", sourceModelUuid)
 
 255             execution.setVariable("e2eServiceModelInfo", queryJson.toString())
 
 256         } catch (BpmnError e) {
 
 258         } catch (Exception ex) {
 
 259             String msg = "Exception in CreateCommunicationService.prepareDoComposeE2E. " + ex.getMessage()
 
 261             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 264         logger.debug(Prefix + "prepareDoComposeE2E Exit")
 
 269      * parse communication service params from request
 
 272     def parseCSParamsFromReq = { DelegateExecution execution ->
 
 273         logger.debug(Prefix + "parseCSParamsFromReq Start")
 
 277             String modelInfo = execution.getVariable("csServiceModelInfo")
 
 278             String modelInvariantUuid = jsonUtil.getJsonValue(modelInfo, "modelInvariantUuid")
 
 279             String modelUuid = jsonUtil.getJsonValue(modelInfo, "modelUuid")
 
 281             //String modelInvariantUuid = execution.getVariable("modelInvariantId")
 
 282             //String modelUuid = execution.getVariable("modelUuid")
 
 283             String uuiRequest = execution.getVariable("uuiRequest")
 
 284             String useInterval = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.useInterval")
 
 285             String csServiceName = jsonUtil.getJsonValue(uuiRequest, "service.name")
 
 286             String csServiceDescription = jsonUtil.getJsonValue(uuiRequest, "service.description")
 
 288             execution.setVariable("modelInvariantUuid", modelInvariantUuid)
 
 289             execution.setVariable("modelUuid", modelUuid)
 
 290             execution.setVariable("useInterval", useInterval)
 
 291             execution.setVariable("csServiceName", csServiceName)
 
 292             execution.setVariable("csServiceDescription", csServiceDescription)
 
 296             Integer expDataRateDL = jsonUtil.getJsonIntValue(uuiRequest, "service.parameters.requestInputs.expDataRateDL")
 
 297             Integer expDataRateUL = jsonUtil.getJsonIntValue(uuiRequest, "service.parameters.requestInputs.expDataRateUL")
 
 298             Integer latency = jsonUtil.getJsonIntValue(uuiRequest, "service.parameters.requestInputs.latency")
 
 299             Integer maxNumberOfUEs = jsonUtil.getJsonIntValue(uuiRequest, "service.parameters.requestInputs.maxNumberofUEs")
 
 300             String uEMobilityLevel = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.uemobilityLevel")
 
 301             String resourceSharingLevel = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.resourceSharingLevel")
 
 302             String coverageArea = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.coverageAreaList")
 
 304             // from template construct input map
 
 305             //String cstTemplate = execution.getVariable("cstTemplate")
 
 306             ServiceDecomposition csServiceDecomposition = execution.getVariable(
 
 307                     "csServiceDecomposition") as ServiceDecomposition
 
 308             //String csServiceType = jsonUtil.getJsonValue(cstTemplate, "serviceResources.serviceType")
 
 309             String csServiceType = csServiceDecomposition.getServiceType()
 
 310             execution.setVariable("csServiceType", csServiceType)
 
 312             //String cstTemplateInfo = jsonUtil.getJsonValue(cstTemplate, "serviceResources.serviceInfo.serviceInput")
 
 313             ServiceInfo csServiceInfo = csServiceDecomposition.getServiceInfo()
 
 314             String cstTemplateInfo = csServiceInfo.getServiceProperties()
 
 316             List<String> csInputs = jsonUtil.StringArrayToList(cstTemplateInfo)
 
 318             Map<String, ?> csInputMap = new HashMap<>()
 
 319             for (String csInput : csInputs) {
 
 321                 if (jsonUtil.getJsonValue(csInput, "type") == "integer") {
 
 322                     value = jsonUtil.getJsonValue(csInput, "default")
 
 323                     csInputMap.put(jsonUtil.getJsonValue(csInput, "name"), isBlank(value) ? 0 : (value as Integer))
 
 324                 } else if (jsonUtil.getJsonValue(csInput, "type") == "string") {
 
 325                     csInputMap.put(jsonUtil.getJsonValue(csInput, "name"),
 
 326                             jsonUtil.getJsonValue(csInput, "default"))
 
 329             csInputMap.put("expDataRateDL", expDataRateDL)
 
 330             csInputMap.put("expDataRateUL", expDataRateUL)
 
 331             csInputMap.put("latency", latency)
 
 332             csInputMap.put("maxNumberofUEs", maxNumberOfUEs)
 
 333             csInputMap.put("uEMobilityLevel", uEMobilityLevel)
 
 334             csInputMap.put("resourceSharingLevel", resourceSharingLevel)
 
 335             csInputMap.put("coverageAreaTAList", coverageArea)
 
 336             csInputMap.put("useInterval", useInterval)
 
 338             execution.setVariable("csInputMap", csInputMap)
 
 339         } catch (BpmnError e) {
 
 341         } catch (Exception ex) {
 
 342             String msg = "Exception in CreateCommunicationService.parseCSParamsFromReq. " + ex.getMessage()
 
 344             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 346         logger.debug(Prefix + "parseCSParamsFromReq Exit")
 
 351      * get E2EST id through CST id and change communication profile to E2E service profile
 
 352      * 1. get E2EST id from cst
 
 353      * 1.1 查source service id
 
 355      * 1.3 source service input, init e2e profile
 
 357     def generateE2EServiceProfile = { DelegateExecution execution ->
 
 358         logger.debug(Prefix + "generateE2EServiceProfile Start")
 
 360             ServiceDecomposition e2eServiceDecomposition = execution.getVariable(
 
 361                     "e2eServiceDecomposition") as ServiceDecomposition
 
 362             String e2estTemplateInfo = e2eServiceDecomposition.getServiceInfo().getServiceProperties()
 
 364             List<String> e2eInputs = jsonUtil.StringArrayToList(e2estTemplateInfo)
 
 366             Map<String, ?> csInputMap = execution.getVariable("csInputMap") as Map
 
 367             Map<String, ?> e2eInputMap = new HashMap<>()
 
 372             for (String e2eInput in e2eInputs) {
 
 373                 if (jsonUtil.getJsonValue(e2eInput, "type") == "integer") {
 
 375                     key = jsonUtil.getJsonValue(e2eInput, "name")
 
 376                     value = csInputMap.containsKey(key) ? csInputMap.getOrDefault(key, 0) : (isBlank(temp = jsonUtil.getJsonValue(e2eInput, "default")) ? 0 : temp)
 
 378                     e2eInputMap.put(key, value as Integer)
 
 380                     e2eInputMap.put(key = jsonUtil.getJsonValue(e2eInput, "name"), csInputMap.containsKey(key)
 
 381                             ? csInputMap.getOrDefault(key, null) : (jsonUtil.getJsonValue(e2eInput, "default")))
 
 385             e2eInputMap.put("sNSSAI", execution.getVariable("sNSSAI_id"))
 
 386             e2eInputMap.put("areaTrafficCapDL", 100)
 
 387             e2eInputMap.put("areaTrafficCapUL", 100)
 
 388             e2eInputMap.put("sST", execution.getVariable("csServiceType"))
 
 390             execution.setVariable("e2eInputMap", e2eInputMap)
 
 391             execution.setVariable("e2eServiceType", e2eServiceDecomposition.getServiceType())
 
 392             execution.setVariable("e2eModelInvariantUuid", e2eServiceDecomposition.getModelInfo().getModelInvariantUuid())
 
 393             execution.setVariable("e2eModelUuid", e2eServiceDecomposition.getModelInfo().getModelUuid())
 
 395         } catch (BpmnError e) {
 
 397         } catch (Exception ex) {
 
 398             String msg = "Exception in DoCreateE2EServiceInstance.createRelationShipInAAI. " + ex.getMessage()
 
 400             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 403         logger.debug(Prefix + "generateE2EServiceProfile Exit")
 
 408      * call createE2EService get operation id,
 
 411     def preRequestSend2NSMF(DelegateExecution execution) {
 
 412         logger.debug(Prefix + "preRequestSend2NSMF Start")
 
 415             //String NSMF_endpoint = "/onap/so/infra/e2eServiceInstances/v3"
 
 416             def NSMF_endpoint = UrnPropertiesReader.getVariable("mso.infra.endpoint.url", execution)
 
 417             def url = NSMF_endpoint + "/e2eServiceInstances/v3"
 
 418             execution.setVariable("NSMF_endpoint", url)
 
 419             //get from model catalog inputs
 
 423                         "name": "${execution.getVariable("csServiceName")}",
 
 424                         "description": "e2eService of ${execution.getVariable("modelUuid")}",
 
 425                         "serviceInvariantUuid": "${execution.getVariable("e2eModelInvariantUuid")}",
 
 426                         "serviceUuid": "${execution.getVariable("e2eModelUuid")}",
 
 427                         "globalSubscriberId": "${execution.getVariable("globalSubscriberId")}",
 
 428                         "serviceType": "${execution.getVariable("subscriptionServiceType")}",
 
 430                             "requestInputs": ${execution.getVariable("e2eInputMap") as JSONObject}
 
 435             execution.setVariable("CSMF_NSMFRequest", payload.replaceAll("\\s+", ""))
 
 437         } catch (BpmnError e) {
 
 439         } catch (Exception ex) {
 
 440             String msg = "Exception in CreateCommunicationService.preRequestSend2NSMF. " + ex.getMessage()
 
 442             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 445         logger.debug(Prefix + "preRequestSend2NSMF Exit")
 
 449     def processNSMFResponse = { DelegateExecution execution ->
 
 450         logger.debug(Prefix + "processNSMFResponse Start")
 
 453             def CSMF_NSMFResponseCode = execution.getVariable("CSMF_NSMFResponseCode") as Integer
 
 454             if (CSMF_NSMFResponseCode >= 200 && CSMF_NSMFResponseCode < 400) {
 
 455                 def CSMF_NSMFResponse = execution.getVariable("CSMF_NSMFResponse") as String
 
 456                 def e2eServiceInstanceId = jsonUtil.getJsonValue(CSMF_NSMFResponse, "service.serviceId")
 
 457                 def e2eOperationId = jsonUtil.getJsonValue(CSMF_NSMFResponse, "service.operationId")
 
 459                 execution.setVariable("e2eServiceInstanceId", e2eServiceInstanceId)
 
 460                 execution.setVariable("e2eOperationId", e2eOperationId)
 
 461                 execution.setVariable("ProcessNsmfSuccess", "OK")
 
 463                 execution.setVariable("ProcessNsmfSuccess", "ERROR")
 
 464                 execution.setVariable("operationStatus", "error")
 
 465                 execution.setVariable("operationContent",
 
 466                         "communication service create operation error: nsmf response fail")
 
 467                 execution.setVariable("orchestrationStatus", "error")
 
 470         } catch (BpmnError e) {
 
 472         } catch (Exception ex) {
 
 473             String msg = "Exception in " + Prefix + "processOOFResponse. " + ex.getMessage()
 
 475             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 477         logger.debug(Prefix + "processNSMFResponse Exit")
 
 482      * create communication service and e2e service relationship
 
 485     def createCSAndSSRelationship = { DelegateExecution execution ->
 
 486         logger.debug(Prefix + "createCSAndSSRelationship Start")
 
 489             def e2eServiceInstanceId = execution.getVariable("e2eServiceInstanceId")
 
 490             String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 491             String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 493             Relationship relationship = new Relationship()
 
 494             String relatedLink = "aai/v16/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${e2eServiceInstanceId}"
 
 495             relationship.setRelatedLink(relatedLink)
 
 497             // create CS and SS relationship in AAI
 
 498             createRelationShipInAAI(execution, relationship)
 
 500         } catch (BpmnError e) {
 
 502         } catch (Exception ex) {
 
 504             msg = "Exception in DoCreateE2EServiceInstance.createCustomRelationship. " + ex.getMessage()
 
 506             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 508         logger.debug(Prefix + "createCSAndSSRelationship Exit")
 
 513      * prepare update operation status to 50% after create relationship in aai
 
 516     def prepareUpdateOperationStatus = { DelegateExecution execution ->
 
 517         logger.debug(Prefix + "prepareUpdateOperationStatus Start")
 
 518         // update status creating
 
 519         OperationStatus status = new OperationStatus()
 
 520         status.setServiceId(execution.getVariable("serviceInstanceId") as String)
 
 521         status.setOperationId(execution.getVariable("operationId") as String)
 
 522         status.setOperation("CREATE")
 
 523         status.setResult("processing")
 
 524         status.setProgress("20")
 
 525         status.setOperationContent("communication service create operation processing: waiting nsmf service create finished")
 
 526         status.setUserId(execution.getVariable("globalSubscriberId") as String)
 
 528         requestDBUtil.prepareUpdateOperationStatus(execution, status)
 
 529         logger.debug(Prefix + "prepareUpdateOperationStatus Exit")
 
 534      * create relationship in AAI
 
 536     private createRelationShipInAAI = { DelegateExecution execution, final Relationship relationship ->
 
 537         logger.debug(Prefix + "createRelationShipInAAI Start")
 
 540             String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
 541             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
 
 542                     execution.getVariable("globalSubscriberId"),
 
 543                     execution.getVariable("subscriptionServiceType"),
 
 544                     serviceInstanceId).relationshipAPI()
 
 545             client.create(uri, relationship)
 
 547         } catch (BpmnError e) {
 
 549         } catch (Exception ex) {
 
 550             msg = "Exception in CreateCommunicationService.createRelationShipInAAI. " + ex.getMessage()
 
 552             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 554         logger.debug(Prefix + "createRelationShipInAAI Exit")
 
 559     def prepareCallCheckProcessStatus = { DelegateExecution execution ->
 
 560         logger.debug(Prefix + "prepareCallCheckProcessStatus Start")
 
 562         def successConditions = new ArrayList<>()
 
 563         successConditions.add("finished")
 
 564         execution.setVariable("successConditions", successConditions)
 
 566         def errorConditions = new ArrayList<>()
 
 567         errorConditions.add("error")
 
 568         execution.setVariable("errorConditions", errorConditions)
 
 570         execution.setVariable("processServiceType", "communication service")
 
 572         execution.setVariable("subOperationType", "CREATE")
 
 574         execution.setVariable("timeOut", 3 * 60 * 60 * 1000)
 
 576         def successParamMap = new HashMap<String, Object>()
 
 577         successParamMap.put("orchestrationStatus", "deactivated")
 
 579         execution.setVariable("successParamMap", successParamMap)
 
 581         def errorParamMap = new HashMap<String, Object>()
 
 582         errorParamMap.put("orchestrationStatus", "error")
 
 584         execution.setVariable("errorParamMap", errorParamMap)
 
 586         def timeOutParamMap = new HashMap<String, Object>()
 
 587         timeOutParamMap.put("orchestrationStatus", "error")
 
 589         execution.setVariable("timeOutParamMap", timeOutParamMap)
 
 591         execution.setVariable("initProgress", 20)
 
 592         execution.setVariable("endProgress", 90)
 
 594         logger.debug(Prefix + "prepareCallCheckProcessStatus Exit")
 
 599      * prepare update operation status to complete after NSMF process success
 
 602     def prepareCompleteStatus = { DelegateExecution execution ->
 
 603         logger.debug(Prefix + "prepareCompleteStatus Start")
 
 604         OperationStatus status = new OperationStatus()
 
 605         status.setServiceId(execution.getVariable("serviceInstanceId") as String)
 
 606         status.setOperationId(execution.getVariable("operationId") as String)
 
 607         status.setOperation("CREATE")
 
 608         status.setResult(execution.getVariable("operationStatus") as String)
 
 609         status.setProgress("100")
 
 610         status.setOperationContent(execution.getVariable("operationContent") as String)
 
 611         status.setUserId(execution.getVariable("globalSubscriberId") as String)
 
 613         requestDBUtil.prepareUpdateOperationStatus(execution, status)
 
 614         logger.debug("prepareCompleteStatus end, serviceInstanceId: " + execution.getVariable("serviceInstanceId")
 
 615                 + ", operationId: " + execution.getVariable("operationId"))
 
 616         logger.debug(Prefix + "prepareCompleteStatus Exit")
 
 621      * update NSMF complete status to AAI when the NSMF process finished
 
 624     def updateFinishStatusInAAI = { DelegateExecution execution ->
 
 625         logger.debug(Prefix + "updateFinishStatusInAAI Start")
 
 629             String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
 630             String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 631             String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 632             String orchestrationStatus = execution.getVariable("orchestrationStatus")
 
 634             ServiceInstance csi = new ServiceInstance()
 
 635             csi.setOrchestrationStatus(orchestrationStatus)
 
 636             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
 
 637                     globalSubscriberId, subscriptionServiceType, serviceInstanceId)
 
 638             client.update(uri, csi)
 
 639             logger.debug(Prefix + "updateFinishStatusInAAI update communication service status to deactivated")
 
 641         } catch (BpmnError e) {
 
 643         } catch (Exception ex) {
 
 644             msg = "Exception in complete communication service " + ex.getMessage()
 
 646             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 648         logger.debug(Prefix + "updateFinishStatusInAAI Exit")
 
 652     public sendSyncError = { DelegateExecution execution ->
 
 653         logger.debug("sendSyncError Start")
 
 656             if (execution.getVariable("WorkflowException") instanceof WorkflowException) {
 
 657                 WorkflowException wfe = execution.getVariable("WorkflowException") as WorkflowException
 
 658                 errorMessage = wfe.getErrorMessage()
 
 660                 errorMessage = "Sending Sync Error."
 
 663             String buildWorkflowException =
 
 664                     """<aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1">
 
 665                                         <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage>
 
 666                                         <aetgt:ErrorCode>7000</aetgt:ErrorCode>
 
 667                                    </aetgt:WorkflowException>"""
 
 669             logger.debug(buildWorkflowException)
 
 670             sendWorkflowResponse(execution, 500, buildWorkflowException)
 
 672         } catch (Exception ex) {
 
 673             logger.debug("Sending Sync Error Activity Failed. " + "\n" + ex.getMessage())
 
 675         logger.debug(Prefix + "sendSyncError Exit")