2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (c) 2019, CMCC Technologies Co., Ltd.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  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=========================================================
 
  21 package org.onap.so.bpmn.infrastructure.scripts
 
  23 import org.camunda.bpm.engine.delegate.BpmnError
 
  24 import org.camunda.bpm.engine.delegate.DelegateExecution
 
  25 import org.onap.aai.domain.yang.ServiceProfile
 
  26 import org.onap.aai.domain.yang.ServiceProfiles
 
  27 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 
  28 import org.onap.so.bpmn.common.scripts.ExceptionUtil
 
  29 import org.onap.so.bpmn.common.scripts.MsoUtils
 
  30 import org.onap.so.bpmn.common.scripts.RequestDBUtil
 
  31 import org.onap.so.bpmn.core.WorkflowException
 
  32 import org.onap.so.bpmn.core.json.JsonUtils
 
  33 import org.onap.so.client.aai.AAIObjectType
 
  34 import org.onap.so.client.aai.AAIResourcesClient
 
  35 import org.onap.so.client.aai.entities.AAIResultWrapper
 
  36 import org.onap.so.client.aai.entities.uri.AAIResourceUri
 
  37 import org.onap.so.client.aai.entities.uri.AAIUriFactory
 
  38 import org.onap.so.db.request.beans.OperationStatus
 
  39 import org.slf4j.Logger
 
  40 import org.slf4j.LoggerFactory
 
  42 import javax.ws.rs.NotFoundException
 
  44 import static org.apache.commons.lang3.StringUtils.isBlank
 
  46 class DeleteSliceService extends AbstractServiceTaskProcessor {
 
  48     private final String PREFIX ="DeleteSliceService"
 
  49     ExceptionUtil exceptionUtil = new ExceptionUtil()
 
  50     JsonUtils jsonUtil = new JsonUtils()
 
  51     private RequestDBUtil requestDBUtil = new RequestDBUtil()
 
  53     private static final Logger LOGGER = LoggerFactory.getLogger( DeleteSliceService.class)
 
  56     void preProcessRequest(DelegateExecution execution) {
 
  57         execution.setVariable("prefix", PREFIX)
 
  60         LOGGER.debug("*****${PREFIX} preProcessRequest *****")
 
  63             // check for incoming json message/input
 
  64             String siRequest = execution.getVariable("bpmnRequest")
 
  65             String requestId = execution.getVariable("mso-request-id")
 
  66             execution.setVariable("msoRequestId", requestId)
 
  68             //e2eslice-service instance id
 
  69             String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
  70             if (isBlank(serviceInstanceId)) {
 
  71                 msg = "e2eslice-service id is null"
 
  72                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
  74             LOGGER.info("Input Request: ${siRequest}, reqId: ${requestId}, e2eslice-service: ${serviceInstanceId}")
 
  77             checkAndSetRequestParam(siRequest,"globalSubscriberId",false, execution)
 
  78             checkAndSetRequestParam(siRequest,"serviceType",false, execution)
 
  79             checkAndSetRequestParam(siRequest,"operationId",false, execution)
 
  81             //prepare init operation status
 
  82             execution.setVariable("progress", "0")
 
  83             execution.setVariable("result", "processing")
 
  84             execution.setVariable("operationType", "DELETE")
 
  85             execution.setVariable("operationContent", "Delete Slice service operation start")
 
  86             updateServiceOperationStatus(execution)
 
  88         } catch (BpmnError e) {
 
  90         } catch (Exception ex) {
 
  91             msg = "Exception in preProcessRequest " + ex.getMessage()
 
  93             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
  95         LOGGER.debug("*****${PREFIX} Exit preProcessRequest *****")
 
  99      * send asynchronous response
 
 102     void sendAsyncResponse(DelegateExecution execution) {
 
 103         LOGGER.trace("${PREFIX} Start sendSyncResponse ")
 
 106             String operationId = execution.getVariable("operationId")
 
 107             String syncResponse = """{"operationId":"${operationId}"}""".trim()
 
 108             LOGGER.info("sendSynchResponse: xmlSyncResponse - " + "\n" + syncResponse)
 
 109             sendWorkflowResponse(execution, 202, syncResponse)
 
 111         } catch (Exception ex) {
 
 112             String msg  = "Exception in sendSyncResponse: " + ex.getMessage()
 
 113             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 115         LOGGER.trace("${PREFIX} Exit sendSyncResponse")
 
 119      * Deletes the slice service instance in aai
 
 121     void deleteSliceServiceInstance(DelegateExecution execution) {
 
 122         LOGGER.trace("${PREFIX} Start deleteSliceServiceInstance")
 
 125             AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("serviceType"), execution.getVariable("serviceInstanceId"))
 
 126             getAAIClient().delete(serviceInstanceUri)
 
 128             execution.setVariable("progress", "100")
 
 129             execution.setVariable("result", "finished")
 
 130             execution.setVariable("operationContent", "NSMF completes slicing service termination.")
 
 131             updateServiceOperationStatus(execution)
 
 133             LOGGER.trace("${PREFIX} Exited deleteSliceServiceInstance")
 
 135             LOGGER.debug("Error occured within deleteSliceServiceInstance method: " + e)
 
 136             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Error occured during deleteSliceServiceInstance from aai")
 
 141      * update operation status
 
 144     private void updateServiceOperationStatus(DelegateExecution execution){
 
 146         OperationStatus operationStatus = new OperationStatus()
 
 147         operationStatus.setServiceId(execution.getVariable("serviceInstanceId"))
 
 148         operationStatus.setOperationId(execution.getVariable("operationId"))
 
 149         operationStatus.setUserId(execution.getVariable("globalSubscriberId"))
 
 150         operationStatus.setResult(execution.getVariable("result"))
 
 151         operationStatus.setProgress(execution.getVariable("progress"))
 
 152         operationStatus.setOperationContent(execution.getVariable("operationContent"))
 
 153         operationStatus.setReason(execution.getVariable("reason"))
 
 154         operationStatus.setOperation(execution.getVariable("operationType"))
 
 156         requestDBUtil.prepareUpdateOperationStatus(execution, operationStatus)
 
 160      * delete service profile from aai
 
 163     void delServiceProfileFromAAI(DelegateExecution execution)
 
 165         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 166         String serviceType = execution.getVariable("serviceType")
 
 167         String serviceInstanceId = execution.getVariable("serviceInstanceId")
 
 168         String profileId = ""
 
 172             AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_PROFILE_ALL, globalSubscriberId, serviceType, serviceInstanceId)
 
 173             AAIResultWrapper wrapper = getAAIClient().get(resourceUri, NotFoundException.class)
 
 174             Optional<ServiceProfiles> serviceProfilesOpt =wrapper.asBean(ServiceProfiles.class)
 
 175             if(serviceProfilesOpt.isPresent()){
 
 176                 ServiceProfiles serviceProfiles = serviceProfilesOpt.get()
 
 177                 ServiceProfile serviceProfile = serviceProfiles.getServiceProfile().get(0)
 
 178                 profileId = serviceProfile ? serviceProfile.getProfileId() : ""
 
 180             resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_PROFILE, globalSubscriberId, serviceType, serviceInstanceId, profileId)
 
 181             if (!getAAIClient().exists(resourceUri)) {
 
 182                 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai")
 
 184             getAAIClient().delete(resourceUri)
 
 188             String msg = "delete service profile from aai failed! cause-"+any.getCause()
 
 189             LOGGER.error(any.printStackTrace())
 
 190             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg);
 
 194      void sendSyncError(DelegateExecution execution) {
 
 195         LOGGER.debug("${PREFIX} Start sendSyncError")
 
 198             String errorMessage = "Sending Sync Error."
 
 199             if (execution.getVariable("WorkflowException") instanceof WorkflowException) {
 
 200                 WorkflowException wfe = execution.getVariable("WorkflowException")
 
 201                 errorMessage = wfe.getErrorMessage()
 
 204             String buildworkflowException =
 
 205                     """<aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1">
 
 206                                         <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage>
 
 207                                         <aetgt:ErrorCode>7000</aetgt:ErrorCode>
 
 208                                    </aetgt:WorkflowException>"""
 
 210             LOGGER.debug(buildworkflowException)
 
 211             sendWorkflowResponse(execution, 500, buildworkflowException)
 
 213         } catch (Exception ex) {
 
 214             LOGGER.error("Sending Sync Error Activity Failed. " + "\n" + ex.getMessage())
 
 219     void prepareEndOperationStatus(DelegateExecution execution){
 
 220         LOGGER.debug(" ======== ${PREFIX} STARTED prepareEndOperationStatus Process ======== ")
 
 222         execution.setVariable("progress", "100")
 
 223         execution.setVariable("result", "error")
 
 224         execution.setVariable("operationContent", "NSSMF Terminate service failure")
 
 226         WorkflowException wfex = execution.getVariable("WorkflowException") as WorkflowException
 
 227         String errorMessage = wfex.getErrorMessage()
 
 228         errorMessage = errorMessage.length() > 200 ? errorMessage.substring(0,200) + "......" : errorMessage
 
 229         execution.setVariable("reason",errorMessage)
 
 230         updateServiceOperationStatus(execution)
 
 232         LOGGER.debug("======== ${PREFIX} COMPLETED prepareEndOperationStatus Process ======== ")
 
 236      * check parameters from request body
 
 240      * @param isErrorException
 
 243     private void checkAndSetRequestParam(String siRequest, String paraName, boolean isErrorException, DelegateExecution execution)
 
 246         String paramValue = jsonUtil.getJsonValue(siRequest, paraName)
 
 247         if (isBlank(paramValue)) {
 
 248             msg = "Input ${paraName} is null"
 
 252                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
 
 256             execution.setVariable(paraName, paramValue)