Merge "[SDC] Update SDC Distribution Client"
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / CreateCommunicationService.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  # Copyright (c) 2019, CMCC Technologies Co., Ltd.
6  #
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
10  #
11  #       http://www.apache.org/licenses/LICENSE-2.0
12  #
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=========================================================
19  */
20
21 package org.onap.so.bpmn.infrastructure.scripts
22
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.aaiclient.client.aai.AAIObjectType
40 import org.onap.aaiclient.client.aai.AAIResourcesClient
41 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
42 import org.onap.aaiclient.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
47
48 import static org.apache.commons.lang3.StringUtils.isBlank
49
50 /**
51  * This groovy class supports the <class>DoCreateCommunicationService.bpmn</class> process.
52  * AlaCarte flow for 1702 ServiceInstance Create
53  *
54  */
55 class CreateCommunicationService extends AbstractServiceTaskProcessor {
56
57     String Prefix="CCS_"
58
59     ExceptionUtil exceptionUtil = new ExceptionUtil()
60
61     RequestDBUtil requestDBUtil = new RequestDBUtil()
62
63     JsonUtils jsonUtil = new JsonUtils()
64
65     AAIResourcesClient client = getAAIClient()
66
67     private static final Logger logger = LoggerFactory.getLogger(CreateCommunicationService.class)
68
69     @Override
70     void preProcessRequest(DelegateExecution execution) {
71         logger.debug(Prefix + "preProcessRequest Start")
72         execution.setVariable("prefix", Prefix)
73         execution.setVariable("startTime", System.currentTimeMillis())
74         def msg
75         //execution.setVariable("bpmnRequest", InputString)
76         try {
77             // get request input
78             String siRequest = execution.getVariable("bpmnRequest")
79             logger.debug(siRequest)
80
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)
85
86             String serviceInstanceId = execution.getVariable("serviceInstanceId")
87             if (isBlank(serviceInstanceId)) {
88                 serviceInstanceId = UUID.randomUUID().toString()
89             }
90             logger.debug("Generated new Service Instance:" + serviceInstanceId)
91             serviceInstanceId = UriUtils.encode(serviceInstanceId,"UTF-8")
92             execution.setVariable("serviceInstanceId", serviceInstanceId)
93
94             //subscriberInfo
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)
99             } else {
100                 execution.setVariable("globalSubscriberId", globalSubscriberId)
101             }
102
103             //requestInfo
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))
109             {
110                 msg = "Input productFamilyId is null"
111                 logger.debug(msg)
112                 //exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
113             } else {
114                 execution.setVariable("productFamilyId", productFamilyId)
115             }
116
117             //modelInfo
118             String serviceModelInfo = jsonUtil.getJsonValue(siRequest, "requestDetails.modelInfo")
119             if (isBlank(serviceModelInfo)) {
120                 msg = "Input serviceModelInfo is null"
121                 logger.debug(msg)
122                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
123             } else
124             {
125                 execution.setVariable("csServiceModelInfo", serviceModelInfo)
126             }
127
128             logger.debug("modelInfo: " + serviceModelInfo)
129
130             //requestParameters, subscriptionServiceType is 5G
131             String subscriptionServiceType = jsonUtil.getJsonValue(siRequest, "requestDetails.requestParameters.subscriptionServiceType")
132             if (isBlank(subscriptionServiceType)) {
133                 msg = "Input subscriptionServiceType is null"
134                 logger.debug(msg)
135                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
136             } else {
137                 // todo: in create e2e interface, this value is write "MOG", so write it as "5G"
138                 execution.setVariable("subscriptionServiceType", "5G")
139             }
140
141
142             /*
143              * Extracting User Parameters from incoming Request and converting into a Map
144              */
145             def jsonSlurper = new JsonSlurper()
146
147             Map reqMap = jsonSlurper.parseText(siRequest) as Map
148
149             //InputParams
150             def userParamsList = reqMap.requestDetails?.requestParameters?.userParams
151
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)}
157                 }
158             }
159
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)
166
167         } catch(BpmnError e) {
168             throw e
169         } catch(Exception ex) {
170             msg = "Exception in CreateCommunicationService.preProcessRequest " + ex.getMessage()
171             logger.debug(msg)
172             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
173         }
174         logger.debug(Prefix + "preProcessRequest Exit")
175     }
176
177
178     /**
179      * create operation status in request db
180      *
181      * Init the Operation Status
182      */
183     def prepareInitOperationStatus = { DelegateExecution execution ->
184         logger.debug(Prefix + "prepareInitOperationStatus Start")
185
186         String serviceId = execution.getVariable("serviceInstanceId")
187         // 生成 operationId
188         String operationId = execution.getVariable("operationId")
189         logger.debug("Generated new operation for Service Instance serviceId:" + serviceId + " operationId:" + operationId)
190
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")
200
201         requestDBUtil.prepareUpdateOperationStatus(execution, initStatus)
202
203         logger.debug(Prefix + "prepareInitOperationStatus Exit")
204     }
205
206
207     /**
208      * return sync response
209      */
210     def sendSyncResponse = { DelegateExecution execution ->
211         logger.debug(Prefix + "sendSyncResponse Start")
212         try {
213             String operationId = execution.getVariable("operationId")
214             String serviceInstanceId = execution.getVariable("serviceInstanceId")
215             String createServiceRestRequest = """
216                     {
217                         "service": {
218                             "serviceId":"${serviceInstanceId}",
219                             "operationId":"${operationId}"
220                         }
221                     }
222                     """.trim().replaceAll(" ", "")
223
224             logger.debug("sendSyncResponse to APIH:" + "\n" + createServiceRestRequest)
225             sendWorkflowResponse(execution, 202, createServiceRestRequest)
226
227             execution.setVariable("sentSyncResponse", true)
228         } catch (Exception ex) {
229             String msg = "Exceptuion in sendSyncResponse:" + ex.getMessage()
230             logger.debug(msg)
231             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
232         }
233         logger.debug(Prefix + "sendSyncResponse Exit")
234     }
235
236
237     /**
238      * query e2e service
239      * @param execution
240      */
241     def prepareDoComposeE2E = { DelegateExecution execution ->
242         logger.debug(Prefix + "prepareDoComposeE2E Start")
243         try {
244             ServiceDecomposition serviceDecomposition = execution.getVariable(
245                     "csServiceDecomposition") as ServiceDecomposition
246
247             logger.debug("serviceDecomposition is:" + serviceDecomposition.toJsonString())
248
249             List<ServiceProxy> serviceProxies = serviceDecomposition.getServiceProxy()
250             String sourceModelUuid = serviceProxies.get(0).getSourceModelUuid()
251
252             JSONObject queryJson = new JSONObject()
253             queryJson.put("modelUuid", sourceModelUuid)
254
255             execution.setVariable("e2eServiceModelInfo", queryJson.toString())
256         } catch (BpmnError e) {
257             throw e
258         } catch (Exception ex) {
259             String msg = "Exception in CreateCommunicationService.prepareDoComposeE2E. " + ex.getMessage()
260             logger.info(msg)
261             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
262         }
263
264         logger.debug(Prefix + "prepareDoComposeE2E Exit")
265     }
266
267
268     /**
269      * parse communication service params from request
270      * @param execution
271      */
272     def parseCSParamsFromReq = { DelegateExecution execution ->
273         logger.debug(Prefix + "parseCSParamsFromReq Start")
274         try {
275             //1. CMS info
276
277             String modelInfo = execution.getVariable("csServiceModelInfo")
278             String modelInvariantUuid = jsonUtil.getJsonValue(modelInfo, "modelInvariantUuid")
279             String modelUuid = jsonUtil.getJsonValue(modelInfo, "modelUuid")
280
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")
287
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)
293
294
295             //2. profile info
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")
303
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)
311
312             //String cstTemplateInfo = jsonUtil.getJsonValue(cstTemplate, "serviceResources.serviceInfo.serviceInput")
313             ServiceInfo csServiceInfo = csServiceDecomposition.getServiceInfo()
314             String cstTemplateInfo = csServiceInfo.getServiceProperties()
315
316             List<String> csInputs = jsonUtil.StringArrayToList(cstTemplateInfo)
317
318             Map<String, ?> csInputMap = new HashMap<>()
319             for (String csInput : csInputs) {
320                 def value
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"))
327                 }
328             }
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)
337
338             execution.setVariable("csInputMap", csInputMap)
339         } catch (BpmnError e) {
340             throw e
341         } catch (Exception ex) {
342             String msg = "Exception in CreateCommunicationService.parseCSParamsFromReq. " + ex.getMessage()
343             logger.info(msg)
344             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
345         }
346         logger.debug(Prefix + "parseCSParamsFromReq Exit")
347     }
348
349
350     /**
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
354      * 1.2 source service
355      * 1.3 source service input, init e2e profile
356      */
357     def generateE2EServiceProfile = { DelegateExecution execution ->
358         logger.debug(Prefix + "generateE2EServiceProfile Start")
359         try {
360             ServiceDecomposition e2eServiceDecomposition = execution.getVariable(
361                     "e2eServiceDecomposition") as ServiceDecomposition
362             String e2estTemplateInfo = e2eServiceDecomposition.getServiceInfo().getServiceProperties()
363
364             List<String> e2eInputs = jsonUtil.StringArrayToList(e2estTemplateInfo)
365
366             Map<String, ?> csInputMap = execution.getVariable("csInputMap") as Map
367             Map<String, ?> e2eInputMap = new HashMap<>()
368             String key
369             def value
370
371
372             for (String e2eInput in e2eInputs) {
373                 if (jsonUtil.getJsonValue(e2eInput, "type") == "integer") {
374                     def temp
375                     key = jsonUtil.getJsonValue(e2eInput, "name")
376                     value = csInputMap.containsKey(key) ? csInputMap.getOrDefault(key, 0) : (isBlank(temp = jsonUtil.getJsonValue(e2eInput, "default")) ? 0 : temp)
377
378                     e2eInputMap.put(key, value as Integer)
379                 } else {
380                     e2eInputMap.put(key = jsonUtil.getJsonValue(e2eInput, "name"), csInputMap.containsKey(key)
381                             ? csInputMap.getOrDefault(key, null) : (jsonUtil.getJsonValue(e2eInput, "default")))
382                 }
383             }
384
385             e2eInputMap.put("sNSSAI", execution.getVariable("sNSSAI_id"))
386
387             execution.setVariable("e2eInputMap", e2eInputMap)
388             execution.setVariable("e2eServiceType", e2eServiceDecomposition.getServiceType())
389             execution.setVariable("e2eModelInvariantUuid", e2eServiceDecomposition.getModelInfo().getModelInvariantUuid())
390             execution.setVariable("e2eModelUuid", e2eServiceDecomposition.getModelInfo().getModelUuid())
391
392         } catch (BpmnError e) {
393             throw e
394         } catch (Exception ex) {
395             String msg = "Exception in DoCreateE2EServiceInstance.createRelationShipInAAI. " + ex.getMessage()
396             logger.info(msg)
397             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
398         }
399
400         logger.debug(Prefix + "generateE2EServiceProfile Exit")
401     }
402
403
404     /**
405      * call createE2EService get operation id,
406      * created/processing
407      */
408     def preRequestSend2NSMF(DelegateExecution execution) {
409         logger.debug(Prefix + "preRequestSend2NSMF Start")
410         try {
411
412             //String NSMF_endpoint = "/onap/so/infra/e2eServiceInstances/v3"
413             def NSMF_endpoint = UrnPropertiesReader.getVariable("mso.infra.endpoint.url", execution)
414             def url = NSMF_endpoint + "/e2eServiceInstances/v3"
415             execution.setVariable("NSMF_endpoint", url)
416             //get from model catalog inputs
417             String payload = """
418                 {
419                     "service":{
420                         "name": "${execution.getVariable("csServiceName")}",
421                         "description": "e2eService of ${execution.getVariable("modelUuid")}",
422                         "serviceInvariantUuid": "${execution.getVariable("e2eModelInvariantUuid")}",
423                         "serviceUuid": "${execution.getVariable("e2eModelUuid")}",
424                         "globalSubscriberId": "${execution.getVariable("globalSubscriberId")}",
425                         "serviceType": "${execution.getVariable("subscriptionServiceType")}",
426                         "parameters":{
427                             "requestInputs": ${execution.getVariable("e2eInputMap") as JSONObject}
428                         }
429                     }
430                 }
431             """
432             execution.setVariable("CSMF_NSMFRequest", payload.replaceAll("\\s+", ""))
433
434         } catch (BpmnError e) {
435             throw e
436         } catch (Exception ex) {
437             String msg = "Exception in CreateCommunicationService.preRequestSend2NSMF. " + ex.getMessage()
438             logger.error(msg)
439             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
440         }
441
442         logger.debug(Prefix + "preRequestSend2NSMF Exit")
443     }
444
445
446     def processNSMFResponse = { DelegateExecution execution ->
447         logger.debug(Prefix + "processNSMFResponse Start")
448         //oof
449         try {
450             def CSMF_NSMFResponseCode = execution.getVariable("CSMF_NSMFResponseCode") as Integer
451             if (CSMF_NSMFResponseCode >= 200 && CSMF_NSMFResponseCode < 400) {
452                 def CSMF_NSMFResponse = execution.getVariable("CSMF_NSMFResponse") as String
453                 def e2eServiceInstanceId = jsonUtil.getJsonValue(CSMF_NSMFResponse, "service.serviceId")
454                 def e2eOperationId = jsonUtil.getJsonValue(CSMF_NSMFResponse, "service.operationId")
455
456                 execution.setVariable("e2eServiceInstanceId", e2eServiceInstanceId)
457                 execution.setVariable("e2eOperationId", e2eOperationId)
458                 execution.setVariable("ProcessNsmfSuccess", "OK")
459             } else {
460                 execution.setVariable("ProcessNsmfSuccess", "ERROR")
461                 execution.setVariable("operationStatus", "error")
462                 execution.setVariable("operationContent",
463                         "communication service create operation error: nsmf response fail")
464                 execution.setVariable("orchestrationStatus", "error")
465             }
466
467         } catch (BpmnError e) {
468             throw e
469         } catch (Exception ex) {
470             String msg = "Exception in " + Prefix + "processOOFResponse. " + ex.getMessage()
471             logger.info(msg)
472             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
473         }
474         logger.debug(Prefix + "processNSMFResponse Exit")
475     }
476
477
478     /**
479      * create communication service and e2e service relationship
480      *
481      */
482     def createCSAndSSRelationship = { DelegateExecution execution ->
483         logger.debug(Prefix + "createCSAndSSRelationship Start")
484         String msg = ""
485         try {
486             def e2eServiceInstanceId = execution.getVariable("e2eServiceInstanceId")
487             String globalSubscriberId = execution.getVariable("globalSubscriberId")
488             String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
489
490             Relationship relationship = new Relationship()
491             String relatedLink = "aai/v16/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${e2eServiceInstanceId}"
492             relationship.setRelatedLink(relatedLink)
493
494             // create CS and SS relationship in AAI
495             createRelationShipInAAI(execution, relationship)
496
497         } catch (BpmnError e) {
498             throw e
499         } catch (Exception ex) {
500
501             msg = "Exception in DoCreateE2EServiceInstance.createCustomRelationship. " + ex.getMessage()
502             logger.info(msg)
503             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
504         }
505         logger.debug(Prefix + "createCSAndSSRelationship Exit")
506     }
507
508
509     /**
510      * prepare update operation status to 50% after create relationship in aai
511      * @param execution
512      */
513     def prepareUpdateOperationStatus = { DelegateExecution execution ->
514         logger.debug(Prefix + "prepareUpdateOperationStatus Start")
515         // update status creating
516         OperationStatus status = new OperationStatus()
517         status.setServiceId(execution.getVariable("serviceInstanceId") as String)
518         status.setOperationId(execution.getVariable("operationId") as String)
519         status.setOperation("CREATE")
520         status.setResult("processing")
521         status.setProgress("20")
522         status.setOperationContent("communication service create operation processing: waiting nsmf service create finished")
523         status.setUserId(execution.getVariable("globalSubscriberId") as String)
524
525         requestDBUtil.prepareUpdateOperationStatus(execution, status)
526         logger.debug(Prefix + "prepareUpdateOperationStatus Exit")
527     }
528
529
530     /**
531      * create relationship in AAI
532      */
533     private createRelationShipInAAI = { DelegateExecution execution, final Relationship relationship ->
534         logger.debug(Prefix + "createRelationShipInAAI Start")
535         String msg
536         try {
537             String serviceInstanceId = execution.getVariable("serviceInstanceId")
538             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
539                     execution.getVariable("globalSubscriberId"),
540                     execution.getVariable("subscriptionServiceType"),
541                     serviceInstanceId).relationshipAPI()
542             client.create(uri, relationship)
543
544         } catch (BpmnError e) {
545             throw e
546         } catch (Exception ex) {
547             msg = "Exception in CreateCommunicationService.createRelationShipInAAI. " + ex.getMessage()
548             logger.info(msg)
549             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
550         }
551         logger.debug(Prefix + "createRelationShipInAAI Exit")
552
553     }
554
555
556     def prepareCallCheckProcessStatus = { DelegateExecution execution ->
557         logger.debug(Prefix + "prepareCallCheckProcessStatus Start")
558
559         def successConditions = new ArrayList<>()
560         successConditions.add("finished")
561         execution.setVariable("successConditions", successConditions)
562
563         def errorConditions = new ArrayList<>()
564         errorConditions.add("error")
565         execution.setVariable("errorConditions", errorConditions)
566
567         execution.setVariable("processServiceType", "communication service")
568
569         execution.setVariable("subOperationType", "CREATE")
570
571         execution.setVariable("timeOut", 3 * 60 * 60 * 1000)
572
573         def successParamMap = new HashMap<String, Object>()
574         successParamMap.put("orchestrationStatus", "deactivated")
575
576         execution.setVariable("successParamMap", successParamMap)
577
578         def errorParamMap = new HashMap<String, Object>()
579         errorParamMap.put("orchestrationStatus", "error")
580
581         execution.setVariable("errorParamMap", errorParamMap)
582
583         def timeOutParamMap = new HashMap<String, Object>()
584         timeOutParamMap.put("orchestrationStatus", "error")
585
586         execution.setVariable("timeOutParamMap", timeOutParamMap)
587
588         execution.setVariable("initProgress", 20)
589         execution.setVariable("endProgress", 90)
590
591         logger.debug(Prefix + "prepareCallCheckProcessStatus Exit")
592     }
593
594
595     /**
596      * prepare update operation status to complete after NSMF process success
597      * @param execution
598      */
599     def prepareCompleteStatus = { DelegateExecution execution ->
600         logger.debug(Prefix + "prepareCompleteStatus Start")
601         OperationStatus status = new OperationStatus()
602         status.setServiceId(execution.getVariable("serviceInstanceId") as String)
603         status.setOperationId(execution.getVariable("operationId") as String)
604         status.setOperation("CREATE")
605         status.setResult(execution.getVariable("operationStatus") as String)
606         status.setProgress("100")
607         status.setOperationContent(execution.getVariable("operationContent") as String)
608         status.setUserId(execution.getVariable("globalSubscriberId") as String)
609
610         requestDBUtil.prepareUpdateOperationStatus(execution, status)
611         logger.debug("prepareCompleteStatus end, serviceInstanceId: " + execution.getVariable("serviceInstanceId")
612                 + ", operationId: " + execution.getVariable("operationId"))
613         logger.debug(Prefix + "prepareCompleteStatus Exit")
614     }
615
616
617     /**
618      * update NSMF complete status to AAI when the NSMF process finished
619      * @param execution
620      */
621     def updateFinishStatusInAAI = { DelegateExecution execution ->
622         logger.debug(Prefix + "updateFinishStatusInAAI Start")
623         String msg
624         try {
625
626             String serviceInstanceId = execution.getVariable("serviceInstanceId")
627             String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
628             String globalSubscriberId = execution.getVariable("globalSubscriberId")
629             String orchestrationStatus = execution.getVariable("orchestrationStatus")
630             // create service
631             ServiceInstance csi = new ServiceInstance()
632             csi.setOrchestrationStatus(orchestrationStatus)
633             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
634                     globalSubscriberId, subscriptionServiceType, serviceInstanceId)
635             client.update(uri, csi)
636             logger.debug(Prefix + "updateFinishStatusInAAI update communication service status to deactivated")
637
638         } catch (BpmnError e) {
639             throw e
640         } catch (Exception ex) {
641             msg = "Exception in complete communication service " + ex.getMessage()
642             logger.debug(msg)
643             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
644         }
645         logger.debug(Prefix + "updateFinishStatusInAAI Exit")
646     }
647
648
649     public sendSyncError = { DelegateExecution execution ->
650         logger.debug("sendSyncError Start")
651         try {
652             String errorMessage
653             if (execution.getVariable("WorkflowException") instanceof WorkflowException) {
654                 WorkflowException wfe = execution.getVariable("WorkflowException") as WorkflowException
655                 errorMessage = wfe.getErrorMessage()
656             } else {
657                 errorMessage = "Sending Sync Error."
658             }
659
660             String buildWorkflowException =
661                     """<aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1">
662                                         <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage>
663                                         <aetgt:ErrorCode>7000</aetgt:ErrorCode>
664                                    </aetgt:WorkflowException>"""
665
666             logger.debug(buildWorkflowException)
667             sendWorkflowResponse(execution, 500, buildWorkflowException)
668
669         } catch (Exception ex) {
670             logger.debug("Sending Sync Error Activity Failed. " + "\n" + ex.getMessage())
671         }
672         logger.debug(Prefix + "sendSyncError Exit")
673     }
674
675 }