New GroupLevel DeleteE2EServiceInstance flow
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DeActivateSDNCNetworkResource.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - SO
4  * ================================================================================
5  * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.bpmn.infrastructure.scripts
24
25 import org.apache.commons.lang3.StringUtils
26 import org.camunda.bpm.engine.delegate.BpmnError
27 import org.camunda.bpm.engine.delegate.DelegateExecution
28 import org.onap.so.bpmn.common.recipe.ResourceInput
29 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
30 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
31 import org.onap.so.bpmn.common.scripts.ExceptionUtil
32 import org.onap.so.bpmn.common.scripts.MsoUtils
33 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
34 import org.onap.so.bpmn.core.domain.ModelInfo
35 import org.onap.so.bpmn.core.json.JsonUtils
36 import org.onap.so.bpmn.core.UrnPropertiesReader
37 import org.slf4j.Logger
38 import org.slf4j.LoggerFactory
39
40 /**
41  * This groovy class supports the <class>ActivateSDNCCNetworkResource.bpmn</class> process.
42  * flow for SDNC Network Resource Activate
43  */
44 public class DeActivateSDNCNetworkResource extends AbstractServiceTaskProcessor {
45     private static final Logger logger = LoggerFactory.getLogger( DeActivateSDNCNetworkResource.class);
46     String Prefix = "DEACTSDNCRES_"
47
48     ExceptionUtil exceptionUtil = new ExceptionUtil()
49
50     JsonUtils jsonUtil = new JsonUtils()
51
52     SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
53     
54     MsoUtils msoUtils = new MsoUtils()
55
56     public void preProcessRequest(DelegateExecution execution) {
57
58         logger.info(" ***** Started preProcessRequest *****")
59
60         try {
61
62             //get bpmn inputs from resource request.
63             String requestId = execution.getVariable("mso-request-id")
64             String requestAction = execution.getVariable("requestAction")
65             String recipeParamsFromRequest = execution.getVariable("recipeParams")
66             String resourceInput = execution.getVariable("resourceInput")
67             //Get ResourceInput Object
68             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
69             execution.setVariable(Prefix + "resourceInput", resourceInputObj)
70
71             //Deal with recipeParams
72             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
73             String resourceModelName = resourceInputObj.getResourceModelInfo().getModelName()
74             //For sdnc requestAction default is "NetworkInstance"
75             String operationType = "Network"
76             if(!StringUtils.isBlank(recipeParamsFromRequest) && "null" != recipeParamsFromRequest){
77                 //the operationType from worflow(first node) is second priority.
78                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
79             }
80             if(!StringUtils.isBlank(recipeParamsFromWf)){
81                 //the operationType from worflow(first node) is highest priority.
82                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
83             }
84             String operationTypeFromConfig = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".operation-type")
85             if (StringUtils.isNotEmpty(operationTypeFromConfig)) {
86                 // highest priority if operation type configured
87                 operationType = operationTypeFromConfig
88             }
89
90             // based on the resource type decide action and operation type
91             String sdnc_svcAction = "deactivate"
92             String sdnc_requestAction = StringUtils.capitalize(sdnc_svcAction) + operationType +"Instance"
93             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
94             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
95             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
96             execution.setVariable("mso-request-id", requestId)
97             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
98         } catch (BpmnError e) {
99             throw e;
100         } catch (Exception ex){
101             msg = "Exception in preProcessRequest " + ex.getMessage()
102             logger.debug(msg)
103             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
104         }
105     }
106
107     public void prepareSDNCRequest(DelegateExecution execution) {
108         logger.info(" ***** Started prepareSDNCRequest *****")
109
110         try {
111             // get variables
112             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
113             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
114             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
115             String deleteNetworkInput = execution.getVariable(Prefix + "networkRequest")
116
117             String hdrRequestId = execution.getVariable("mso-request-id")
118             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
119             String source = execution.getVariable("source")
120             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
121             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
122             String serviceType = resourceInputObj.getServiceType()
123             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
124             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
125             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
126             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
127             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
128             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
129             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
130             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
131             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
132             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
133             String resourceInstnaceId = resourceInputObj.getResourceInstancenUuid()
134             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
135             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
136             String sdncTopologyDeleteRequest = ""
137
138             switch (modelType) {
139                 case "VNF" :
140                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
141                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
142                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
143                                  <sdncadapter:RequestHeader>
144                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
145                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
146                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
147                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
148                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
149                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
150                                  </sdncadapter:RequestHeader>
151                                  <sdncadapterworkflow:SDNCRequestData>
152                                      <request-information>
153                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
154                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
155                                         <source>${msoUtils.xmlEscape(source)}</source>
156                                         <notification-url></notification-url>
157                                         <order-number></order-number>
158                                         <order-version></order-version>
159                                      </request-information>
160                                      <service-information>
161                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
162                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
163                                         <onap-model-information>
164                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
165                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
166                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
167                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
168                                         </onap-model-information>
169                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
170                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
171                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
172                                      </service-information>
173                                      <vnf-information>
174                                         <vnf-id>$resourceInstnaceId</vnf-id>
175                                         <vnf-type></vnf-type>
176                                         <onap-model-information>
177                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
178                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
179                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
180                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
181                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
182                                         </onap-model-information>
183                                      </vnf-information>
184                                      <vnf-request-input>
185                                          <vnf-input-parameters>
186                                          </vnf-input-parameters>
187                                          <request-version></request-version>
188                                          <vnf-name></vnf-name>
189                                          <vnf-networks>
190                                         </vnf-networks>
191                                       </vnf-request-input>
192                                 </sdncadapterworkflow:SDNCRequestData>
193                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
194                     break
195
196                 case "GROUP" :
197                     //When a new resource creation request reaches SO, the parent resources information needs to be provided
198                     //while creating the child resource.
199                     String vnfid = resourceInputObj.getVnfId()
200                     ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
201                     String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
202                     String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
203                     String vnfmodelUuid = vfModelInfo.getModelUuid()
204                     String vnfmodelVersion = vfModelInfo.getModelVersion()
205                     String vnfmodelName = vfModelInfo.getModelName()
206
207                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
208                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
209                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
210                                  <sdncadapter:RequestHeader>
211                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
212                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
213                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
214                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
215                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
216                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
217                                  </sdncadapter:RequestHeader>
218                                  <sdncadapterworkflow:SDNCRequestData>
219                                      <request-information>
220                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
221                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
222                                         <source>${msoUtils.xmlEscape(source)}</source>
223                                         <notification-url></notification-url>
224                                         <order-number></order-number>
225                                         <order-version></order-version>
226                                      </request-information>
227                                      <service-information>
228                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
229                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
230                                         <onap-model-information>
231                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
232                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
233                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
234                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
235                                         </onap-model-information>
236                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
237                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
238                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
239                                      </service-information>
240                                      <vnf-information>
241                                       <vnf-id>$vnfid</vnf-id>
242                                       <vnf-type></vnf-type>
243                                       <onap-model-information>
244                                         <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
245                                         <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
246                                         <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
247                                         <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
248                                         <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
249                                       </onap-model-information>
250                                     </vnf-information>
251                                     <vf-module-information>
252                                       <vf-module-id>$resourceInstnaceId</vf-module-id>
253                                       <vf-module-type></vf-module-type>
254                                       <from-preload>false</from-preload>
255                                       <onap-model-information>
256                                         <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
257                                         <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
258                                         <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
259                                         <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
260                                         <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
261                                       </onap-model-information>
262                                     </vf-module-information>
263                                     <vf-module-request-input>
264                                       <vf-module-input-parameters>
265                                       </vf-module-input-parameters>
266                                     </vf-module-request-input>
267                                 </sdncadapterworkflow:SDNCRequestData>
268                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
269                     break
270
271                 // for SDWANConnectivity and SOTNConnectivity:
272                 default:
273                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
274                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
275                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
276                                  <sdncadapter:RequestHeader>
277                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
278                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
279                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
280                                     <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
281                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
282                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
283                                  </sdncadapter:RequestHeader>
284                                  <sdncadapterworkflow:SDNCRequestData>
285                                      <request-information>
286                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
287                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
288                                         <source>${msoUtils.xmlEscape(source)}</source>
289                                         <notification-url></notification-url>
290                                         <order-number></order-number>
291                                         <order-version></order-version>
292                                      </request-information>
293                                      <service-information>
294                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
295                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
296                                         <onap-model-information>
297                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
298                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
299                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
300                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
301                                         </onap-model-information>
302                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
303                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
304                                      </service-information>
305                                      <network-information>
306                                         <network-id>$resourceInstnaceId</network-id>
307                                         <onap-model-information>
308                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
309                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
310                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
311                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
312                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
313                                         </onap-model-information>
314                                      </network-information>
315                                      <network-request-input>
316                                        <network-input-parameters></network-input-parameters>
317                                      </network-request-input>
318                                 </sdncadapterworkflow:SDNCRequestData>
319                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
320
321             }
322
323             String sdncTopologyDeleteRequesAsString = utils.formatXml(sdncTopologyDeleteRequest)
324             execution.setVariable("sdncAdapterWorkflowRequest", sdncTopologyDeleteRequesAsString)
325             logger.info("sdncAdapterWorkflowRequest - " + "\n" +  sdncTopologyDeleteRequesAsString)
326
327         } catch (Exception ex) {
328             String exceptionMessage = " Bpmn error encountered in DeleteSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
329             logger.debug(exceptionMessage)
330             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
331
332         }
333         logger.info(" ***** Exit prepareSDNCRequest *****")
334     }
335
336     public void prepareUpdateAfterDeActivateSDNCResource(DelegateExecution execution) {
337         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
338         String operType = resourceInputObj.getOperationType()
339         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
340         String serviceInstanceId = resourceInputObj.getServiceInstanceId()
341         String operationId = resourceInputObj.getOperationId()
342         String progress = "50"
343         String status = "deactivated"
344         String statusDescription = "SDCN resource deactivation completed"
345
346         //String operationId = execution.getVariable("operationId")
347
348         String body = """
349                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
350                         xmlns:ns="http://org.onap.so/requestsdb">
351                         <soapenv:Header/>
352                 <soapenv:Body>
353                     <ns:updateResourceOperationStatus>
354                                <operType>${msoUtils.xmlEscape(operType)}</operType>
355                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
356                                <progress>${msoUtils.xmlEscape(progress)}</progress>
357                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
358                                <serviceId>${msoUtils.xmlEscape(serviceInstanceId)}</serviceId>
359                                <status>${msoUtils.xmlEscape(status)}</status>
360                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
361                     </ns:updateResourceOperationStatus>
362                 </soapenv:Body>
363                 </soapenv:Envelope>""";
364
365         setProgressUpdateVariables(execution, body)
366     }
367
368     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
369         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
370         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
371         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
372     }
373
374     public void postDeactivateSDNCCall(DelegateExecution execution) {
375         logger.info(" ***** Started prepareSDNCRequest *****")        
376         String responseCode = execution.getVariable(Prefix + "sdncDeleteReturnCode")
377         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
378
379         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
380         logger.info(" ***** Exit prepareSDNCRequest *****")
381     }
382
383     public void sendSyncResponse(DelegateExecution execution) {
384         logger.debug(" *** sendSyncResponse *** ")
385
386         try {
387             String operationStatus = "finished"
388             // RESTResponse for main flow
389             String resourceOperationResp = """{"operationStatus":"${operationStatus}"}""".trim()
390             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
391             sendWorkflowResponse(execution, 202, resourceOperationResp)
392             execution.setVariable("sentSyncResponse", true)
393
394         } catch (Exception ex) {
395             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
396             logger.debug(msg)
397             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
398         }
399         logger.debug(" ***** Exit sendSyncResponse *****")
400     }
401
402 }