7cc1a559c354a614cb38a9b624b035dd4124746f
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved.
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 com.fasterxml.jackson.databind.ObjectMapper
24 import org.onap.aai.domain.yang.ServiceInstance
25 import org.onap.so.client.HttpClient
26 import org.onap.so.client.HttpClientFactory
27 import org.onap.so.client.aai.AAIObjectType
28 import org.onap.so.client.aai.AAIResourcesClient
29 import org.onap.so.client.aai.entities.uri.AAIResourceUri
30 import org.onap.so.client.aai.entities.uri.AAIUriFactory
31
32 import javax.ws.rs.core.Response
33
34 import static org.apache.commons.lang3.StringUtils.*
35 import org.springframework.web.util.UriUtils
36 import groovy.json.JsonSlurper
37 import org.camunda.bpm.engine.delegate.BpmnError
38 import org.camunda.bpm.engine.delegate.DelegateExecution
39 import org.onap.logging.filter.base.ONAPComponents
40 import org.onap.so.beans.nsmf.SliceTaskParams
41 import org.onap.so.db.request.beans.OrchestrationTask
42 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
43 import org.onap.so.bpmn.common.scripts.ExceptionUtil
44 import org.onap.so.bpmn.common.scripts.OofUtils
45 import org.onap.so.bpmn.core.UrnPropertiesReader
46 import org.onap.so.bpmn.common.scripts.MsoUtils
47 import org.onap.so.bpmn.core.json.JsonUtils
48 import org.onap.so.logger.ErrorCode
49 import org.onap.so.logger.LoggingAnchor
50 import org.onap.so.logger.MessageEnum
51 import org.slf4j.Logger
52 import org.slf4j.LoggerFactory
53
54 public class CreateSliceService extends AbstractServiceTaskProcessor {
55     String Prefix = "CRESS_"
56
57     ExceptionUtil exceptionUtil = new ExceptionUtil()
58     JsonUtils jsonUtil = new JsonUtils()
59     JsonSlurper jsonSlurper = new JsonSlurper()
60     ObjectMapper objectMapper = new ObjectMapper()
61     OofUtils oofUtils = new OofUtils()
62     private static final Logger logger = LoggerFactory.getLogger(CreateSliceService.class)
63
64
65     public void preProcessRequest(DelegateExecution execution) {
66         logger.debug("Start preProcessRequest")
67         execution.setVariable("prefix", Prefix)
68         String msg = ""
69
70         try {
71             String ssRequest = execution.getVariable("bpmnRequest")
72             logger.debug(ssRequest)
73
74             String requestId = execution.getVariable("mso-request-id")
75             execution.setVariable("msoRequestId", requestId)
76             logger.debug("Input Request:" + ssRequest + " reqId:" + requestId)
77
78             String serviceInstanceId = execution.getVariable("serviceInstanceId")
79             if (isBlank(serviceInstanceId)) {
80                 serviceInstanceId = UUID.randomUUID().toString()
81             }
82
83             String operationId = UUID.randomUUID().toString()
84             execution.setVariable("operationId", operationId)
85
86             logger.debug("Generated new Service Instance:" + serviceInstanceId)
87             serviceInstanceId = UriUtils.encode(serviceInstanceId, "UTF-8")
88             execution.setVariable("serviceInstanceId", serviceInstanceId)
89
90             //subscriberInfo
91             String globalSubscriberId = jsonUtil.getJsonValue(ssRequest, "requestDetails.subscriberInfo.globalSubscriberId")
92             if (isBlank(globalSubscriberId)) {
93                 msg = "Input globalSubscriberId' is null"
94                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
95             } else {
96                 execution.setVariable("globalSubscriberId", globalSubscriberId)
97             }
98
99             //requestInfo
100             execution.setVariable("source", jsonUtil.getJsonValue(ssRequest, "requestDetails.requestInfo.source"))
101             execution.setVariable("serviceInstanceName", jsonUtil.getJsonValue(ssRequest, "requestDetails.requestInfo.instanceName"))
102             execution.setVariable("disableRollback", jsonUtil.getJsonValue(ssRequest, "requestDetails.requestInfo.suppressRollback"))
103             String productFamilyId = jsonUtil.getJsonValue(ssRequest, "requestDetails.requestInfo.productFamilyId")
104             if (isBlank(productFamilyId)) {
105                 msg = "Input productFamilyId is null"
106                 logger.debug(msg)
107                 //exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
108             } else {
109                 execution.setVariable("productFamilyId", productFamilyId)
110             }
111
112             //modelInfo
113             String serviceModelInfo = jsonUtil.getJsonValue(ssRequest, "requestDetails.modelInfo")
114             if (isBlank(serviceModelInfo)) {
115                 msg = "Input serviceModelInfo is null"
116                 logger.debug(msg)
117                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
118             } else {
119                 execution.setVariable("serviceModelInfo", serviceModelInfo)
120             }
121
122             logger.debug("modelInfo: " + serviceModelInfo)
123
124             //requestParameters
125             String subscriptionServiceType = jsonUtil.getJsonValue(ssRequest, "requestDetails.requestParameters.subscriptionServiceType")
126             if (isBlank(subscriptionServiceType)) {
127                 msg = "Input subscriptionServiceType is null"
128                 logger.debug(msg)
129                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
130             } else {
131                 execution.setVariable("subscriptionServiceType", subscriptionServiceType)
132             }
133             logger.debug("subscriptionServiceType: " + subscriptionServiceType)
134
135             /*
136             * Extracting User Parameters from incoming Request and converting into a Map
137             */
138             Map reqMap = jsonSlurper.parseText(ssRequest)
139
140             //InputParams
141             def userParamsList = reqMap.requestDetails?.requestParameters?.userParams
142
143             Map<String, String> inputMap = [:]
144             if (userParamsList) {
145                 for (def i = 0; i < userParamsList.size(); i++) {
146                     def userParams1 = userParamsList.get(i)
147                     userParams1.each { param -> inputMap.put(param.key, param.value) }
148                 }
149             }
150
151             logger.debug("User Input Parameters map: " + inputMap.toString())
152             String uuiRequest = inputMap.get("UUIRequest")
153             Map uuiReqMap = jsonSlurper.parseText(uuiRequest)
154             Map<String, Object> serviceObject = (Map<String, Object>) uuiReqMap.get("service")
155             Map<String, Object> parameterObject = (Map<String, Object>) serviceObject.get("parameters")
156             Map<String, Object> requestInputs = (Map<String, Object>) parameterObject.get("requestInputs")
157
158             execution.setVariable("serviceInputParams", inputMap)
159             execution.setVariable("uuiRequest", uuiRequest)
160             execution.setVariable("serviceProfile", requestInputs)
161
162             //TODO
163             //execution.setVariable("serviceInputParams", jsonUtil.getJsonValue(siRequest, "requestDetails.requestParameters.userParams"))
164             //execution.setVariable("failExists", true)
165
166         } catch (BpmnError e) {
167             throw e
168         } catch (Exception ex) {
169             msg = "Exception in preProcessRequest " + ex.getMessage()
170             logger.debug(msg)
171             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
172         }
173         logger.debug("Finish preProcessRequest")
174     }
175
176     public void getNSTSelection(DelegateExecution execution) {
177         logger.debug("Start getNSTSelection")
178         String requestId = execution.getVariable("msoRequestId")
179         Map<String, Object> serviceProfile = execution.getVariable("serviceProfile")
180         String oofUrl = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
181
182         def authHeader = ""
183         String basicAuth = UrnPropertiesReader.getVariable("mso.oof.auth", execution)
184         String msokey = UrnPropertiesReader.getVariable("mso.msoKey", execution)
185
186         String basicAuthValue = utils.encrypt(basicAuth, msokey)
187         if (basicAuthValue != null) {
188             logger.debug( "Obtained BasicAuth username and password for OOF: " + basicAuthValue)
189             try {
190                 authHeader = utils.getBasicAuth(basicAuthValue, msokey)
191                 execution.setVariable("BasicAuthHeaderValue", authHeader)
192             } catch (Exception ex) {
193                 logger.debug( "Unable to encode username and password string: " + ex)
194                 exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - Unable to " +
195                         "encode username and password string")
196             }
197         } else {
198             logger.debug( "Unable to obtain BasicAuth - BasicAuth value null")
199             exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - BasicAuth " +
200                     "value null")
201         }
202
203         URL requestUrl = new URL(oofUrl + "/api/oof/v1/selection/nst")
204         String oofRequest = oofUtils.buildSelectNSTRequest(requestId, serviceProfile)
205         HttpClient httpClient = new HttpClientFactory().newJsonClient(requestUrl, ONAPComponents.OOF)
206         httpClient.addAdditionalHeader("Authorization", authHeader)
207         Response httpResponse = httpClient.post(oofRequest)
208
209         int responseCode = httpResponse.getStatus()
210         logger.debug("OOF sync response code is: " + responseCode)
211
212         if(responseCode != 200){
213             exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from OOF.")
214         }
215
216         Map<String, Object> nstSolution
217         try {
218             Map<String, Object> resMap = httpResponse.readEntity(Map.class)
219             List<Map<String, Object>> nstSolutions = (List<Map<String, Object>>) resMap.get("solutions")
220             nstSolution = nstSolutions.get(0)
221             execution.setVariable("nstSolution", nstSolution)
222         } catch (Exception ex) {
223             logger.debug( "Failed to get NST solution suggested by OOF.")
224             exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Failed to get NST solution suggested by OOF.")
225         }
226
227         logger.debug("Finish getNSTSelection")
228
229     }
230
231     public void prepareDecomposeService(DelegateExecution execution) {
232         logger.debug("Start prepareDecomposeService")
233         String uuiRequest = execution.getVariable("uuiRequest")
234         String ssModelInvariantUuid = jsonUtil.getJsonValue(uuiRequest, "service.serviceInvariantUuid")
235         String ssModelUuid = jsonUtil.getJsonValue(uuiRequest, "service.serviceUuid")
236         String ssServiceModelInfo = """{
237             "modelInvariantUuid":"${ssModelInvariantUuid}",
238             "modelUuid":"${ssModelUuid}",
239             "modelVersion":""
240              }"""
241         execution.setVariable("ssServiceModelInfo", ssServiceModelInfo)
242
243         logger.debug("Finish prepareDecomposeService")
244     }
245
246     public void processDecomposition(DelegateExecution execution) {
247         logger.debug("Start processDecomposition")
248         String uuiRequest = execution.getVariable("uuiRequest")
249         Map<String, Object> serviceProfile = execution.getVariable("serviceProfile")
250         Map<String, Object> nstSolution = execution.getVariable("nstSolution")
251
252         Map uuiReqMap = jsonSlurper.parseText(uuiRequest)
253         Map<String, Object> serviceObject = (Map<String, Object>) uuiReqMap.get("service")
254         String subscriptionServiceType = serviceObject.get("serviceType")
255
256         String serviceType = (String) serviceProfile.get("sST")
257         String resourceSharingLevel = (String) serviceProfile.get("resourceSharingLevel")
258         String nstModelUuid = (String) nstSolution.get("UUID")
259         String nstModelInvariantUuid = (String) nstSolution.get("invariantUUID")
260
261         execution.setVariable("subscriptionServiceType", subscriptionServiceType)
262         execution.setVariable("serviceType", serviceType)
263         execution.setVariable("resourceSharingLevel", resourceSharingLevel)
264         execution.setVariable("nstModelUuid", nstModelUuid)
265         execution.setVariable("nstModelInvariantUuid", nstModelInvariantUuid)
266
267         logger.debug("Finish processDecomposition")
268     }
269
270     public void prepareCreateOrchestrationTask(DelegateExecution execution) {
271         logger.debug("Start createOrchestrationTask")
272         String taskId = execution.getBusinessKey()
273         execution.setVariable("orchestrationTaskId", taskId)
274         logger.debug("BusinessKey: " + taskId)
275         String serviceInstanceId = execution.getVariable("serviceInstanceId")
276         String operationId = execution.getVariable("operationId")
277         String serviceInstanceName = execution.getVariable("serviceInstanceName")
278         String taskName = "SliceServiceTask"
279         String taskStatus = "Planning"
280         String isManual = "false"
281         String requestMethod = "POST"
282         execution.setVariable("CSSOT_taskId", taskId)
283         execution.setVariable("CSSOT_name", taskName)
284         execution.setVariable("CSSOT_status", taskStatus)
285         execution.setVariable("CSSOT_isManual", isManual)
286         execution.setVariable("CSSOT_requestMethod", requestMethod)
287
288         Map<String, Object> serviceProfile = execution.getVariable("serviceProfile")
289         Map<String, Object> sliceProfileTn = execution.getVariable("sliceProfileTn")
290         Map<String, Object> sliceProfileCn = execution.getVariable("sliceProfileCn")
291         Map<String, Object> sliceProfileAn = execution.getVariable("sliceProfileAn")
292
293         SliceTaskParams sliceTaskParams = new SliceTaskParams()
294         sliceTaskParams.setServiceId(serviceInstanceId)
295         sliceTaskParams.setServiceName(serviceInstanceName)
296         sliceTaskParams.setServiceProfile(serviceProfile)
297         sliceTaskParams.setSliceProfileTn(sliceProfileTn)
298         sliceTaskParams.setSliceProfileCn(sliceProfileCn)
299         sliceTaskParams.setSliceProfileAn(sliceProfileAn)
300         execution.setVariable("sliceTaskParams", sliceTaskParams)
301
302         String paramJson = sliceTaskParams.convertToJson()
303         execution.setVariable("CSSOT_paramJson", paramJson)
304         logger.debug("CSSOT_paramJson: " + paramJson)
305
306         logger.debug("Finish createOrchestrationTask")
307     }
308
309     public void prepareUpdateOrchestrationTask(DelegateExecution execution) {
310         logger.debug("Start prepareUpdateOrchestrationTask")
311         String requestMethod = "PUT"
312         String taskStatus = execution.getVariable("taskStatus")
313         SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams")
314         String paramJson = sliceTaskParams.convertToJson()
315         execution.setVariable("CSSOT_status", taskStatus)
316         execution.setVariable("CSSOT_paramJson", paramJson)
317         execution.setVariable("CSSOT_requestMethod", requestMethod)
318         logger.debug("Finish prepareUpdateOrchestrationTask")
319     }
320
321     public void prepareGetUserOptions(DelegateExecution execution) {
322         logger.debug("Start prepareGetUserOptions")
323         String requestMethod = "GET"
324         execution.setVariable("taskAction", "commit")
325         String taskAction = execution.getVariable("taskAction")
326         logger.debug("task action is: " + taskAction)
327         if (!"commit".equals(taskAction) && !"abort".equals(taskAction)) {
328             String msg = "Unknown task action: " + taskAction
329             logger.debug(msg)
330             exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
331         }
332         execution.setVariable("CSSOT_requestMethod", requestMethod)
333         logger.debug("Finish prepareGetUserOptions")
334     }
335
336     public void processUserOptions(DelegateExecution execution) {
337         logger.debug("Start processUserOptions")
338         String response = execution.getVariable("CSSOT_dbResponse")
339         OrchestrationTask orchestrationTask = objectMapper.readValue(response, OrchestrationTask.class)
340         String paramJson = orchestrationTask.getParams()
341         logger.debug("paramJson: " + paramJson)
342         SliceTaskParams sliceTaskParams = new SliceTaskParams()
343         sliceTaskParams.convertFromJson(paramJson)
344         execution.setVariable("sliceTaskParams", sliceTaskParams)
345         logger.debug("Finish processUserOptions")
346     }
347
348     public void updateAAIOrchStatus(DelegateExecution execution) {
349         logger.debug("Start updateAAIOrchStatus")
350         String serviceInstanceId = execution.getVariable("serviceInstanceId")
351         String orchStatus = execution.getVariable("orchestrationStatus")
352
353         try {
354             ServiceInstance si = execution.getVariable("serviceInstanceData")
355             si.setOrchestrationStatus(orchStatus)
356             AAIResourcesClient client = new AAIResourcesClient()
357             AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId)
358             client.update(uri, si)
359         } catch (BpmnError e) {
360             throw e
361         } catch (Exception ex) {
362             String msg = "Exception in CreateSliceService.updateAAIOrchStatus " + ex.getMessage()
363             logger.info(msg)
364             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
365         }
366
367         logger.debug("Finish updateAAIOrchStatus")
368     }
369
370     public void prepareInitServiceOperationStatus(DelegateExecution execution) {
371         logger.debug("Start prepareInitServiceOperationStatus")
372         try{
373             String serviceId = execution.getVariable("serviceInstanceId")
374             String operationId = execution.getVariable("operationId")
375             String operationType = "CREATE"
376             String userId = execution.getVariable("globalSubscriberId")
377             String result = "processing"
378             String progress = "0"
379             String reason = ""
380             String operationContent = "Prepare service creation"
381             logger.debug("Generated new operation for Service Instance serviceId:" + serviceId + " operationId:" + operationId)
382             serviceId = UriUtils.encode(serviceId,"UTF-8")
383             execution.setVariable("serviceInstanceId", serviceId)
384             execution.setVariable("operationType", operationType)
385
386             def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint",execution)
387             execution.setVariable("CSSOS_dbAdapterEndpoint", dbAdapterEndpoint)
388             logger.debug("DB Adapter Endpoint is: " + dbAdapterEndpoint)
389             def dbAdapterAuth = UrnPropertiesReader.getVariable("mso.requestDb.auth")
390             Map<String, String> CSSOS_headerMap = [:]
391             CSSOS_headerMap.put("content-type", "application/soap+xml")
392             CSSOS_headerMap.put("Authorization", dbAdapterAuth)
393             execution.setVariable("CSSOS_headerMap", CSSOS_headerMap)
394             logger.debug("DB Adapter Header is: " + CSSOS_headerMap)
395
396             String payload =
397                     """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
398                         xmlns:ns="http://org.onap.so/requestsdb">
399                         <soapenv:Header/>
400                         <soapenv:Body>
401                             <ns:initServiceOperationStatus xmlns:ns="http://org.onap.so/requestsdb">
402                             <serviceId>${MsoUtils.xmlEscape(serviceId)}</serviceId>
403                             <operationId>${MsoUtils.xmlEscape(operationId)}</operationId>
404                             <operationType>${MsoUtils.xmlEscape(operationType)}</operationType>
405                             <userId>${MsoUtils.xmlEscape(userId)}</userId>
406                             <result>${MsoUtils.xmlEscape(result)}</result>
407                             <operationContent>${MsoUtils.xmlEscape(operationContent)}</operationContent>
408                             <progress>${MsoUtils.xmlEscape(progress)}</progress>
409                             <reason>${MsoUtils.xmlEscape(reason)}</reason>
410                         </ns:initServiceOperationStatus>
411                     </soapenv:Body>
412                 </soapenv:Envelope>"""
413
414             payload = utils.formatXml(payload)
415             execution.setVariable("CSSOS_updateServiceOperStatusRequest", payload)
416             logger.debug("Outgoing updateServiceOperStatusRequest: \n" + payload)
417         }catch(Exception e){
418             logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
419                     "Exception Occured Processing prepareInitServiceOperationStatus.", "BPMN",
420                     ErrorCode.UnknownError.getValue(), "Exception is:\n" + e)
421         }
422         logger.debug("Finish prepareInitServiceOperationStatus")
423     }
424
425     public void prepareUpdateServiceOperationStatus(DelegateExecution execution) {
426         logger.debug("Start preUpdateServiceOperationStatus")
427         try{
428             String serviceId = execution.getVariable("serviceInstanceId")
429             String operationId = execution.getVariable("operationId")
430             String operationType = execution.getVariable("operationType")
431             String userId = execution.getVariable("globalSubscriberId")
432             String result = execution.getVariable("operationResult")
433             String progress = execution.getVariable("operationProgress")
434             String reason = execution.getVariable("operationReason")
435             String operationContent = "service: " + result + " progress: " + progress
436
437             String payload =
438                     """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
439                         xmlns:ns="http://org.onap.so/requestsdb">
440                         <soapenv:Header/>
441                         <soapenv:Body>
442                             <ns:initServiceOperationStatus xmlns:ns="http://org.onap.so/requestsdb">
443                             <serviceId>${MsoUtils.xmlEscape(serviceId)}</serviceId>
444                             <operationId>${MsoUtils.xmlEscape(operationId)}</operationId>
445                             <operationType>${MsoUtils.xmlEscape(operationType)}</operationType>
446                             <userId>${MsoUtils.xmlEscape(userId)}</userId>
447                             <result>${MsoUtils.xmlEscape(result)}</result>
448                             <operationContent>${MsoUtils.xmlEscape(operationContent)}</operationContent>
449                             <progress>${MsoUtils.xmlEscape(progress)}</progress>
450                             <reason>${MsoUtils.xmlEscape(reason)}</reason>
451                         </ns:initServiceOperationStatus>
452                     </soapenv:Body>
453                 </soapenv:Envelope>"""
454
455             payload = utils.formatXml(payload)
456             execution.setVariable("CSSOS_updateServiceOperStatusRequest", payload)
457             logger.debug("Outgoing updateServiceOperStatusRequest: \n" + payload)
458
459         }catch(Exception e){
460             logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(),
461                     "Exception Occured Processing preUpdateServiceOperationStatus.", "BPMN",
462                     ErrorCode.UnknownError.getValue(), "Exception is:\n" + e.getMessage())
463         }
464         logger.debug("Finish preUpdateServiceOperationStatus")
465     }
466
467     public void sendSyncResponse(DelegateExecution execution) {
468         logger.debug("Start sendSyncResponse")
469         try {
470             String operationId = execution.getVariable("operationId")
471             String serviceInstanceId = execution.getVariable("serviceInstanceId")
472             // RESTResponse for API Handler (APIH) Reply Task
473             String createServiceRestRequest = """{"service":{"serviceId":"${serviceInstanceId}","operationId":"${operationId}"}}""".trim()
474             logger.debug("sendSyncResponse to APIH:" + "\n" + createServiceRestRequest)
475             sendWorkflowResponse(execution, 202, createServiceRestRequest)
476             execution.setVariable("sentSyncResponse", true)
477         } catch (Exception e) {
478             String msg = "Exceptuion in sendSyncResponse:" + e.getMessage()
479             logger.debug(msg)
480             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
481         }
482         logger.debug("Finish sendSyncResponse")
483     }
484
485     public void prepareCompletionRequest (DelegateExecution execution) {
486         logger.trace("Start prepareCompletionRequest")
487         try {
488             String requestId = execution.getVariable("msoRequestId")
489             String serviceInstanceId = execution.getVariable("serviceInstanceId")
490             String source = execution.getVariable("source")
491
492             String msoCompletionRequest =
493                     """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
494                                 xmlns:ns="http://org.onap/so/request/types/v1">
495                         <request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
496                             <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
497                             <action>CREATE</action>
498                             <source>${MsoUtils.xmlEscape(source)}</source>
499                         </request-info>
500                         <status-message>Service Instance was created successfully.</status-message>
501                         <serviceInstanceId>${MsoUtils.xmlEscape(serviceInstanceId)}</serviceInstanceId>
502                         <mso-bpel-name>CreateGenericALaCarteServiceInstance</mso-bpel-name>
503                     </aetgt:MsoCompletionRequest>"""
504
505             // Format Response
506             String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
507
508             execution.setVariable("completionRequest", xmlMsoCompletionRequest)
509             logger.debug("Overall SUCCESS Response going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest)
510
511         } catch (Exception ex) {
512             String msg = " Exception in prepareCompletion:" + ex.getMessage()
513             logger.debug(msg)
514             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
515         }
516         logger.trace("Finish prepareCompletionRequest")
517     }
518
519 }
520