2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. 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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
20 package org.onap.so.bpmn.vcpe.scripts
22 import org.camunda.bpm.engine.delegate.BpmnError
23 import org.camunda.bpm.engine.delegate.DelegateExecution
24 import org.onap.so.bpmn.common.scripts.AaiUtil
25 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
26 import org.onap.so.bpmn.common.scripts.CatalogDbUtils
27 import org.onap.so.bpmn.common.scripts.ExceptionUtil
28 import org.onap.so.bpmn.common.scripts.NetworkUtils
29 import org.onap.so.bpmn.common.scripts.VidUtils
30 import org.onap.so.bpmn.core.UrnPropertiesReader
31 import org.onap.so.bpmn.core.WorkflowException
32 import org.onap.so.bpmn.core.json.JsonUtils
33 import org.onap.so.logger.MessageEnum
34 import org.onap.so.logger.MsoLogger
35 import org.onap.so.rest.APIResponse
36 import org.onap.so.client.aai.AAIResourcesClient
37 import org.onap.so.client.aai.AAIObjectType
38 import org.onap.so.client.aai.entities.AAIResultWrapper
39 import org.onap.so.client.aai.entities.Relationships
40 import org.onap.so.client.aai.entities.uri.AAIResourceUri
41 import org.onap.so.client.aai.entities.uri.AAIUriFactory
42 import javax.ws.rs.NotFoundException
43 import org.json.JSONObject
45 import static org.apache.commons.lang3.StringUtils.isBlank
49 * This groovy class supports the <class>DeleteVcpeResCustService.bpmn</class> process.
54 public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor {
55 private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DeleteVcpeResCustService.class);
57 private static final String DebugFlag = "isDebugLogEnabled"
59 String Prefix = "DVRCS_"
60 ExceptionUtil exceptionUtil = new ExceptionUtil()
61 JsonUtils jsonUtil = new JsonUtils()
62 VidUtils vidUtils = new VidUtils()
63 CatalogDbUtils catalogDbUtils = new CatalogDbUtils()
64 NetworkUtils networkUtils = new NetworkUtils()
67 * This method is executed during the preProcessRequest task of the <class>DeleteVcpeResCustService.bpmn</class> process.
70 public InitializeProcessVariables(DelegateExecution execution){
71 /* Initialize all the process variables in this block */
73 execution.setVariable("DeleteVcpeResCustServiceRequest", "")
74 execution.setVariable("msoRequestId", "")
75 execution.setVariable(Prefix+"vnfsDeletedCount", 0)
76 execution.setVariable(Prefix+"vnfsCount", 0)
79 // **************************************************
80 // Pre or Prepare Request Section
81 // **************************************************
83 * This method is executed during the preProcessRequest task of the <class>CreateServiceInstance.bpmn</class> process.
86 public void preProcessRequest (DelegateExecution execution) {
87 def isDebugEnabled=execution.getVariable(DebugFlag)
88 execution.setVariable("prefix",Prefix)
90 msoLogger.trace("Inside preProcessRequest DeleteVcpeResCustService Request ")
93 // initialize flow variables
94 InitializeProcessVariables(execution)
96 // check for incoming json message/input
97 String DeleteVcpeResCustServiceRequest = execution.getVariable("bpmnRequest")
98 msoLogger.debug(DeleteVcpeResCustServiceRequest)
99 execution.setVariable("DeleteVcpeResCustServiceRequest", DeleteVcpeResCustServiceRequest);
100 println 'DeleteVcpeResCustServiceRequest - ' + DeleteVcpeResCustServiceRequest
103 String requestId = execution.getVariable("mso-request-id")
104 execution.setVariable("msoRequestId", requestId)
106 String serviceInstanceId = execution.getVariable("serviceInstanceId")
107 if ((serviceInstanceId == null) || (serviceInstanceId.isEmpty())) {
108 String dataErrorMessage = " Element 'serviceInstanceId' is missing. "
109 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
112 String requestAction = execution.getVariable("requestAction")
113 execution.setVariable("requestAction", requestAction)
115 String source = jsonUtil.getJsonValue(DeleteVcpeResCustServiceRequest, "requestDetails.requestInfo.source")
116 if ((source == null) || (source.isEmpty())) {
119 execution.setVariable("source", source)
121 // extract globalSubscriberId
122 String globalSubscriberId = jsonUtil.getJsonValue(DeleteVcpeResCustServiceRequest, "requestDetails.subscriberInfo.globalSubscriberId")
124 // global-customer-id is optional on Delete
126 execution.setVariable("globalSubscriberId", globalSubscriberId)
127 execution.setVariable("globalCustomerId", globalSubscriberId)
129 String suppressRollback = jsonUtil.getJsonValue(DeleteVcpeResCustServiceRequest, "requestDetails.requestInfo.suppressRollback")
130 execution.setVariable("disableRollback", suppressRollback)
131 msoLogger.debug("Incoming Suppress/Disable Rollback is: " + suppressRollback)
133 String productFamilyId = jsonUtil.getJsonValue(DeleteVcpeResCustServiceRequest, "requestDetails.requestInfo.productFamilyId")
134 execution.setVariable("productFamilyId", productFamilyId)
135 msoLogger.debug("Incoming productFamilyId is: " + productFamilyId)
137 // extract subscriptionServiceType
138 String subscriptionServiceType = jsonUtil.getJsonValue(DeleteVcpeResCustServiceRequest, "requestDetails.requestParameters.subscriptionServiceType")
139 execution.setVariable("subscriptionServiceType", subscriptionServiceType)
140 msoLogger.debug("Incoming subscriptionServiceType is: " + subscriptionServiceType)
142 // extract cloud configuration
143 String cloudConfiguration = jsonUtil.getJsonValue(DeleteVcpeResCustServiceRequest, "requestDetails.cloudConfiguration")
144 execution.setVariable("cloudConfiguration", cloudConfiguration)
145 msoLogger.debug("cloudConfiguration: "+ cloudConfiguration)
146 String lcpCloudRegionId = jsonUtil.getJsonValue(cloudConfiguration, "lcpCloudRegionId")
147 execution.setVariable("lcpCloudRegionId", lcpCloudRegionId)
148 msoLogger.debug("lcpCloudRegionId: "+ lcpCloudRegionId)
149 String cloudOwner = jsonUtil.getJsonValue(cloudConfiguration, "cloudOwner")
150 execution.setVariable("cloudOwner", cloudOwner)
151 msoLogger.debug("cloudOwner: "+ cloudOwner)
152 String tenantId = jsonUtil.getJsonValue(cloudConfiguration, "tenantId")
153 execution.setVariable("tenantId", tenantId)
154 msoLogger.debug("tenantId: "+ tenantId)
156 String sdncVersion = "1707"
157 execution.setVariable("sdncVersion", sdncVersion)
158 msoLogger.debug("sdncVersion: "+ sdncVersion)
160 //For Completion Handler & Fallout Handler
162 """<request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
163 <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
164 <action>DELETE</action>
165 <source>${MsoUtils.xmlEscape(source)}</source>
168 execution.setVariable(Prefix+"requestInfo", requestInfo)
170 msoLogger.trace("Completed preProcessRequest DeleteVcpeResCustServiceRequest Request ")
172 } catch (BpmnError e) {
174 } catch (Exception ex){
175 String exceptionMessage = "Bpmn error encountered in DeleteVcpeResCustService flow. Unexpected from method preProcessRequest() - " + ex.getMessage()
176 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
180 public void sendSyncResponse(DelegateExecution execution) {
181 def isDebugEnabled=execution.getVariable(DebugFlag)
183 msoLogger.trace("Inside sendSyncResponse of DeleteVcpeResCustService ")
186 String serviceInstanceId = execution.getVariable("serviceInstanceId")
187 String requestId = execution.getVariable("mso-request-id")
189 // RESTResponse (for API Handler (APIH) Reply Task)
190 String syncResponse ="""{"requestReferences":{"instanceId":"${serviceInstanceId}","requestId":"${requestId}"}}""".trim()
192 msoLogger.debug(" sendSynchResponse: xmlSyncResponse - " + "\n" + syncResponse)
193 sendWorkflowResponse(execution, 202, syncResponse)
194 } catch (Exception ex) {
195 String exceptionMessage = "Bpmn error encountered in DeleteVcpeResCustService flow. Unexpected from method preProcessRequest() - " + ex.getMessage()
196 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
201 * Gets the service instance and its related resources from aai
205 public void getServiceInstance(DelegateExecution execution) {
207 String serviceInstanceId = execution.getVariable('serviceInstanceId')
209 AAIResourcesClient resourceClient = new AAIResourcesClient()
210 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId)
212 if(resourceClient.exists(uri)){
213 AAIResultWrapper wrapper = resourceClient.get(uri, NotFoundException.class)
214 Optional<Relationships> relationships = wrapper.getRelationships()
216 def (TXC_found, TXC_id) = new Tuple(false, null)
217 def (BRG_found, BRG_id) = new Tuple(false, null)
218 List relatedVnfIdList = []
220 if(relationships.isPresent()){
222 List<AAIResourceUri> vnfUris = relationships.get().getRelatedAAIUris(AAIObjectType.GENERIC_VNF)
223 for(AAIResourceUri u:vnfUris){
224 Map<String, String> keys = u.getURIKeys()
225 String vnfId = keys.get("vnf-id")
226 relatedVnfIdList.add(vnfId)
228 List<AAIResourceUri> arUris = relationships.get().getRelatedAAIUris(AAIObjectType.ALLOTTED_RESOURCE)
229 for(AAIResourceUri u:arUris){
230 String ar = resourceClient.get(u).getJson()
232 def type = jsonUtil.getJsonValue(ar, "type")
233 def id = jsonUtil.getJsonValue(ar, "id")
235 if(type == "TunnelXConn" || type == "Tunnel XConn") {
236 msoLogger.debug("TunnelXConn AR found")
240 }else if(type == "BRG") {
241 msoLogger.debug("BRG AR found")
246 execution.setVariable(Prefix+"TunnelXConn", TXC_found)
247 execution.setVariable("TXC_allottedResourceId", TXC_id)
248 msoLogger.debug("TXC_allottedResourceId: " + TXC_id)
250 execution.setVariable(Prefix+"BRG", BRG_found)
251 execution.setVariable("BRG_allottedResourceId", BRG_id)
252 msoLogger.debug("BRG_allottedResourceId: " + BRG_id)
257 execution.setVariable(Prefix+"vnfsCount", relatedVnfIdList.size())
258 if(relatedVnfIdList.size() > 0) {
259 execution.setVariable(Prefix+"relatedVnfIdList", relatedVnfIdList)
263 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai")
266 }catch(BpmnError e) {
268 }catch(NotFoundException e) {
269 msoLogger.debug("Service Instance does not exist AAI")
270 exceptionUtil.buildAndThrowWorkflowException(execution, 404, "Service Instance was not found in aai")
271 }catch(Exception ex) {
272 String msg = "Internal Error in getServiceInstance: " + ex.getMessage()
274 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
279 // *******************************
281 // *******************************
282 public void prepareVnfAndModulesDelete (DelegateExecution execution) {
283 def isDebugEnabled=execution.getVariable(DebugFlag)
284 msoLogger.trace("Inside prepareVnfAndModulesDelete of DeleteVcpeResCustService ")
287 List vnfList = execution.getVariable(Prefix+"relatedVnfIdList")
288 int vnfsDeletedCount = execution.getVariable(Prefix+"vnfsDeletedCount")
289 String vnfModelInfoString = ""
291 if (vnfList.size() > 0 ) {
292 vnfId = vnfList.get(vnfsDeletedCount.intValue())
295 execution.setVariable("vnfId", vnfId)
296 msoLogger.debug("need to delete vnfId:" + vnfId)
298 msoLogger.trace("Completed prepareVnfAndModulesDelete of DeleteVcpeResCustService ")
299 } catch (Exception ex) {
300 // try error in method block
301 String exceptionMessage = "Bpmn error encountered in DeleteVcpeResCustService flow. Unexpected Error from method prepareVnfAndModulesDelete() - " + ex.getMessage()
302 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
306 // *******************************
307 // Validate Vnf request Section -> increment count
308 // *******************************
309 public void validateVnfDelete (DelegateExecution execution) {
310 def isDebugEnabled=execution.getVariable(DebugFlag)
311 msoLogger.trace("Inside validateVnfDelete of DeleteVcpeResCustService ")
314 int vnfsDeletedCount = execution.getVariable(Prefix+"vnfsDeletedCount")
317 execution.setVariable(Prefix+"vnfsDeletedCount", vnfsDeletedCount)
319 msoLogger.debug(" ***** Completed validateVnfDelete of DeleteVcpeResCustService ***** "+" vnf # "+vnfsDeletedCount)
320 } catch (Exception ex) {
321 // try error in method block
322 String exceptionMessage = "Bpmn error encountered in DeleteVcpeResCustService flow. Unexpected Error from method validateVnfDelete() - " + ex.getMessage()
323 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
328 // *****************************************
329 // Prepare Completion request Section
330 // *****************************************
331 public void postProcessResponse (DelegateExecution execution) {
332 def isDebugEnabled=execution.getVariable(DebugFlag)
333 msoLogger.trace("Inside postProcessResponse of DeleteVcpeResCustService ")
336 String source = execution.getVariable("source")
337 String requestId = execution.getVariable("msoRequestId")
339 String msoCompletionRequest =
340 """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
341 xmlns:ns="http://org.onap/so/request/types/v1">
342 <request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
343 <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
344 <action>DELETE</action>
345 <source>${MsoUtils.xmlEscape(source)}</source>
347 <aetgt:status-message>vCPE Res Cust Service Instance has been deleted successfully.</aetgt:status-message>
348 <aetgt:mso-bpel-name>BPMN Service Instance macro action: DELETE</aetgt:mso-bpel-name>
349 </aetgt:MsoCompletionRequest>"""
352 String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
354 msoLogger.debug(xmlMsoCompletionRequest)
355 execution.setVariable(Prefix+"Success", true)
356 execution.setVariable(Prefix+"CompleteMsoProcessRequest", xmlMsoCompletionRequest)
357 msoLogger.debug(" SUCCESS flow, going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest)
358 } catch (BpmnError e) {
361 } catch (Exception ex) {
362 // try error in method block
363 String exceptionMessage = "Bpmn error encountered in DeleteServiceInstance flow. Unexpected Error from method postProcessResponse() - " + ex.getMessage()
364 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
368 public void prepareFalloutRequest(DelegateExecution execution){
369 def isDebugEnabled=execution.getVariable(DebugFlag)
370 msoLogger.trace("STARTED DeleteVcpeResCustService prepareFalloutRequest Process ")
373 WorkflowException wfex = execution.getVariable("WorkflowException")
374 msoLogger.debug(" Incoming Workflow Exception: " + wfex.toString())
375 String requestInfo = execution.getVariable(Prefix+"requestInfo")
376 msoLogger.debug(" Incoming Request Info: " + requestInfo)
378 String falloutRequest = exceptionUtil.processMainflowsBPMNException(execution, requestInfo)
380 execution.setVariable(Prefix+"falloutRequest", falloutRequest)
381 } catch (Exception ex) {
382 msoLogger.debug("Error Occured in DeleteVcpeResCustService prepareFalloutRequest Process " + ex.getMessage())
383 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in DeleteVcpeResCustService prepareFalloutRequest Process")
385 msoLogger.trace("COMPLETED DeleteVcpeResCustService prepareFalloutRequest Process ")
389 public void sendSyncError (DelegateExecution execution) {
390 def isDebugEnabled=execution.getVariable(DebugFlag)
391 msoLogger.trace("Inside sendSyncError() of DeleteVcpeResCustService ")
394 String errorMessage = ""
395 if (execution.getVariable("WorkflowException") instanceof WorkflowException) {
396 WorkflowException wfe = execution.getVariable("WorkflowException")
397 errorMessage = wfe.getErrorMessage()
399 errorMessage = "Sending Sync Error."
402 String buildworkflowException =
403 """<aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1">
404 <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage>
405 <aetgt:ErrorCode>7000</aetgt:ErrorCode>
406 </aetgt:WorkflowException>"""
408 msoLogger.debug(buildworkflowException)
409 sendWorkflowResponse(execution, 500, buildworkflowException)
410 } catch (Exception ex) {
411 msoLogger.debug(" Sending Sync Error Activity Failed. " + "\n" + ex.getMessage())
415 public void processJavaException(DelegateExecution execution){
416 def isDebugEnabled=execution.getVariable(DebugFlag)
417 execution.setVariable("prefix",Prefix)
419 msoLogger.debug("Caught a Java Exception")
420 msoLogger.debug("Started processJavaException Method")
421 msoLogger.debug("Variables List: " + execution.getVariables())
422 execution.setVariable(Prefix+"unexpectedError", "Caught a Java Lang Exception") // Adding this line temporarily until this flows error handling gets updated
423 exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Caught a Java Lang Exception")
425 msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Rethrowing MSOWorkflowException", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, "");
428 msoLogger.debug("Caught Exception during processJavaException Method: " + e)
429 execution.setVariable(Prefix+"unexpectedError", "Exception in processJavaException method") // Adding this line temporarily until this flows error handling gets updated
430 exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Exception in processJavaException method")
432 msoLogger.debug("Completed processJavaException Method")