Fix DeleteE2EServiceInstance flow
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoDeleteE2EServiceInstance.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - 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 package org.onap.so.bpmn.infrastructure.scripts
23
24 import groovy.json.JsonOutput
25 import groovy.json.JsonSlurper
26 import org.apache.commons.lang3.StringUtils
27 import org.camunda.bpm.engine.delegate.BpmnError
28 import org.camunda.bpm.engine.delegate.DelegateExecution
29 import org.json.JSONArray
30 import org.json.JSONObject
31 import org.onap.aai.domain.yang.RelatedToProperty
32 import org.onap.aai.domain.yang.Relationship
33 import org.onap.aai.domain.yang.RelationshipData
34 import org.onap.aai.domain.yang.ServiceInstance
35 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
36 import org.onap.so.bpmn.common.scripts.ExceptionUtil
37 import org.onap.so.bpmn.common.scripts.MsoUtils
38 import org.onap.so.bpmn.core.UrnPropertiesReader
39 import org.onap.so.bpmn.core.WorkflowException
40 import org.onap.so.bpmn.core.domain.Resource
41 import org.onap.so.bpmn.core.domain.ServiceDecomposition
42 import org.onap.so.bpmn.core.json.JsonUtils
43 import org.onap.so.client.HttpClient
44 import org.onap.so.client.HttpClientFactory
45 import org.onap.so.client.aai.AAIObjectType
46 import org.onap.so.client.aai.AAIResourcesClient
47 import org.onap.so.client.aai.entities.AAIResultWrapper
48 import org.onap.so.client.aai.entities.uri.AAIResourceUri
49 import org.onap.so.client.aai.entities.uri.AAIUriFactory
50 import org.slf4j.Logger
51 import org.slf4j.LoggerFactory
52 import org.onap.so.utils.TargetEntity
53 import org.springframework.web.util.UriUtils
54 import org.w3c.dom.Document
55 import org.w3c.dom.Node
56 import org.xml.sax.InputSource
57
58 import javax.ws.rs.NotFoundException
59 import javax.ws.rs.core.Response
60 import javax.xml.parsers.DocumentBuilder
61 import javax.xml.parsers.DocumentBuilderFactory
62
63 import static org.apache.commons.lang3.StringUtils.isBlank
64
65 /**
66  * This groovy class supports the <class>DoDeleteE2EServiceInstance.bpmn</class> process.
67  *
68  * Inputs:
69  * @param - msoRequestId
70  * @param - globalSubscriberId - O
71  * @param - subscriptionServiceType - O
72  * @param - serviceInstanceId
73  * @param - serviceInstanceName - O
74  * @param - serviceInputParams (should contain aic_zone for serviceTypes TRANSPORT,ATM)
75  * @param - sdncVersion
76  * @param - failNotFound - TODO
77  * @param - serviceInputParams - TODO
78  *
79  * @param - delResourceList
80  * @param - serviceRelationShip
81  *
82  * Outputs:
83  * @param - WorkflowException
84  *
85  * Rollback - Deferred
86  */
87 public class DoDeleteE2EServiceInstance extends AbstractServiceTaskProcessor {
88
89         String Prefix="DDEESI_"
90     ExceptionUtil exceptionUtil = new ExceptionUtil()
91     JsonUtils jsonUtil = new JsonUtils()
92     private static final Logger logger = LoggerFactory.getLogger( DoDeleteE2EServiceInstance.class);
93
94
95     public void preProcessRequest (DelegateExecution execution) {
96         logger.debug(" ***** preProcessRequest *****")
97         String msg = ""
98
99         try {
100             String requestId = execution.getVariable("msoRequestId")
101             execution.setVariable("prefix",Prefix)
102
103             //Inputs
104             //requestDetails.subscriberInfo. for AAI GET & PUT & SDNC assignToplology
105             String globalSubscriberId = execution.getVariable("globalSubscriberId") //globalCustomerId
106             if (globalSubscriberId == null)
107             {
108                 execution.setVariable("globalSubscriberId", "")
109             }
110
111             //requestDetails.requestParameters. for AAI PUT & SDNC assignTopology
112             String serviceType = execution.getVariable("serviceType")
113             if (serviceType == null)
114             {
115                 execution.setVariable("serviceType", "")
116             }
117
118             //Generated in parent for AAI PUT
119             String serviceInstanceId = execution.getVariable("serviceInstanceId")
120             if (isBlank(serviceInstanceId)){
121                 msg = "Input serviceInstanceId is null"
122                 logger.info(msg)
123                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
124             }
125
126             String sdncCallbackUrl = UrnPropertiesReader.getVariable('mso.workflow.sdncadapter.callback', execution)
127             if (isBlank(sdncCallbackUrl)) {
128                 msg = "URN_mso_workflow_sdncadapter_callback is null"
129                 logger.info(msg)
130                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
131             }
132             execution.setVariable("sdncCallbackUrl", sdncCallbackUrl)
133             logger.info("SDNC Callback URL: " + sdncCallbackUrl)
134
135             StringBuilder sbParams = new StringBuilder()
136             Map<String, String> paramsMap = execution.getVariable("serviceInputParams")
137
138             if (paramsMap != null) {
139                 sbParams.append("<service-input-parameters>")
140                 for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
141                     String paramsXml
142                     String paramName = entry.getKey()
143                     String paramValue = entry.getValue()
144                     paramsXml =
145                             """ <param>
146                                                         <name>${MsoUtils.xmlEscape(paramName)}</name>
147                                                         <value>${MsoUtils.xmlEscape(paramValue)}</value>
148                                                         </param>
149                                                         """
150                     sbParams.append(paramsXml)
151                 }
152                 sbParams.append("</service-input-parameters>")
153             }
154             String siParamsXml = sbParams.toString()
155             if (siParamsXml == null)
156                 siParamsXml = ""
157             execution.setVariable("siParamsXml", siParamsXml)
158
159         } catch (BpmnError e) {
160             throw e;
161         } catch (Exception ex){
162             msg = "Exception in preProcessRequest " + ex.getMessage()
163             logger.error(msg)
164             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
165         }
166         logger.debug("***** Exit preProcessRequest *****")
167     }
168
169     public void postProcessAAIGET(DelegateExecution execution) {
170         logger.debug(" ***** postProcessAAIGET ***** ")
171         String msg = ""
172
173         try {
174
175             String serviceInstanceId = execution.getVariable('serviceInstanceId')
176             String globalSubscriberId = execution.getVariable('globalSubscriberId')
177             String serviceType = execution.getVariable('serviceType')
178
179
180             AAIResourcesClient resourceClient = new AAIResourcesClient()
181             AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, globalSubscriberId, serviceType, serviceInstanceId)
182
183             if (!resourceClient.exists(serviceInstanceUri)) {
184                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai")
185             }
186
187             AAIResultWrapper wrapper = resourceClient.get(serviceInstanceUri, NotFoundException.class)
188
189             Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
190
191             // found in AAI
192             if (si.isPresent() && StringUtils.isNotEmpty(si.get().getServiceInstanceName())) {
193                 logger.debug("Found Service-instance in AAI")
194                 execution.setVariable("serviceInstanceName", si.get().getServiceInstanceName())
195                 // get model invariant id
196                 // Get Template uuid and version
197                 if ((null != si.get().getModelInvariantId()) && (null != si.get().getModelVersionId())) {
198                     logger.debug("SI Data model-invariant-id and model-version-id exist")
199
200                     // Set Original Template info
201                     execution.setVariable("model-invariant-id-original", si.get().getModelInvariantId())
202                     execution.setVariable("model-version-id-original", si.get().getModelVersionId())
203                 }
204
205                 if ((null != si.get().getRelationshipList()) && (null != si.get().getRelationshipList().getRelationship())) {
206                     logger.debug("SI Data relationship-list exists")
207                     List<Relationship> relationshipList = si.get().getRelationshipList().getRelationship()
208                     JSONArray jArray = new JSONArray()
209                     for (Relationship relationship : relationshipList) {
210                         def jObj = getRelationShipData(relationship)
211                         jArray.put(jObj)
212                     }
213
214                     execution.setVariable("serviceRelationShip", jArray.toString())
215                 }
216
217             } else {
218
219                 msg = "Service-instance: " + serviceInstanceId + " NOT found in AAI."
220                 logger.error(msg)
221                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg)
222             }
223         } catch (BpmnError e) {
224             throw e
225         } catch (NotFoundException e) {
226             logger.debug("Service Instance does not exist AAI")
227             exceptionUtil.buildAndThrowWorkflowException(execution, 404, "Service Instance was not found in aai")
228         } catch (Exception ex) {
229             msg = "Exception in DoDeleteE2EServiceInstance.postProcessAAIGET. " + ex.getMessage()
230             logger.debug(msg)
231             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
232         }
233         logger.debug(" *** Exit postProcessAAIGET *** ")
234     }
235
236     private JSONObject getRelationShipData(Relationship relationship) {
237         JSONObject jObj = new JSONObject()
238
239
240         def rt = relationship.getRelatedTo()
241
242         def rl = relationship.getRelatedLink()
243         logger.debug("ServiceInstance Related NS/Configuration :" + rl)
244
245         List<RelationshipData> rl_datas = relationship.getRelationshipData()
246         for (RelationshipData rl_data : rl_datas) {
247             def eKey = rl_data.getRelationshipKey()
248             def eValue = rl_data.getRelationshipValue()
249
250             if ((rt.equals("service-instance") && eKey.equals("service-instance.service-instance-id"))
251                     //for overlay/underlay
252                     || (rt.equals("configuration") && eKey.equals("configuration.configuration-id")
253             )) {
254                 jObj.put("resourceInstanceId", eValue)
255             }
256             // for sp-partner and others
257             else if (eKey.endsWith("-id")) {
258                 jObj.put("resourceInstanceId", eValue)
259                 String resourceName = rt + eValue;
260                 jObj.put("resourceType", resourceName)
261             }
262
263             jObj.put("resourceLinkUrl", rl)
264         }
265
266         List<RelatedToProperty> rl_props = relationship.getRelatedToProperty()
267         for (RelatedToProperty rl_prop : rl_props) {
268             def eKey = rl_prop.getPropertyKey()
269             def eValue = rl_prop.getPropertyValue()
270             if ((rt.equals("service-instance") && eKey.equals("service-instance.service-instance-name"))
271                     //for overlay/underlay
272                     || (rt.equals("configuration") && eKey.equals("configuration.configuration-type"))) {
273                 jObj.put("resourceType", eValue)
274             }
275         }
276
277         logger.debug("Relationship related to Resource:" + jObj.toString())
278         return jObj
279     }
280
281    public void getCurrentNS(DelegateExecution execution){
282        logger.info( "======== Start getCurrentNS Process ======== ")
283
284        def currentIndex = execution.getVariable("currentNSIndex")
285        List<String> nsSequence = execution.getVariable("nsSequence")
286        String nsResourceType =  nsSequence.get(currentIndex)
287
288        // GET AAI by Name, not ID, for process convenient
289        execution.setVariable("GENGS_type", "service-instance")
290        execution.setVariable("GENGS_serviceInstanceId", "")
291        execution.setVariable("GENGS_serviceInstanceName", nsResourceType)
292
293        logger.debug("======== COMPLETED getCurrentNS Process ======== ")
294    }
295
296     public void prepareDecomposeService(DelegateExecution execution) {
297         try {
298             logger.debug(" ***** Inside prepareDecomposeService of create generic e2e service ***** ")
299             String modelInvariantUuid = execution.getVariable("model-invariant-id-original")
300             String modelVersionId = execution.getVariable("model-version-id-original")
301
302             String serviceModelInfo = """{
303             "modelInvariantUuid":"${modelInvariantUuid}",
304             "modelUuid":"${modelVersionId}",
305             "modelVersion":""
306              }"""
307             execution.setVariable("serviceModelInfo", serviceModelInfo)
308
309             logger.debug(" ***** Completed prepareDecomposeService of  create generic e2e service ***** ")
310         } catch (Exception ex) {
311             // try error in method block
312             String exceptionMessage = "Bpmn error encountered in  create generic e2e service flow. Unexpected Error from method prepareDecomposeService() - " + ex.getMessage()
313             logger.error(exceptionMessage)
314             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
315         }
316     }
317
318         private void generateRelatedResourceInfo(String response, JSONObject jObj){
319
320                 def xml = new XmlSlurper().parseText(response)
321                 def rtn = xml.childNodes()
322                 while (rtn.hasNext()) {
323                         groovy.util.slurpersupport.Node node = rtn.next()
324                         def key = node.name()
325                         def value = node.text()
326                         jObj.put(key, value)
327                 }
328         }
329
330         private JSONObject getRelatedResourceInAAI (DelegateExecution execution, JSONObject jObj)
331         {
332                 logger.debug(" ***** Started getRelatedResourceInAAI *****")
333
334         String aai_endpoint = UrnPropertiesReader.getVariable("aai.endpoint", execution)
335                 String urlLink = jObj.get("resourceLinkUrl")
336                 String serviceAaiPath = "${aai_endpoint}${urlLink}"
337
338                 URL url = new URL(serviceAaiPath)
339                 HttpClient client = new HttpClientFactory().newXmlClient(url, TargetEntity.AAI)
340
341
342                 Response response = client.get()
343                 int responseCode = response.getStatus()
344                 execution.setVariable(Prefix + "GeRelatedResourceResponseCode", responseCode)
345                 logger.debug("  Get RelatedResource code is: " + responseCode)
346
347                 String aaiResponse = response.readEntity(String.class)
348                 execution.setVariable(Prefix + "GetRelatedResourceResponse", aaiResponse)
349
350                 //Process Response
351                 if(responseCode == 200 || responseCode == 201 || responseCode == 202 )
352                         //200 OK 201 CREATED 202 ACCEPTED
353                 {
354                         logger.debug("GET RelatedResource Received a Good Response")
355                         execution.setVariable(Prefix + "SuccessIndicator", true)
356                         execution.setVariable(Prefix + "FoundIndicator", true)
357
358                         generateRelatedResourceInfo(aaiResponse, jObj)
359
360                         //get model-invariant-uuid and model-uuid
361                         String modelInvariantId = ""
362                         String modelUuid = ""
363                         String modelCustomizationId = ""
364                         if(jObj.has("model-invariant-id")) {
365                                 modelInvariantId = jObj.get("model-invariant-id")
366                                 modelUuid = jObj.get("model-version-id")
367                                 modelCustomizationId = jObj.get("model-customization-id")
368                         }
369
370                         jObj.put("modelInvariantId", modelInvariantId)
371                         jObj.put("modelVersionId", modelUuid)
372                         jObj.put("modelCustomizationId", modelCustomizationId)
373                 }
374                 else {
375             String exceptionMessage = "Get RelatedResource Received a Bad Response Code. Response Code is: " + responseCode
376                         logger.error(exceptionMessage)
377             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
378         }
379
380                 logger.debug(" ***** Exit getRelatedResourceInAAI *****")
381                 return jObj
382         }
383
384     public void postDecomposeService(DelegateExecution execution) {
385         logger.debug(" ***** Inside postDecomposeService() of  delete generic e2e service flow ***** ")
386         try {
387             ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
388
389             // service model info
390             execution.setVariable("serviceModelInfo", serviceDecomposition.getModelInfo())
391
392             List<Resource> deleteResourceList = serviceDecomposition.getServiceResources()
393             String serviceRelationShip = execution.getVariable("serviceRelationShip")
394             def jsonSlurper = new JsonSlurper()
395             def jsonOutput = new JsonOutput()
396
397             List relationShipList = null
398             if (serviceRelationShip != null) {
399                 relationShipList = jsonSlurper.parseText(serviceRelationShip)
400             }
401
402             List<Resource> deleteRealResourceList = new ArrayList<Resource>()
403
404             //Set the real resource instance id to the decomosed resource list
405             //reset the resource instance id , because in the decompose flow ,its a random one.
406             //match the resource-instance-name and the model name
407             if (relationShipList != null) {
408                 relationShipList.each {
409
410                     JSONObject obj = getRelatedResourceInAAI(execution, (JSONObject)it)
411
412                     for (Resource resource : deleteResourceList) {
413
414                         String modelName = resource.getModelInfo().getModelName()
415
416                         String modelCustomizationUuid = resource.getModelInfo().getModelCustomizationUuid()
417                         if (StringUtils.containsIgnoreCase(obj.get("resourceType"), modelName)) {
418                             resource.setResourceId(obj.get("resourceInstanceId"))
419                             deleteRealResourceList.add(resource)
420                         }
421                         else if (modelCustomizationUuid.equals(obj.get("modelCustomizationId"))) {
422                             resource.setResourceId(obj.get("resourceInstanceId"))
423                             resource.setResourceInstanceName(obj.get("resourceType"))
424                             deleteRealResourceList.add(resource)
425                         }
426                     }
427                 }
428             }
429
430             // only delete real existing resources
431             execution.setVariable("deleteResourceList", deleteRealResourceList)
432
433             boolean isDeleteResourceListValid = false
434             if(deleteRealResourceList.size() > 0) {
435                 isDeleteResourceListValid = true
436             }
437             execution.setVariable("isDeleteResourceListValid", isDeleteResourceListValid)
438
439             logger.debug("delete resource list : " + deleteRealResourceList)
440         } catch (Exception ex) {
441             String exceptionMessage = "Bpmn error encountered in  create generic e2e service flow. processDecomposition() - " + ex.getMessage()
442             logger.error(exceptionMessage)
443             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
444         }
445         logger.debug( " ***** exit postDecomposeService() of  delete generic e2e service flow ***** ")
446     }
447
448     public void preInitResourcesOperStatus(DelegateExecution execution){
449         logger.debug(" ======== STARTED preInitResourcesOperStatus Process ======== ")
450         try{
451             String serviceId = execution.getVariable("serviceInstanceId")
452             String operationId = execution.getVariable("operationId")
453             String operationType = execution.getVariable("operationType")
454             String resourceTemplateUUIDs = ""
455             String result = "processing"
456             String progress = "0"
457             String reason = ""
458             String operationContent = "Prepare service creation"
459             logger.debug("Generated new operation for Service Instance serviceId:" + serviceId + " operationId:" + operationId + " operationType:" + operationType)
460             serviceId = UriUtils.encode(serviceId,"UTF-8")
461             execution.setVariable("serviceInstanceId", serviceId)
462             execution.setVariable("operationId", operationId)
463             execution.setVariable("operationType", operationType)
464             List<Resource> deleteResourceList = execution.getVariable("deleteResourceList")
465
466             String serviceRelationShip = execution.getVariable("serviceRelationShip")
467             for(Resource resource : deleteResourceList){
468                     resourceTemplateUUIDs  = resourceTemplateUUIDs + resource.getModelInfo().getModelCustomizationUuid() + ":"
469             }
470
471             def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
472             execution.setVariable("URN_mso_adapters_openecomp_db_endpoint", dbAdapterEndpoint)
473
474             String payload =
475                     """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
476                         xmlns:ns="http://org.onap.so/requestsdb">
477                         <soapenv:Header/>
478                         <soapenv:Body>
479                             <ns:initResourceOperationStatus xmlns:ns="http://org.onap.so/requestsdb">
480                             <serviceId>${MsoUtils.xmlEscape(serviceId)}</serviceId>
481                             <operationId>${MsoUtils.xmlEscape(operationId)}</operationId>
482                             <operationType>${MsoUtils.xmlEscape(operationType)}</operationType>
483                             <resourceTemplateUUIDs>${MsoUtils.xmlEscape(resourceTemplateUUIDs)}</resourceTemplateUUIDs>
484                         </ns:initResourceOperationStatus>
485                     </soapenv:Body>
486                 </soapenv:Envelope>"""
487
488             payload = utils.formatXml(payload)
489             execution.setVariable("CVFMI_initResOperStatusRequest", payload)
490             logger.debug("Outgoing initResourceOperationStatus: \n" + payload)
491             logger.debug("CreateVfModuleInfra Outgoing initResourceOperationStatus Request: " + payload)
492
493         }catch(Exception e){
494             logger.debug("Exception Occured Processing preInitResourcesOperStatus. Exception is:\n" + e)
495             execution.setVariable("CVFMI_ErrorResponse", "Error Occurred during preInitResourcesOperStatus Method:\n" + e.getMessage())
496         }
497         logger.debug("======== COMPLETED preInitResourcesOperStatus Process ======== ")
498     }
499
500     public void prepareUpdateServiceOperationStatus(DelegateExecution execution){
501         logger.debug(" ======== STARTED prepareUpdateServiceOperationStatus Process ======== ")
502         try{
503             String serviceId = execution.getVariable("serviceInstanceId")
504             String operationId = execution.getVariable("operationId")
505             String userId = ""
506             String result = execution.getVariable("result")
507             String progress = execution.getVariable("progress")
508             String reason = ""
509             String operationContent = execution.getVariable("operationContent")
510
511             serviceId = UriUtils.encode(serviceId,"UTF-8")
512
513             def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
514             execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
515             logger.debug("DB Adapter Endpoint is: " + dbAdapterEndpoint)
516
517             String payload =
518                     """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
519                         xmlns:ns="http://org.onap.so/requestsdb">
520                         <soapenv:Header/>
521                         <soapenv:Body>
522                             <ns:updateServiceOperationStatus xmlns:ns="http://org.onap.so/requestsdb">
523                             <serviceId>${MsoUtils.xmlEscape(serviceId)}</serviceId>
524                             <operationId>${MsoUtils.xmlEscape(operationId)}</operationId>
525                             <operationType>DELETE</operationType>
526                             <userId>${MsoUtils.xmlEscape(userId)}</userId>
527                             <result>${MsoUtils.xmlEscape(result)}</result>
528                             <operationContent>${MsoUtils.xmlEscape(operationContent)}</operationContent>
529                             <progress>${MsoUtils.xmlEscape(progress)}</progress>
530                             <reason>${MsoUtils.xmlEscape(reason)}</reason>
531                         </ns:updateServiceOperationStatus>
532                     </soapenv:Body>
533                 </soapenv:Envelope>"""
534
535             payload = utils.formatXml(payload)
536             execution.setVariable("CVFMI_updateServiceOperStatusRequest", payload)
537             logger.debug("Outgoing updateServiceOperStatusRequest: \n" + payload)
538
539         }catch(Exception e){
540             logger.error("Exception Occured Processing prepareUpdateServiceOperationStatus. Exception is:\n" + e)
541             execution.setVariable("CVFMI_ErrorResponse", "Error Occurred during prepareUpdateServiceOperationStatus Method:\n" + e.getMessage())
542         }
543         logger.debug("======== COMPLETED prepareUpdateServiceOperationStatus Process ======== ")
544     }
545
546      /**
547       * post config request.
548       */
549      public void postConfigRequest(execution){
550          //to do
551      }
552
553
554 }