Merge "Heat bridge cron 2.0, changes due to cloud and"
[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 is generated
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.getJsonValue(uuiRequest, "service.parameters.requestInputs.expDataRateDL") as Integer
297             Integer expDataRateUL = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.expDataRateUL") as Integer
298             Integer latency = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.latency") as Integer
299             Integer maxNumberOfUEs = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.maxNumberofUEs") as Integer
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                 key = jsonUtil.getJsonValue(e2eInput, "name")
374                 String type = jsonUtil.getJsonValue(e2eInput, "type")
375                 if (type == "integer") {
376                     def temp
377                     value = csInputMap.containsKey(key) ? csInputMap.getOrDefault(key, 0) : (isBlank(temp = jsonUtil.getJsonValue(e2eInput, "default")) ? 0 : temp)
378
379                     e2eInputMap.put(key, value as Integer)
380                 } else if(type == "string") {
381                     e2eInputMap.put(key, csInputMap.containsKey(key)
382                             ? csInputMap.getOrDefault(key, null) : (jsonUtil.getJsonValue(e2eInput, "default")))
383
384                 }
385             }
386
387             //TODO
388             e2eInputMap.put("sNSSAI", execution.getVariable("sNSSAI_id"))
389                 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())
394
395         } catch (BpmnError e) {
396             throw e
397         } catch (Exception ex) {
398             String msg = "Exception in DoCreateE2EServiceInstance.createRelationShipInAAI. " + ex.getMessage()
399             logger.info(msg)
400             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
401         }
402
403         logger.debug(Prefix + "generateE2EServiceProfile Exit")
404     }
405
406
407     /**
408      * call createE2EService get operation id,
409      * created/processing
410      */
411     def preRequestSend2NSMF(DelegateExecution execution) {
412         logger.debug(Prefix + "preRequestSend2NSMF Start")
413         try {
414
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
420             String payload = """
421                 {
422                     "service":{
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")}",
429                         "parameters":{
430                             "requestInputs": ${execution.getVariable("e2eInputMap") as JSONObject}
431                         }
432                     }
433                 }
434             """
435             execution.setVariable("CSMF_NSMFRequest", payload.replaceAll("\\s+", ""))
436
437         } catch (BpmnError e) {
438             throw e
439         } catch (Exception ex) {
440             String msg = "Exception in CreateCommunicationService.preRequestSend2NSMF. " + ex.getMessage()
441             logger.error(msg)
442             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
443         }
444
445         logger.debug(Prefix + "preRequestSend2NSMF Exit")
446     }
447
448
449     def processNSMFResponse = { DelegateExecution execution ->
450         logger.debug(Prefix + "processNSMFResponse Start")
451         //oof
452         try {
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")
458
459                 execution.setVariable("e2eServiceInstanceId", e2eServiceInstanceId)
460                 execution.setVariable("e2eOperationId", e2eOperationId)
461                 execution.setVariable("ProcessNsmfSuccess", "OK")
462             } else {
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")
468             }
469
470         } catch (BpmnError e) {
471             throw e
472         } catch (Exception ex) {
473             String msg = "Exception in " + Prefix + "processOOFResponse. " + ex.getMessage()
474             logger.info(msg)
475             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
476         }
477         logger.debug(Prefix + "processNSMFResponse Exit")
478     }
479
480
481     /**
482      * create communication service and e2e service relationship
483      *
484      */
485     def createCSAndSSRelationship = { DelegateExecution execution ->
486         logger.debug(Prefix + "createCSAndSSRelationship Start")
487         String msg = ""
488         try {
489             def e2eServiceInstanceId = execution.getVariable("e2eServiceInstanceId")
490             String globalSubscriberId = execution.getVariable("globalSubscriberId")
491             String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
492
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)
496
497             // create CS and SS relationship in AAI
498             createRelationShipInAAI(execution, relationship)
499
500         } catch (BpmnError e) {
501             throw e
502         } catch (Exception ex) {
503
504             msg = "Exception in DoCreateE2EServiceInstance.createCustomRelationship. " + ex.getMessage()
505             logger.info(msg)
506             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
507         }
508         logger.debug(Prefix + "createCSAndSSRelationship Exit")
509     }
510
511
512     /**
513      * prepare update operation status to 50% after create relationship in aai
514      * @param execution
515      */
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)
527
528         requestDBUtil.prepareUpdateOperationStatus(execution, status)
529         logger.debug(Prefix + "prepareUpdateOperationStatus Exit")
530     }
531
532
533     /**
534      * create relationship in AAI
535      */
536     private createRelationShipInAAI = { DelegateExecution execution, final Relationship relationship ->
537         logger.debug(Prefix + "createRelationShipInAAI Start")
538         String msg
539         try {
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)
546
547         } catch (BpmnError e) {
548             throw e
549         } catch (Exception ex) {
550             msg = "Exception in CreateCommunicationService.createRelationShipInAAI. " + ex.getMessage()
551             logger.info(msg)
552             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
553         }
554         logger.debug(Prefix + "createRelationShipInAAI Exit")
555
556     }
557
558
559     def prepareCallCheckProcessStatus = { DelegateExecution execution ->
560         logger.debug(Prefix + "prepareCallCheckProcessStatus Start")
561
562         def successConditions = new ArrayList<>()
563         successConditions.add("finished")
564         execution.setVariable("successConditions", successConditions)
565
566         def errorConditions = new ArrayList<>()
567         errorConditions.add("error")
568         execution.setVariable("errorConditions", errorConditions)
569
570         execution.setVariable("processServiceType", "communication service")
571
572         execution.setVariable("subOperationType", "CREATE")
573
574         execution.setVariable("timeOut", 3 * 60 * 60 * 1000)
575
576         def successParamMap = new HashMap<String, Object>()
577         successParamMap.put("orchestrationStatus", "deactivated")
578
579         execution.setVariable("successParamMap", successParamMap)
580
581         def errorParamMap = new HashMap<String, Object>()
582         errorParamMap.put("orchestrationStatus", "error")
583
584         execution.setVariable("errorParamMap", errorParamMap)
585
586         def timeOutParamMap = new HashMap<String, Object>()
587         timeOutParamMap.put("orchestrationStatus", "error")
588
589         execution.setVariable("timeOutParamMap", timeOutParamMap)
590
591         execution.setVariable("initProgress", 20)
592         execution.setVariable("endProgress", 90)
593
594         logger.debug(Prefix + "prepareCallCheckProcessStatus Exit")
595     }
596
597
598     /**
599      * prepare update operation status to complete after NSMF process success
600      * @param execution
601      */
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)
612
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")
617     }
618
619
620     /**
621      * update NSMF complete status to AAI when the NSMF process finished
622      * @param execution
623      */
624     def updateFinishStatusInAAI = { DelegateExecution execution ->
625         logger.debug(Prefix + "updateFinishStatusInAAI Start")
626         String msg
627         try {
628
629             String serviceInstanceId = execution.getVariable("serviceInstanceId")
630             String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
631             String globalSubscriberId = execution.getVariable("globalSubscriberId")
632             String orchestrationStatus = execution.getVariable("orchestrationStatus")
633             // create service
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")
640
641         } catch (BpmnError e) {
642             throw e
643         } catch (Exception ex) {
644             msg = "Exception in complete communication service " + ex.getMessage()
645             logger.debug(msg)
646             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
647         }
648         logger.debug(Prefix + "updateFinishStatusInAAI Exit")
649     }
650
651
652     public sendSyncError = { DelegateExecution execution ->
653         logger.debug("sendSyncError Start")
654         try {
655             String errorMessage
656             if (execution.getVariable("WorkflowException") instanceof WorkflowException) {
657                 WorkflowException wfe = execution.getVariable("WorkflowException") as WorkflowException
658                 errorMessage = wfe.getErrorMessage()
659             } else {
660                 errorMessage = "Sending Sync Error."
661             }
662
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>"""
668
669             logger.debug(buildWorkflowException)
670             sendWorkflowResponse(execution, 500, buildWorkflowException)
671
672         } catch (Exception ex) {
673             logger.debug("Sending Sync Error Activity Failed. " + "\n" + ex.getMessage())
674         }
675         logger.debug(Prefix + "sendSyncError Exit")
676     }
677
678 }