in ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java [1376:1603]
private Set<ServiceComponentHostResponse> getHostComponents(
ServiceComponentHostRequest request, boolean statusOnly) throws AmbariException {
LOG.debug("Processing request {}", request);
if (request.getClusterName() == null
|| request.getClusterName().isEmpty()) {
IllegalArgumentException e = new IllegalArgumentException("Invalid arguments, cluster name should not be null");
LOG.debug("Cluster not specified in request", e);
throw e;
}
final Cluster cluster;
try {
cluster = clusters.getCluster(request.getClusterName());
} catch (ClusterNotFoundException e) {
LOG.error("Cluster not found ", e);
throw new ParentObjectNotFoundException("Parent Cluster resource doesn't exist", e);
}
if (request.getHostname() != null) {
try {
if (!clusters.getClustersForHost(request.getHostname()).contains(cluster)) {
// case where host exists but not associated with given cluster
LOG.error("Host doesn't belong to cluster - " + request.getHostname());
throw new ParentObjectNotFoundException("Parent Host resource doesn't exist",
new HostNotFoundException(request.getClusterName(), request.getHostname()));
}
} catch (HostNotFoundException e) {
LOG.error("Host not found", e);
// creating new HostNotFoundException to add cluster name
throw new ParentObjectNotFoundException("Parent Host resource doesn't exist",
new HostNotFoundException(request.getClusterName(), request.getHostname()));
}
}
if (request.getComponentName() != null) {
if (StringUtils.isBlank(request.getServiceName())) {
// !!! FIXME the assumption that a component is unique across all stacks is a ticking
// time bomb. Blueprints are making this assumption.
String serviceName = findServiceName(cluster, request.getComponentName());
if (StringUtils.isBlank(serviceName)) {
LOG.error("Unable to find service for component {}", request.getComponentName());
throw new ServiceComponentHostNotFoundException(
cluster.getClusterName(), null, request.getComponentName(), request.getHostname());
}
request.setServiceName(serviceName);
}
}
Set<Service> services = new HashSet<>();
if (request.getServiceName() != null && !request.getServiceName().isEmpty()) {
services.add(cluster.getService(request.getServiceName()));
} else {
services.addAll(cluster.getServices().values());
}
Set<ServiceComponentHostResponse> response =
new HashSet<>();
boolean checkDesiredState = false;
State desiredStateToCheck = null;
boolean checkState = false;
State stateToCheck = null;
boolean filterBasedConfigStaleness = false;
boolean staleConfig = true;
if (request.getStaleConfig() != null) {
filterBasedConfigStaleness = true;
staleConfig = "true".equals(request.getStaleConfig().toLowerCase());
}
if (request.getDesiredState() != null
&& !request.getDesiredState().isEmpty()) {
desiredStateToCheck = State.valueOf(request.getDesiredState());
if (!desiredStateToCheck.isValidDesiredState()) {
throw new IllegalArgumentException("Invalid arguments, invalid desired"
+ " state, desiredState=" + desiredStateToCheck);
}
checkDesiredState = true;
}
if (!StringUtils.isEmpty(request.getState())) {
stateToCheck = State.valueOf(request.getState());
// maybe check should be more wider
if (stateToCheck == null) {
throw new IllegalArgumentException("Invalid arguments, invalid state, State=" + request.getState());
}
checkState = true;
}
Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
Map<String, Host> hosts = clusters.getHostsForCluster(cluster.getClusterName());
for (Service s : services) {
// filter on component name if provided
Set<ServiceComponent> components = new HashSet<>();
if (request.getComponentName() != null) {
components.add(s.getServiceComponent(request.getComponentName()));
} else {
components.addAll(s.getServiceComponents().values());
}
for (ServiceComponent sc : components) {
if (request.getComponentName() != null) {
if (!sc.getName().equals(request.getComponentName())) {
continue;
}
}
// filter on hostname if provided
// filter on desired state if provided
Map<String, ServiceComponentHost> serviceComponentHostMap =
sc.getServiceComponentHosts();
if (request.getHostname() != null) {
try {
if (serviceComponentHostMap == null
|| !serviceComponentHostMap.containsKey(request.getHostname())) {
throw new ServiceComponentHostNotFoundException(cluster.getClusterName(),
s.getName(), sc.getName(), request.getHostname());
}
ServiceComponentHost sch = serviceComponentHostMap.get(request.getHostname());
if (null == sch) {
// It's possible that the host was deleted during the time that the request was generated.
continue;
}
if (checkDesiredState && (desiredStateToCheck != sch.getDesiredState())) {
continue;
}
if (checkState && stateToCheck != sch.getState()) {
continue;
}
if (request.getAdminState() != null) {
String stringToMatch =
sch.getComponentAdminState() == null ? "" : sch.getComponentAdminState().name();
if (!request.getAdminState().equals(stringToMatch)) {
continue;
}
}
ServiceComponentHostResponse r = statusOnly ? sch.convertToResponseStatusOnly(desiredConfigs,
filterBasedConfigStaleness)
: sch.convertToResponse(desiredConfigs);
if (null == r || (filterBasedConfigStaleness && r.isStaleConfig() != staleConfig)) {
continue;
}
Host host = hosts.get(sch.getHostName());
if (host == null) {
throw new HostNotFoundException(cluster.getClusterName(), sch.getHostName());
}
MaintenanceState effectiveMaintenanceState = maintenanceStateHelper.getEffectiveState(sch, host);
if(filterByMaintenanceState(request, effectiveMaintenanceState)) {
continue;
}
r.setMaintenanceState(effectiveMaintenanceState.name());
response.add(r);
} catch (ServiceComponentHostNotFoundException e) {
if (request.getServiceName() == null || request.getComponentName() == null) {
// Ignore the exception if either the service name or component name are not specified.
// This is an artifact of how we get host_components and can happen in the case where
// we get all host_components for a host, for example.
LOG.debug("Ignoring not specified host_component ", e);
} else {
// Otherwise rethrow the exception and let the caller decide if it's an error condition.
// Logging the exception as debug since this does not necessarily indicate an error
// condition.
LOG.debug("ServiceComponentHost not found ", e);
throw new ServiceComponentHostNotFoundException(cluster.getClusterName(),
request.getServiceName(), request.getComponentName(), request.getHostname());
}
}
} else {
for (ServiceComponentHost sch : serviceComponentHostMap.values()) {
if (null == sch) {
// It's possible that the host was deleted during the time that the request was generated.
continue;
}
if (checkDesiredState && (desiredStateToCheck != sch.getDesiredState())) {
continue;
}
if (checkState && stateToCheck != sch.getState()) {
continue;
}
if (request.getAdminState() != null) {
String stringToMatch =
sch.getComponentAdminState() == null ? "" : sch.getComponentAdminState().name();
if (!request.getAdminState().equals(stringToMatch)) {
continue;
}
}
ServiceComponentHostResponse r = statusOnly ? sch.convertToResponseStatusOnly(desiredConfigs,
filterBasedConfigStaleness)
: sch.convertToResponse(desiredConfigs);
if (null == r || (filterBasedConfigStaleness && r.isStaleConfig() != staleConfig)) {
continue;
}
Host host = hosts.get(sch.getHostName());
if (host == null) {
throw new HostNotFoundException(cluster.getClusterName(), sch.getHostName());
}
MaintenanceState effectiveMaintenanceState = maintenanceStateHelper.getEffectiveState(sch, host);
if(filterByMaintenanceState(request, effectiveMaintenanceState)) {
continue;
}
r.setMaintenanceState(effectiveMaintenanceState.name());
response.add(r);
}
}
}
}
return response;
}