package com.sequenceiq.cloudbreak.core.flow2.stack.termination;
import static com.sequenceiq.cloudbreak.api.model.Status.DELETE_COMPLETED;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.sequenceiq.cloudbreak.api.model.DetailedStackStatus;
import com.sequenceiq.cloudbreak.cloud.event.resource.TerminateStackResult;
import com.sequenceiq.cloudbreak.common.type.BillingStatus;
import com.sequenceiq.cloudbreak.core.flow2.stack.FlowMessageService;
import com.sequenceiq.cloudbreak.core.flow2.stack.Msg;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.reactor.api.event.StackFailureEvent;
import com.sequenceiq.cloudbreak.repository.StackUpdater;
import com.sequenceiq.cloudbreak.service.cluster.ClusterService;
import com.sequenceiq.cloudbreak.service.cluster.flow.EmailSenderService;
import com.sequenceiq.cloudbreak.service.stack.StackService;
import com.sequenceiq.cloudbreak.service.stack.flow.TerminationService;
import com.sequenceiq.cloudbreak.service.usages.UsageService;
import com.sequenceiq.cloudbreak.util.StackUtil;
@Service
public class StackTerminationService {
private static final Logger LOGGER = LoggerFactory.getLogger(StackTerminationService.class);
@Inject
private TerminationService terminationService;
@Inject
private EmailSenderService emailSenderService;
@Inject
private ClusterService clusterService;
@Inject
private FlowMessageService flowMessageService;
@Inject
private StackService stackService;
@Inject
private StackUpdater stackUpdater;
@Inject
private UsageService usageService;
@Inject
private DependecyDeletionService dependecyDeletionService;
@Inject
private StackUtil stackUtil;
public void finishStackTermination(StackTerminationContext context, TerminateStackResult payload, Boolean deleteDependencies) {
LOGGER.info("Terminate stack result: {}", payload);
Stack stack = context.getStack();
terminationService.finalizeTermination(stack.getId(), true);
flowMessageService.fireEventAndLog(stack.getId(), Msg.STACK_BILLING_STOPPED, BillingStatus.BILLING_STOPPED.name());
flowMessageService.fireEventAndLog(stack.getId(), Msg.STACK_DELETE_COMPLETED, DELETE_COMPLETED.name());
clusterService.updateClusterStatusByStackId(stack.getId(), DELETE_COMPLETED);
if (stack.getCluster() != null && stack.getCluster().getEmailNeeded()) {
emailSenderService.sendTerminationSuccessEmail(stack.getCluster().getOwner(), stack.getCluster().getEmailTo(),
stackUtil.extractAmbariIp(stack), stack.getCluster().getName());
flowMessageService.fireEventAndLog(stack.getId(), Msg.STACK_NOTIFICATION_EMAIL, DELETE_COMPLETED.name());
}
usageService.closeUsagesForStack(stack);
if (deleteDependencies) {
dependecyDeletionService.deleteDependencies(stack);
}
}
public void handleStackTerminationError(Stack stack, StackFailureEvent payload, boolean forced, Boolean deleteDependencies) {
String stackUpdateMessage;
Msg eventMessage;
DetailedStackStatus status;
if (!forced) {
Exception errorDetails = payload.getException();
stackUpdateMessage = "Termination failed: " + errorDetails.getMessage();
status = DetailedStackStatus.DELETE_FAILED;
eventMessage = Msg.STACK_INFRASTRUCTURE_DELETE_FAILED;
stackUpdater.updateStackStatus(stack.getId(), status, stackUpdateMessage);
LOGGER.error("Error during stack termination flow: ", errorDetails);
} else {
terminationService.finalizeTermination(stack.getId(), true);
clusterService.updateClusterStatusByStackId(stack.getId(), DELETE_COMPLETED);
stackUpdateMessage = "Stack was force terminated.";
status = DetailedStackStatus.DELETE_COMPLETED;
eventMessage = Msg.STACK_FORCED_DELETE_COMPLETED;
if (deleteDependencies) {
dependecyDeletionService.deleteDependencies(stack);
}
}
flowMessageService.fireEventAndLog(stack.getId(), eventMessage, status.name(), stackUpdateMessage);
if (stack.getCluster() != null && stack.getCluster().getEmailNeeded()) {
String ambariIp = stackUtil.extractAmbariIp(stack);
if (forced) {
emailSenderService.sendTerminationSuccessEmail(stack.getCluster().getOwner(), stack.getCluster().getEmailTo(),
ambariIp, stack.getCluster().getName());
} else {
emailSenderService.sendTerminationFailureEmail(stack.getCluster().getOwner(), stack.getCluster().getEmailTo(),
ambariIp, stack.getCluster().getName());
}
flowMessageService.fireEventAndLog(stack.getId(), Msg.STACK_NOTIFICATION_EMAIL, status.name());
}
}
}