package com.sequenceiq.cloudbreak.core.flow2.cluster.termination; import java.util.Map; import javax.inject.Inject; 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.AbstractClusterAction; import com.sequenceiq.cloudbreak.core.flow2.cluster.ClusterContext; import com.sequenceiq.cloudbreak.core.flow2.stack.AbstractStackFailureAction; 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.orchestration.ClusterTerminationRequest; import com.sequenceiq.cloudbreak.reactor.api.event.orchestration.ClusterTerminationResult; @Configuration public class ClusterTerminationActions { @Inject private ClusterTerminationFlowService clusterTerminationFlowService; @Bean(name = "CLUSTER_TERMINATING_STATE") public Action terminatingCluster() { return new AbstractClusterAction<StackEvent>(StackEvent.class) { @Override protected void doExecute(ClusterContext context, StackEvent payload, Map<Object, Object> variables) throws Exception { clusterTerminationFlowService.terminateCluster(context); sendEvent(context); } @Override protected Selectable createRequest(ClusterContext context) { return new ClusterTerminationRequest(context.getStack().getId(), context.getCluster() != null ? context.getCluster().getId() : null); } }; } @Bean(name = "CLUSTER_TERMINATION_FINISH_STATE") public Action clusterTerminationFinished() { return new AbstractClusterAction<ClusterTerminationResult>(ClusterTerminationResult.class) { @Override protected void doExecute(ClusterContext context, ClusterTerminationResult payload, Map<Object, Object> variables) throws Exception { if (payload.isOperationAllowed()) { clusterTerminationFlowService.finishClusterTerminationAllowed(context, payload); } else { clusterTerminationFlowService.finishClusterTerminationNotAllowed(context, payload); } sendEvent(context); } @Override protected Selectable createRequest(ClusterContext context) { return new StackEvent(ClusterTerminationEvent.FINALIZED_EVENT.event(), context.getStack().getId()); } }; } @Bean(name = "CLUSTER_TERMINATION_FAILED_STATE") public Action clusterTerminationFailedAction() { return new AbstractStackFailureAction<ClusterTerminationState, ClusterTerminationEvent>() { @Override protected void doExecute(StackFailureContext context, StackFailureEvent payload, Map<Object, Object> variables) throws Exception { clusterTerminationFlowService.handleClusterTerminationError(payload); sendEvent(context); } @Override protected Selectable createRequest(StackFailureContext context) { return new StackEvent(ClusterTerminationEvent.FAIL_HANDLED_EVENT.event(), context.getStack().getId()); } }; } }