package com.sequenceiq.cloudbreak.core.flow2.cluster.reset;
import java.util.Map;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.action.Action;
import com.sequenceiq.cloudbreak.cloud.event.Selectable;
import com.sequenceiq.cloudbreak.core.flow2.cluster.ClusterContext;
import com.sequenceiq.cloudbreak.core.flow2.stack.AbstractStackFailureAction;
import com.sequenceiq.cloudbreak.core.flow2.stack.FlowMessageService;
import com.sequenceiq.cloudbreak.core.flow2.stack.StackFailureContext;
import com.sequenceiq.cloudbreak.reactor.api.event.StackEvent;
import com.sequenceiq.cloudbreak.reactor.api.event.StackFailureEvent;
import com.sequenceiq.cloudbreak.reactor.api.event.cluster.StartAmbariRequest;
import com.sequenceiq.cloudbreak.reactor.api.event.cluster.StartAmbariSuccess;
import com.sequenceiq.cloudbreak.reactor.api.event.resource.ClusterResetRequest;
import com.sequenceiq.cloudbreak.reactor.api.event.resource.ClusterResetResult;
import com.sequenceiq.cloudbreak.repository.StackUpdater;
import com.sequenceiq.cloudbreak.service.cluster.ClusterService;
import com.sequenceiq.cloudbreak.service.cluster.flow.EmailSenderService;
@Configuration
public class ClusterResetActions {
private static final Logger LOGGER = LoggerFactory.getLogger(ClusterResetActions.class);
@Inject
private FlowMessageService flowMessageService;
@Inject
private ClusterService clusterService;
@Inject
private StackUpdater stackUpdater;
@Inject
private EmailSenderService emailSenderService;
@Inject
private ClusterResetService clusterResetService;
@Bean(name = "CLUSTER_RESET_STATE")
public Action syncCluster() {
return new AbstractClusterResetAction<StackEvent>(StackEvent.class) {
@Override
protected void doExecute(ClusterContext context, StackEvent payload, Map<Object, Object> variables) throws Exception {
clusterResetService.resetCluster(context.getStack(), context.getCluster());
sendEvent(context);
}
@Override
protected Selectable createRequest(ClusterContext context) {
return new ClusterResetRequest(context.getStack().getId());
}
};
}
@Bean(name = "CLUSTER_RESET_FINISHED_STATE")
public Action finishResetCluster() {
return new AbstractClusterResetAction<ClusterResetResult>(ClusterResetResult.class) {
@Override
protected void doExecute(ClusterContext context, ClusterResetResult payload, Map<Object, Object> variables) throws Exception {
sendEvent(context);
}
@Override
protected Selectable createRequest(ClusterContext context) {
return new StartAmbariRequest(context.getStack().getId());
}
};
}
@Bean(name = "CLUSTER_RESET_START_AMBARI_FINISHED_STATE")
public Action finishStartAmbari() {
return new AbstractClusterResetAction<StartAmbariSuccess>(StartAmbariSuccess.class) {
@Override
protected void doExecute(ClusterContext context, StartAmbariSuccess payload, Map<Object, Object> variables) throws Exception {
sendEvent(context);
}
@Override
protected Selectable createRequest(ClusterContext context) {
return new StackEvent(ClusterResetEvent.FINALIZED_EVENT.event(), context.getStack().getId());
}
};
}
@Bean(name = "CLUSTER_RESET_FAILED_STATE")
public Action clusterResetFailedAction() {
return new AbstractStackFailureAction<ClusterResetState, ClusterResetEvent>() {
@Override
protected void doExecute(StackFailureContext context, StackFailureEvent payload, Map<Object, Object> variables) throws Exception {
clusterResetService.handleResetClusterFailure(context.getStack(), payload.getException());
sendEvent(context);
}
@Override
protected Selectable createRequest(StackFailureContext context) {
return new StackEvent(ClusterResetEvent.FAIL_HANDLED_EVENT.event(), context.getStack().getId());
}
};
}
}