package com.sequenceiq.cloudbreak.core.flow2.cluster.downscale; 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.cluster.start.ClusterStartEvent; import com.sequenceiq.cloudbreak.core.flow2.cluster.start.ClusterStartState; import com.sequenceiq.cloudbreak.core.flow2.event.ClusterDownscaleTriggerEvent; 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.resource.CollectDownscaleCandidatesRequest; import com.sequenceiq.cloudbreak.reactor.api.event.resource.CollectDownscaleCandidatesResult; import com.sequenceiq.cloudbreak.reactor.api.event.resource.DecommissionRequest; import com.sequenceiq.cloudbreak.reactor.api.event.resource.DecommissionResult; @Configuration public class ClusterDownscaleActions { @Inject private ClusterDownscaleService clusterDownscaleService; @Bean(name = "COLLECT_CANDIDATES_STATE") public Action collectCandidatesAction() { return new AbstractClusterAction<ClusterDownscaleTriggerEvent>(ClusterDownscaleTriggerEvent.class) { @Override protected void doExecute(ClusterContext context, ClusterDownscaleTriggerEvent payload, Map<Object, Object> variables) throws Exception { clusterDownscaleService.clusterDownscaleStarted(context.getStack(), payload.getHostGroupName(), payload.getAdjustment(), payload.getHostNames()); CollectDownscaleCandidatesRequest request = new CollectDownscaleCandidatesRequest(context.getStack().getId(), payload.getHostGroupName(), payload.getAdjustment(), payload.getHostNames()); sendEvent(context.getFlowId(), request.selector(), request); } }; } @Bean(name = "DECOMMISSION_STATE") public Action decommissionAction() { return new AbstractClusterAction<CollectDownscaleCandidatesResult>(CollectDownscaleCandidatesResult.class) { @Override protected void doExecute(ClusterContext context, CollectDownscaleCandidatesResult payload, Map<Object, Object> variables) throws Exception { DecommissionRequest request = new DecommissionRequest(context.getStack().getId(), payload.getHostGroupName(), payload.getHostNames()); sendEvent(context.getFlowId(), request.selector(), request); } }; } @Bean(name = "UPDATE_INSTANCE_METADATA_STATE") public Action updateInstanceMetadataAction() { return new AbstractClusterAction<DecommissionResult>(DecommissionResult.class) { @Override protected void doExecute(ClusterContext context, DecommissionResult payload, Map<Object, Object> variables) throws Exception { clusterDownscaleService.updateMetadata(context.getStack().getId(), payload.getHostNames(), payload.getRequest().getHostGroupName()); sendEvent(context); } @Override protected Selectable createRequest(ClusterContext context) { return new StackEvent(ClusterDownscaleEvent.FINALIZED_EVENT.event(), context.getStack().getId()); } }; } @Bean(name = "CLUSTER_DOWNSCALE_FAILED_STATE") public Action clusterDownscalescaleFailedAction() { return new AbstractStackFailureAction<ClusterStartState, ClusterStartEvent>() { @Override protected void doExecute(StackFailureContext context, StackFailureEvent payload, Map<Object, Object> variables) throws Exception { clusterDownscaleService.handleClusterDownscaleFailure(context.getStack(), payload.getException()); sendEvent(context); } @Override protected Selectable createRequest(StackFailureContext context) { return new StackEvent(ClusterDownscaleEvent.FAIL_HANDLED_EVENT.event(), context.getStack().getId()); } }; } }