package com.sequenceiq.cloudbreak.reactor;
import java.util.Collections;
import java.util.Set;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.core.CloudbreakSecuritySetupException;
import com.sequenceiq.cloudbreak.domain.InstanceMetaData;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.reactor.api.event.resource.UnhealthyInstancesDetectionRequest;
import com.sequenceiq.cloudbreak.reactor.api.event.resource.UnhealthyInstancesDetectionResult;
import com.sequenceiq.cloudbreak.service.stack.StackService;
import com.sequenceiq.cloudbreak.service.stack.repair.CandidateUnhealthyInstanceSelector;
import com.sequenceiq.cloudbreak.service.stack.repair.UnhealthyInstancesFinalizer;
import reactor.bus.Event;
import reactor.bus.EventBus;
@Component
public class UnhealthyInstancesDetectionHandler implements ClusterEventHandler<UnhealthyInstancesDetectionRequest> {
private static final Logger LOG = LoggerFactory.getLogger(UnhealthyInstancesDetectionHandler.class);
@Inject
private EventBus eventBus;
@Inject
private StackService stackService;
@Inject
private CandidateUnhealthyInstanceSelector unhealthyInstanceSelector;
@Inject
private UnhealthyInstancesFinalizer unhealthyInstancesFinalizer;
@Override
public Class<UnhealthyInstancesDetectionRequest> type() {
return UnhealthyInstancesDetectionRequest.class;
}
@Override
public void accept(Event<UnhealthyInstancesDetectionRequest> event) {
UnhealthyInstancesDetectionRequest request = event.getData();
UnhealthyInstancesDetectionResult result;
Long stackId = request.getStackId();
Stack stack = stackService.getById(stackId);
try {
Set<InstanceMetaData> candidateUnhealthyInstances = unhealthyInstanceSelector.selectCandidateUnhealthyInstances(stack);
if (candidateUnhealthyInstances.isEmpty()) {
result = new UnhealthyInstancesDetectionResult(request, Collections.emptySet());
} else {
Set<String> unhealthyInstances = unhealthyInstancesFinalizer.finalizeUnhealthyInstances(stack, candidateUnhealthyInstances);
result = new UnhealthyInstancesDetectionResult(request, unhealthyInstances);
}
} catch (CloudbreakSecuritySetupException e) {
String msg = String.format("Could not get host statuses from Ambari: %s", e.getMessage());
LOG.error(msg, e);
result = new UnhealthyInstancesDetectionResult(msg, e, request);
} catch (RuntimeException e) {
String msg = String.format("Could not get statuses for unhealty instances: %s", e.getMessage());
LOG.error(msg, e);
result = new UnhealthyInstancesDetectionResult(msg, e, request);
}
eventBus.notify(result.selector(), new Event(event.getHeaders(), result));
}
}