package com.sequenceiq.cloudbreak.service.cluster.filter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
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.client.HttpClientConfig;
import com.sequenceiq.cloudbreak.core.CloudbreakSecuritySetupException;
import com.sequenceiq.cloudbreak.domain.Cluster;
import com.sequenceiq.cloudbreak.domain.HostMetadata;
import com.sequenceiq.cloudbreak.service.TlsSecurityService;
import com.sequenceiq.cloudbreak.service.cluster.AmbariClientProvider;
import com.sequenceiq.cloudbreak.service.cluster.AmbariConfigurationService;
@Service
public class HostFilterService {
public static final String RM_WS_PATH = "/ws/v1/cluster";
private static final Logger LOGGER = LoggerFactory.getLogger(HostFilterService.class);
@Inject
private List<HostFilter> hostFilters;
@Inject
private AmbariConfigurationService configurationService;
@Inject
private AmbariClientProvider ambariClientProvider;
@Inject
private TlsSecurityService tlsSecurityService;
public List<HostMetadata> filterHostsForDecommission(Cluster cluster, Set<HostMetadata> hosts, String hostGroup) throws CloudbreakSecuritySetupException {
List<HostMetadata> filteredList = new ArrayList<>(hosts);
LOGGER.info("Ambari service config, hostGroup: {}, originalList: {}", hostGroup, filteredList);
HttpClientConfig clientConfig = tlsSecurityService.buildTLSClientConfigForPrimaryGateway(cluster.getStack().getId(), cluster.getAmbariIp());
AmbariClient ambariClient = ambariClientProvider.getAmbariClient(clientConfig, cluster.getStack().getGatewayPort(), cluster);
Map<String, String> config = configurationService.getConfiguration(ambariClient, hostGroup);
LOGGER.info("Ambari service config, hostGroup: {}, config: {}", hostGroup, config);
for (HostFilter hostFilter : hostFilters) {
try {
filteredList = hostFilter.filter(cluster.getId(), config, filteredList);
LOGGER.info("Filtered with hostfilter: {}, filteredList: {}", hostFilter.getClass().getSimpleName(), filteredList);
} catch (HostFilterException e) {
LOGGER.warn("Filter didn't succeed, moving to next filter", e);
}
}
LOGGER.info("Returned filtered hosts: {}", filteredList);
return filteredList;
}
}