package com.sequenceiq.cloudbreak.service.cluster.flow;
import static com.sequenceiq.cloudbreak.service.cluster.flow.AmbariOperationsStatusCheckerTask.FAILED;
import static com.sequenceiq.cloudbreak.service.cluster.flow.AmbariOperationsStatusCheckerTask.PENDING;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.sequenceiq.ambari.client.AmbariClient;
import com.sequenceiq.cloudbreak.service.ClusterBasedStatusCheckerTask;
import com.sequenceiq.cloudbreak.service.cluster.AmbariOperationFailedException;
@Component
public class AmbariOperationsStartCheckerTask extends ClusterBasedStatusCheckerTask<AmbariOperations> {
private static final Logger LOGGER = LoggerFactory.getLogger(AmbariOperationsStartCheckerTask.class);
private static final int MAX_RETRY = 3;
@Override
public boolean checkStatus(AmbariOperations t) {
Map<String, Integer> installRequests = t.getRequests();
boolean allInProgress = true;
for (Entry<String, Integer> request : installRequests.entrySet()) {
AmbariClient ambariClient = t.getAmbariClient();
BigDecimal installProgress = Optional.ofNullable(ambariClient.getRequestProgress(request.getValue())).orElse(PENDING);
LOGGER.info("Ambari operation start: '{}', Progress: {}", request.getKey(), installProgress);
if (FAILED.compareTo(installProgress) == 0) {
boolean failed = true;
for (int i = 0; i < MAX_RETRY; i++) {
if (ambariClient.getRequestProgress(request.getValue()).compareTo(FAILED) != 0) {
failed = false;
break;
}
}
if (failed) {
throw new AmbariOperationFailedException(String.format("Ambari operation start failed: [component:'%s', requestID: '%s']", request.getKey(),
request.getValue()));
}
}
allInProgress = allInProgress && PENDING.compareTo(installProgress) != 0;
}
return allInProgress;
}
@Override
public void handleTimeout(AmbariOperations t) {
throw new IllegalStateException(String.format("Ambari operations start timed out: %s", t.getRequests()));
}
@Override
public String successMessage(AmbariOperations t) {
return String.format("Requested Ambari operations started: %s", t.getRequests().toString());
}
@Override
public void handleException(Exception e) {
LOGGER.error("Ambari operation start failed.", e);
}
}