package com.sequenceiq.cloudbreak.reactor; import java.util.Set; import javax.inject.Inject; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.logger.MDCBuilder; import com.sequenceiq.cloudbreak.reactor.api.event.resource.CollectDownscaleCandidatesRequest; import com.sequenceiq.cloudbreak.reactor.api.event.resource.CollectDownscaleCandidatesResult; import com.sequenceiq.cloudbreak.service.cluster.flow.AmbariDecommissioner; import com.sequenceiq.cloudbreak.service.stack.StackService; import reactor.bus.Event; import reactor.bus.EventBus; @Component public class CollectDownscaleCandidatesHandler implements ClusterEventHandler<CollectDownscaleCandidatesRequest> { @Inject private EventBus eventBus; @Inject private StackService stackService; @Inject private AmbariDecommissioner ambariDecommissioner; @Override public Class<CollectDownscaleCandidatesRequest> type() { return CollectDownscaleCandidatesRequest.class; } @Override public void accept(Event<CollectDownscaleCandidatesRequest> event) { CollectDownscaleCandidatesRequest request = event.getData(); CollectDownscaleCandidatesResult result; try { Stack stack = stackService.getById(request.getStackId()); MDCBuilder.buildMdcContext(stack); Set<String> hostNames; if (request.getHostNames() == null) { hostNames = ambariDecommissioner.collectDownscaleCandidates(stack, request.getHostGroupName(), request.getScalingAdjustment()); } else { hostNames = request.getHostNames(); } result = new CollectDownscaleCandidatesResult(request, hostNames); } catch (Exception e) { result = new CollectDownscaleCandidatesResult(e.getMessage(), e, request); } eventBus.notify(result.selector(), new Event<>(event.getHeaders(), result)); } }