package com.sequenceiq.cloudbreak.service.cluster.flow;
import java.util.Map;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.sequenceiq.ambari.client.AmbariClient;
import com.sequenceiq.cloudbreak.domain.Stack;
import com.sequenceiq.cloudbreak.logger.MDCBuilder;
import com.sequenceiq.cloudbreak.service.PollingResult;
import com.sequenceiq.cloudbreak.service.PollingService;
import com.sequenceiq.cloudbreak.service.StatusCheckerTask;
@Service
public class AmbariOperationService {
public static final int MAX_ATTEMPTS_FOR_AMBARI_OPS = -1;
public static final int AMBARI_POLLING_INTERVAL = 5000;
public static final int MAX_ATTEMPTS_FOR_HOSTS = 240;
public static final int MAX_ATTEMPTS_FOR_AMBARI_SERVER_STARTUP = 120;
public static final int MAX_FAILURE_COUNT = 5;
private static final Logger LOGGER = LoggerFactory.getLogger(AmbariOperationService.class);
@Inject
private AmbariOperationsStatusCheckerTask ambariOperationsStatusCheckerTask;
@Inject
private AmbariOperationsStartCheckerTask ambariOperationsStartCheckerTask;
@Inject
private AmbariOperationsRequestCheckerTask requestCheckerTask;
@Inject
private PollingService<AmbariOperations> operationsPollingService;
public PollingResult waitForOperations(Stack stack, AmbariClient ambariClient,
Map<String, Integer> operationRequests, AmbariOperationType ambariOperationType) {
MDCBuilder.buildMdcContext(stack);
LOGGER.info("Waiting for Ambari operations to finish. [Operation requests: {}]", operationRequests);
return waitForOperations(stack, ambariClient, ambariOperationsStatusCheckerTask, operationRequests, ambariOperationType);
}
public PollingResult waitForOperationsToStart(Stack stack, AmbariClient ambariClient,
Map<String, Integer> operationRequests, AmbariOperationType ambariOperationType) {
MDCBuilder.buildMdcContext(stack);
LOGGER.info("Waiting for Ambari operations to start. [Operation requests: {}]", operationRequests);
return waitForOperations(stack, ambariClient, ambariOperationsStartCheckerTask, operationRequests, ambariOperationType);
}
public PollingResult waitForOperations(Stack stack, AmbariClient ambariClient, String requestContext,
String desiredOperationStatus, AmbariOperationType ambariOperationType) {
MDCBuilder.buildMdcContext(stack);
LOGGER.info("Waiting for Ambari operation with context {} to reach status: {}", requestContext, desiredOperationStatus);
return operationsPollingService.pollWithTimeout(requestCheckerTask, new AmbariOperations(stack, ambariClient, requestContext,
desiredOperationStatus, ambariOperationType), AMBARI_POLLING_INTERVAL, MAX_ATTEMPTS_FOR_AMBARI_OPS, MAX_FAILURE_COUNT);
}
public PollingResult waitForOperations(Stack stack, AmbariClient ambariClient, StatusCheckerTask<AmbariOperations> task,
Map<String, Integer> operationRequests, AmbariOperationType ambariOperationType) {
return operationsPollingService.pollWithTimeout(task, new AmbariOperations(stack, ambariClient, operationRequests, ambariOperationType),
AMBARI_POLLING_INTERVAL, MAX_ATTEMPTS_FOR_AMBARI_OPS, MAX_FAILURE_COUNT);
}
}