package com.sequenceiq.cloudbreak.core.flow2.cluster.reset;
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.api.model.Status;
import com.sequenceiq.cloudbreak.core.CloudbreakException;
import com.sequenceiq.cloudbreak.core.flow2.stack.FlowMessageService;
import com.sequenceiq.cloudbreak.core.flow2.stack.Msg;
import com.sequenceiq.cloudbreak.domain.Cluster;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.logger.MDCBuilder;
import com.sequenceiq.cloudbreak.repository.StackUpdater;
import com.sequenceiq.cloudbreak.service.cluster.ClusterService;
import com.sequenceiq.cloudbreak.service.cluster.flow.EmailSenderService;
@Service
public class ClusterResetService {
private static final Logger LOGGER = LoggerFactory.getLogger(ClusterResetService.class);
@Inject
private FlowMessageService flowMessageService;
@Inject
private ClusterService clusterService;
@Inject
private StackUpdater stackUpdater;
@Inject
private EmailSenderService emailSenderService;
public void resetCluster(Stack stack, Cluster cluster) {
MDCBuilder.buildMdcContext(cluster);
flowMessageService.fireEventAndLog(stack.getId(), Msg.AMBARI_CLUSTER_RESET, Status.UPDATE_IN_PROGRESS.name());
}
public void handleResetClusterFailure(Stack stack, Exception exception) {
Cluster cluster = clusterService.retrieveClusterByStackId(stack.getId());
MDCBuilder.buildMdcContext(cluster);
String errorMessage = exception instanceof CloudbreakException && exception.getCause() != null
? exception.getCause().getMessage() : exception.getMessage();
clusterService.updateClusterStatusByStackId(stack.getId(), Status.CREATE_FAILED, errorMessage);
stackUpdater.updateStackStatus(stack.getId(), DetailedStackStatus.AVAILABLE);
flowMessageService.fireEventAndLog(stack.getId(), Msg.AMBARI_CLUSTER_CREATE_FAILED, Status.CREATE_FAILED.name(), errorMessage);
if (cluster.getEmailNeeded()) {
emailSenderService.sendProvisioningFailureEmail(cluster.getOwner(), stack.getCluster().getEmailTo(), cluster.getName());
flowMessageService.fireEventAndLog(stack.getId(), Msg.AMBARI_CLUSTER_NOTIFICATION_EMAIL, Status.AVAILABLE.name());
}
}
}