You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by tb...@apache.org on 2013/11/04 11:04:50 UTC
[2/2] git commit: AMBARI-3670 - Hosts should roll up host_components
status into its status
AMBARI-3670 - Hosts should roll up host_components status into its status
Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/69010c80
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/69010c80
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/69010c80
Branch: refs/heads/trunk
Commit: 69010c8085e56335f593da669362fa39bc9d982b
Parents: c13df4d
Author: tbeerbower <tb...@hortonworks.com>
Authored: Fri Nov 1 16:28:35 2013 -0400
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Mon Nov 4 05:01:19 2013 -0500
----------------------------------------------------------------------
.../controller/AmbariManagementController.java | 83 +-
.../AmbariManagementControllerImpl.java | 361 +-------
.../internal/AbstractProviderModule.java | 35 +-
.../internal/HostResourceProvider.java | 460 +++++++++-
...ootServiceHostComponentResourceProvider.java | 33 +-
.../ambari/server/state/HostHealthStatus.java | 8 +-
.../AmbariManagementControllerImplTest.java | 204 -----
.../AmbariManagementControllerTest.java | 37 +-
.../internal/HostResourceProviderTest.java | 868 +++++++++++++++++--
...erviceHostComponentResourceProviderTest.java | 96 +-
10 files changed, 1401 insertions(+), 784 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
index 40389c2..cc869a3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
@@ -23,7 +23,6 @@ import org.apache.ambari.server.actionmanager.ActionManager;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
-import org.apache.ambari.server.state.ConfigFactory;
import org.apache.ambari.server.state.Service;
import org.apache.ambari.server.state.ServiceComponent;
import org.apache.ambari.server.state.ServiceComponentFactory;
@@ -54,16 +53,6 @@ public interface AmbariManagementController {
public void createCluster(ClusterRequest request) throws AmbariException;
/**
- * Create the host defined by the attributes in the given request object.
- *
- * @param requests the request object which defines the host to be created
- *
- * @throws AmbariException thrown if the host cannot be created
- */
- public void createHosts(Set<HostRequest> requests)
- throws AmbariException;
-
- /**
* Create the host component defined by the attributes in the given request object.
*
* @param requests the request object which defines the host component to be created
@@ -108,18 +97,6 @@ public interface AmbariManagementController {
throws AmbariException;
/**
- * Get the hosts identified by the given request objects.
- *
- * @param requests the request objects which identify the hosts to be returned
- *
- * @return a set of host responses
- *
- * @throws AmbariException thrown if the resource cannot be read
- */
- public Set<HostResponse> getHosts(Set<HostRequest> requests)
- throws AmbariException;
-
- /**
* Get the host components identified by the given request objects.
*
* @param requests the request objects which identify the host components
@@ -189,18 +166,6 @@ public interface AmbariManagementController {
throws AmbariException;
/**
- * Update the host identified by the given request object with the
- * values carried by the given request object.
- *
- * @param requests the request object which defines which host to
- * update and the values to set
- *
- * @throws AmbariException thrown if the resource cannot be updated
- */
- public void updateHosts(Set<HostRequest> requests)
- throws AmbariException;
-
- /**
* Update the host component identified by the given request object with the
* values carried by the given request object.
*
@@ -240,16 +205,6 @@ public interface AmbariManagementController {
public void deleteCluster(ClusterRequest request) throws AmbariException;
/**
- * Delete the host identified by the given request object.
- *
- * @param requests the request object which identifies which host to delete
- *
- * @throws AmbariException thrown if the resource cannot be deleted
- */
- public void deleteHosts(Set<HostRequest> requests)
- throws AmbariException;
-
- /**
* Delete the host component identified by the given request object.
*
* @param requests the request object which identifies which host component to delete
@@ -414,17 +369,6 @@ public interface AmbariManagementController {
*/
public Set<RootServiceComponentResponse> getRootServiceComponents(Set<RootServiceComponentRequest> requests) throws AmbariException;
- /**
- * Get all hosts components of top-level services of Ambari, not related to certain cluster.
- *
- * @param requests the host components of top-level services
- *
- * @return a set of host components
- *
- * @throws AmbariException if the resources cannot be read
- */
- public Set<RootServiceHostComponentResponse> getRootServiceHostComponents(Set<RootServiceHostComponentRequest> requests) throws AmbariException;
-
// ----- Common utility methods --------------------------------------------
@@ -457,6 +401,20 @@ public interface AmbariManagementController {
public ServiceComponentFactory getServiceComponentFactory();
/**
+ * Get the root service response factory for this management controller.
+ *
+ * @return the root service response factory
+ */
+ public AbstractRootServiceResponseFactory getRootServiceResponseFactory();
+
+ /**
+ * Get the config group factory for this management controller.
+ *
+ * @return the config group factory
+ */
+ public ConfigGroupFactory getConfigGroupFactory();
+
+ /**
* Get the action manager for this management controller.
*
* @return the action manager
@@ -464,6 +422,13 @@ public interface AmbariManagementController {
public ActionManager getActionManager();
/**
+ * Get the authenticated user's name.
+ *
+ * @return the authenticated user's name
+ */
+ public String getAuthName();
+
+ /**
* Create the stages required to persist an action and return a result containing the
* associated request and resulting tasks.
*
@@ -488,11 +453,5 @@ public interface AmbariManagementController {
Map<String, Map<State, List<ServiceComponentHost>>> changedHosts,
Collection<ServiceComponentHost> ignoredHosts,
boolean runSmokeTest, boolean reconfigureClients) throws AmbariException;
-
- public ConfigGroupFactory getConfigGroupFactory();
-
- public ConfigFactory getConfigFactory();
-
- public String getAuthName();
}
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 0c8119b..6f28798 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -291,103 +291,6 @@ public class AmbariManagementControllerImpl implements
}
@Override
- public synchronized void createHosts(Set<HostRequest> requests)
- throws AmbariException {
-
- if (requests.isEmpty()) {
- LOG.warn("Received an empty requests set");
- return;
- }
-
- Set<String> duplicates = new HashSet<String>();
- Set<String> unknowns = new HashSet<String>();
- Set<String> allHosts = new HashSet<String>();
- for (HostRequest request : requests) {
- if (request.getHostname() == null
- || request.getHostname().isEmpty()) {
- throw new IllegalArgumentException("Invalid arguments, hostname"
- + " cannot be null");
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Received a createHost request"
- + ", hostname=" + request.getHostname()
- + ", request=" + request);
- }
-
- if (allHosts.contains(request.getHostname())) {
- // throw dup error later
- duplicates.add(request.getHostname());
- continue;
- }
- allHosts.add(request.getHostname());
-
- try {
- // ensure host is registered
- clusters.getHost(request.getHostname());
- }
- catch (HostNotFoundException e) {
- unknowns.add(request.getHostname());
- continue;
- }
-
- if (request.getClusterName() != null) {
- try {
- // validate that cluster_name is valid
- clusters.getCluster(request.getClusterName());
- } catch (ClusterNotFoundException e) {
- throw new ParentObjectNotFoundException("Attempted to add a host to a cluster which doesn't exist: "
- + " clusterName=" + request.getClusterName());
- }
- }
- }
-
- if (!duplicates.isEmpty()) {
- StringBuilder names = new StringBuilder();
- boolean first = true;
- for (String hName : duplicates) {
- if (!first) {
- names.append(",");
- }
- first = false;
- names.append(hName);
- }
- throw new IllegalArgumentException("Invalid request contains"
- + " duplicate hostnames"
- + ", hostnames=" + names.toString());
- }
-
- if (!unknowns.isEmpty()) {
- StringBuilder names = new StringBuilder();
- boolean first = true;
- for (String hName : unknowns) {
- if (!first) {
- names.append(",");
- }
- first = false;
- names.append(hName);
- }
-
- throw new IllegalArgumentException("Attempted to add unknown hosts to a cluster. " +
- "These hosts have not been registered with the server: " + names.toString());
- }
-
- Map<String, Set<String>> hostClustersMap = new HashMap<String, Set<String>>();
- Map<String, Map<String, String>> hostAttributes = new HashMap<String, Map<String, String>>();
- for (HostRequest request : requests) {
- if (request.getHostname() != null) {
- Set<String> clusters = new HashSet<String>();
- clusters.add(request.getClusterName());
- hostClustersMap.put(request.getHostname(), clusters);
- if (request.getHostAttributes() != null) {
- hostAttributes.put(request.getHostname(), request.getHostAttributes());
- }
- }
- }
- clusters.updateHostWithClusterAndAttributes(hostClustersMap, hostAttributes);
- }
-
- @Override
public synchronized void createHostComponents(Set<ServiceComponentHostRequest> requests)
throws AmbariException {
@@ -767,65 +670,6 @@ public class AmbariManagementControllerImpl implements
return response;
}
- private synchronized Set<HostResponse> getHosts(HostRequest request)
- throws AmbariException {
-
- //TODO/FIXME host can only belong to a single cluster so get host directly from Cluster
- //TODO/FIXME what is the requirement for filtering on host attributes?
-
- List<Host> hosts;
- Set<HostResponse> response = new HashSet<HostResponse>();
- Cluster cluster = null;
-
- String clusterName = request.getClusterName();
- String hostName = request.getHostname();
-
- if (clusterName != null) {
- //validate that cluster exists, throws exception if it doesn't.
- try {
- cluster = clusters.getCluster(clusterName);
- } catch (ObjectNotFoundException e) {
- throw new ParentObjectNotFoundException("Parent Cluster resource doesn't exist", e);
- }
- }
-
- if (hostName == null) {
- hosts = clusters.getHosts();
- } else {
- hosts = new ArrayList<Host>();
- try {
- hosts.add(clusters.getHost(request.getHostname()));
- } catch (HostNotFoundException e) {
- // add cluster name
- throw new HostNotFoundException(clusterName, hostName);
- }
- }
-
- for (Host h : hosts) {
- if (clusterName != null) {
- if (clusters.getClustersForHost(h.getHostName()).contains(cluster)) {
- HostResponse r = h.convertToResponse();
- r.setClusterName(clusterName);
- r.setDesiredConfigs(h.getDesiredConfigs(cluster.getClusterId()));
-
- response.add(r);
- } else if (hostName != null) {
- throw new HostNotFoundException(clusterName, hostName);
- }
- } else {
- HostResponse r = h.convertToResponse();
-
- Set<Cluster> clustersForHost = clusters.getClustersForHost(h.getHostName());
- //todo: host can only belong to a single cluster
- if (clustersForHost != null && clustersForHost.size() != 0) {
- r.setClusterName(clustersForHost.iterator().next().getClusterName());
- }
- response.add(r);
- }
- }
- return response;
- }
-
private synchronized Set<ServiceComponentHostResponse> getHostComponents(
ServiceComponentHostRequest request) throws AmbariException {
if (request.getClusterName() == null
@@ -1645,92 +1489,6 @@ public class AmbariManagementControllerImpl implements
}
@Override
- public synchronized void updateHosts(Set<HostRequest> requests)
- throws AmbariException {
-
- if (requests.isEmpty()) {
- LOG.warn("Received an empty requests set");
- return;
- }
-
- for (HostRequest request : requests) {
- if (request.getHostname() == null
- || request.getHostname().isEmpty()) {
- throw new IllegalArgumentException("Invalid arguments, hostname should"
- + " be provided");
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Received a updateHost request"
- + ", hostname=" + request.getHostname()
- + ", request=" + request);
- }
-
- Host h = clusters.getHost(request.getHostname());
-
- try {
- //todo: the below method throws an exception when trying to create a duplicate mapping.
- //todo: this is done to detect duplicates during host create. Unless it is allowable to
- //todo: add a host to a cluster by modifying the cluster_name prop, we should not do this mapping here.
- //todo: Determine if it is allowable to associate a host to a cluster via this mechanism.
- clusters.mapHostToCluster(request.getHostname(), request.getClusterName());
- } catch (DuplicateResourceException e) {
- // do nothing
- }
-
- if (null != request.getHostAttributes())
- h.setHostAttributes(request.getHostAttributes());
-
- if (null != request.getRackInfo()) {
- h.setRackInfo(request.getRackInfo());
- }
-
- if (null != request.getPublicHostName()) {
- h.setPublicHostName(request.getPublicHostName());
- }
-
- if (null != request.getClusterName() && null != request.getDesiredConfig()) {
- Cluster c = clusters.getCluster(request.getClusterName());
-
- if (clusters.getHostsForCluster(request.getClusterName()).containsKey(h.getHostName())) {
-
- ConfigurationRequest cr = request.getDesiredConfig();
-
- if (null != cr.getProperties() && cr.getProperties().size() > 0) {
- LOG.info(MessageFormat.format("Applying configuration with tag ''{0}'' to host ''{1}'' in cluster ''{2}''",
- cr.getVersionTag(),
- request.getHostname(),
- request.getClusterName()));
-
- cr.setClusterName(c.getClusterName());
- createConfiguration(cr);
- }
-
- Config baseConfig = c.getConfig(cr.getType(), cr.getVersionTag());
- if (null != baseConfig) {
- String authName = getAuthName();
- DesiredConfig oldConfig = h.getDesiredConfigs(c.getClusterId()).get(cr.getType());
-
- if (h.addDesiredConfig(c.getClusterId(), cr.isSelected(), authName, baseConfig)) {
- Logger logger = LoggerFactory.getLogger("configchange");
- logger.info("cluster '" + c.getClusterName() + "', "
- + "host '" + h.getHostName() + "' "
- + "changed by: '" + authName + "'; "
- + "type='" + baseConfig.getType() + "' "
- + "tag='" + baseConfig.getVersionTag() + "'"
- + (null == oldConfig ? "" : ", from='" + oldConfig.getVersion() + "'"));
- }
- }
-
- }
- }
-
- //todo: if attempt was made to update a property other than those
- //todo: that are allowed above, should throw exception
- }
- }
-
- @Override
public synchronized RequestStatusResponse updateHostComponents(Set<ServiceComponentHostRequest> requests,
Map<String, String> requestProperties, boolean runSmokeTest)
throws AmbariException {
@@ -2207,72 +1965,6 @@ public class AmbariManagementControllerImpl implements
}
@Override
- public void deleteHosts(Set<HostRequest> requests)
- throws AmbariException {
-
- List<HostRequest> okToRemove = new ArrayList<HostRequest>();
-
- for (HostRequest hostRequest : requests) {
- String hostName = hostRequest.getHostname();
- if (null == hostName)
- continue;
-
- if (null != hostRequest.getClusterName()) {
- Cluster cluster = clusters.getCluster(hostRequest.getClusterName());
-
- List<ServiceComponentHost> list = cluster.getServiceComponentHosts(hostName);
-
- if (0 != list.size()) {
- StringBuilder reason = new StringBuilder("Cannot remove host ")
- .append(hostName)
- .append(" from ")
- .append(hostRequest.getClusterName())
- .append(". The following roles exist: ");
-
- int i = 0;
- for (ServiceComponentHost sch : list) {
- if ((i++) > 0)
- reason.append(", ");
- reason.append(sch.getServiceComponentName());
- }
-
- throw new AmbariException(reason.toString());
- }
- okToRemove.add(hostRequest);
-
- } else {
- // check if host exists (throws exception if not found)
- clusters.getHost(hostName);
-
- // delete host outright
- Set<Cluster> clusterSet = clusters.getClustersForHost(hostName);
- if (0 != clusterSet.size()) {
- StringBuilder reason = new StringBuilder("Cannot remove host ")
- .append(hostName)
- .append(". It belongs to clusters: ");
- int i = 0;
- for (Cluster c : clusterSet) {
- if ((i++) > 0)
- reason.append(", ");
- reason.append(c.getClusterName());
- }
- throw new AmbariException(reason.toString());
- }
- okToRemove.add(hostRequest);
- }
- }
-
- for (HostRequest hostRequest : okToRemove) {
- if (null != hostRequest.getClusterName()) {
- clusters.unmapHostFromCluster(hostRequest.getHostname(),
- hostRequest.getClusterName());
- } else {
- clusters.deleteHost(hostRequest.getHostname());
- }
- }
- }
-
- @Override
public RequestStatusResponse deleteHostComponents(
Set<ServiceComponentHostRequest> requests) throws AmbariException {
@@ -2464,24 +2156,6 @@ public class AmbariManagementControllerImpl implements
}
@Override
- public Set<HostResponse> getHosts(Set<HostRequest> requests)
- throws AmbariException {
- Set<HostResponse> response = new HashSet<HostResponse>();
- for (HostRequest request : requests) {
- try {
- response.addAll(getHosts(request));
- } catch (HostNotFoundException e) {
- if (requests.size() == 1) {
- // only throw exception if 1 request.
- // there will be > 1 request in case of OR predicate
- throw e;
- }
- }
- }
- return response;
- }
-
- @Override
public Set<ServiceComponentHostResponse> getHostComponents(
Set<ServiceComponentHostRequest> requests) throws AmbariException {
Set<ServiceComponentHostResponse> response =
@@ -3195,9 +2869,7 @@ public class AmbariManagementControllerImpl implements
return response;
}
- /**
- * @return the authenticated user's name
- */
+ @Override
public String getAuthName() {
return AuthorizationHelper.getAuthenticatedName(configs.getAnonymousAuditName());
}
@@ -3249,32 +2921,6 @@ public class AmbariManagementControllerImpl implements
}
@Override
- public Set<RootServiceHostComponentResponse> getRootServiceHostComponents(
- Set<RootServiceHostComponentRequest> requests) throws AmbariException {
- Set<RootServiceHostComponentResponse> response = new HashSet<RootServiceHostComponentResponse>();
- for (RootServiceHostComponentRequest request : requests) {
- try {
- response.addAll(getRootServiceHostComponents(request));
- } catch (AmbariException e) {
- if (requests.size() == 1) {
- // only throw exception if 1 request.
- // there will be > 1 request in case of OR predicate
- throw e;
- }
- }
- }
- return response;
- }
-
- private Set<RootServiceHostComponentResponse> getRootServiceHostComponents(RootServiceHostComponentRequest request) throws AmbariException{
-
- //Get all hosts of all clusters
- Set<HostResponse> hosts = getHosts(new HostRequest(request.getHostName(), null, null));
-
- return this.rootServiceResponseFactory.getRootServiceHostComponent(request, hosts);
- }
-
- @Override
public Clusters getClusters() {
return clusters;
}
@@ -3300,8 +2946,9 @@ public class AmbariManagementControllerImpl implements
}
@Override
- public ConfigFactory getConfigFactory() {
- return configFactory;
+ public AbstractRootServiceResponseFactory getRootServiceResponseFactory() {
+ return rootServiceResponseFactory;
+
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
index 0f392d0..0e65262 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
@@ -252,38 +252,29 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
@Override
public boolean isGangliaCollectorHostLive(String clusterName) throws SystemException {
- HostResponse gangliaCollectorHost = null;
+ HostResponse gangliaCollectorHost;
try {
- HostRequest hostRequest = new HostRequest(null, clusterName, Collections.<String, String>emptyMap());
- Set<HostResponse> hosts = managementController.getHosts(Collections.singleton(hostRequest));
-
final String gangliaCollectorHostName = getGangliaCollectorHostName(clusterName);
-
- gangliaCollectorHost = (HostResponse) CollectionUtils.find(hosts, new org.apache.commons.collections.Predicate() {
-
- @Override
- public boolean evaluate(Object hostResponse) {
- return ((HostResponse) hostResponse).getHostname().equals(gangliaCollectorHostName);
- }
- });
+
+ HostRequest hostRequest = new HostRequest(gangliaCollectorHostName, clusterName, Collections.<String, String>emptyMap());
+ Set<HostResponse> hosts = HostResourceProvider.getHosts(managementController, hostRequest);
+
+ gangliaCollectorHost = hosts.size() == 1 ? hosts.iterator().next() : null;
} catch (AmbariException e) {
LOG.debug("Error checking of Ganglia server host live status: ", e);
return false;
}
//Cluster without Ganglia
- if (gangliaCollectorHost == null)
- return false;
-
- return !gangliaCollectorHost.getHostState().equals(HostState.HEARTBEAT_LOST.name());
+ return gangliaCollectorHost != null && !gangliaCollectorHost.getHostState().equals(HostState.HEARTBEAT_LOST.name());
}
@Override
public boolean isGangliaCollectorComponentLive(String clusterName) throws SystemException {
- ServiceComponentHostResponse gangliaCollectorHostComponent = null;
+ ServiceComponentHostResponse gangliaCollectorHostComponent;
try {
final String gangliaCollectorHostName = getGangliaCollectorHostName(clusterName);
@@ -306,10 +297,8 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
}
//Cluster without Ganglia
- if (gangliaCollectorHostComponent == null)
- return false;
-
- return gangliaCollectorHostComponent.getLiveState().equals(State.STARTED.name());
+ return gangliaCollectorHostComponent != null &&
+ gangliaCollectorHostComponent.getLiveState().equals(State.STARTED.name());
}
@@ -738,7 +727,7 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
clusterName,
newCoreSiteConfigVersion, "core-site",
jmxDesiredProperties.get("NAMENODE"));
- jmxProtocolString = getJMXProtocolString(protocolMap.get("NAMENODE"), componentName);
+ jmxProtocolString = getJMXProtocolString(protocolMap.get("NAMENODE"));
clusterJmxProtocolMap.put(clusterName, jmxProtocolString);
}
@@ -765,7 +754,7 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
return jmxProtocolString;
}
- private String getJMXProtocolString(String value, String componentName) {
+ private String getJMXProtocolString(String value) {
return Boolean.valueOf(value) ? "https" : "http";
}
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
index 9659321..152f113 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
@@ -17,16 +17,29 @@
*/
package org.apache.ambari.server.controller.internal;
+import java.text.MessageFormat;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.ClusterNotFoundException;
+import org.apache.ambari.server.DuplicateResourceException;
+import org.apache.ambari.server.HostNotFoundException;
+import org.apache.ambari.server.ObjectNotFoundException;
+import org.apache.ambari.server.ParentObjectNotFoundException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.controller.AmbariManagementController;
import org.apache.ambari.server.controller.ConfigurationRequest;
import org.apache.ambari.server.controller.HostRequest;
import org.apache.ambari.server.controller.HostResponse;
+import org.apache.ambari.server.controller.ServiceComponentHostRequest;
+import org.apache.ambari.server.controller.ServiceComponentHostResponse;
import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
import org.apache.ambari.server.controller.spi.NoSuchResourceException;
import org.apache.ambari.server.controller.spi.Predicate;
@@ -37,6 +50,17 @@ import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
import org.apache.ambari.server.controller.spi.SystemException;
import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.ComponentInfo;
+import org.apache.ambari.server.state.Config;
+import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.HostHealthStatus;
+import org.apache.ambari.server.state.ServiceComponentHost;
+import org.apache.ambari.server.state.StackId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
@@ -119,7 +143,7 @@ class HostResourceProvider extends AbstractControllerResourceProvider {
createResources(new Command<Void>() {
@Override
public Void invoke() throws AmbariException {
- getManagementController().createHosts(requests);
+ createHosts(requests);
return null;
}
});
@@ -147,7 +171,7 @@ class HostResourceProvider extends AbstractControllerResourceProvider {
Set<HostResponse> responses = getResources(new Command<Set<HostResponse>>() {
@Override
public Set<HostResponse> invoke() throws AmbariException {
- return getManagementController().getHosts(requests);
+ return getHosts(requests);
}
});
@@ -157,13 +181,19 @@ class HostResourceProvider extends AbstractControllerResourceProvider {
for (HostResponse response : responses) {
Resource resource = new ResourceImpl(Resource.Type.Host);
+ String hostStatus;
+ try {
+ hostStatus = calculateHostStatus(response);
+ } catch (AmbariException e) {
+ throw new SystemException("", e);
+ }
+
// TODO : properly handle more than one cluster
if (response.getClusterName() != null
&& !response.getClusterName().isEmpty()) {
setResourceProperty(resource, HOST_CLUSTER_NAME_PROPERTY_ID,
response.getClusterName(), requestedIds);
}
-
setResourceProperty(resource, HOST_NAME_PROPERTY_ID,
response.getHostname(), requestedIds);
setResourceProperty(resource, HOST_PUBLIC_NAME_PROPERTY_ID,
@@ -189,7 +219,7 @@ class HostResourceProvider extends AbstractControllerResourceProvider {
setResourceProperty(resource, HOST_LAST_REGISTRATION_TIME_PROPERTY_ID,
response.getLastRegistrationTime(), requestedIds);
setResourceProperty(resource, HOST_HOST_STATUS_PROPERTY_ID,
- response.getHealthStatus().getHealthStatus().toString(),requestedIds);
+ hostStatus,requestedIds);
setResourceProperty(resource, HOST_HOST_HEALTH_REPORT_PROPERTY_ID,
response.getHealthStatus().getHealthReport(), requestedIds);
setResourceProperty(resource, HOST_DISK_INFO_PROPERTY_ID,
@@ -215,7 +245,7 @@ class HostResourceProvider extends AbstractControllerResourceProvider {
modifyResources(new Command<Void>() {
@Override
public Void invoke() throws AmbariException {
- getManagementController().updateHosts(requests);
+ updateHosts(requests);
return null;
}
});
@@ -237,7 +267,7 @@ class HostResourceProvider extends AbstractControllerResourceProvider {
modifyResources(new Command<Void>() {
@Override
public Void invoke() throws AmbariException {
- getManagementController().deleteHosts(requests);
+ deleteHosts(requests);
return null;
}
});
@@ -247,22 +277,23 @@ class HostResourceProvider extends AbstractControllerResourceProvider {
return getRequestStatus(null);
}
- // ----- utility methods -------------------------------------------------
+ @Override
+ public Set<String> checkPropertyIds(Set<String> propertyIds) {
+ Set<String> baseUnsupported = super.checkPropertyIds(propertyIds);
+
+ return checkConfigPropertyIds(baseUnsupported, "Hosts");
+ }
+
+
+ // ----- AbstractResourceProvider ------------------------------------------
@Override
protected Set<String> getPKPropertyIds() {
return pkPropertyIds;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Set<String> checkPropertyIds(Set<String> propertyIds) {
- Set<String> baseUnsupported = super.checkPropertyIds(propertyIds);
-
- return checkConfigPropertyIds(baseUnsupported, "Hosts");
- }
+
+
+ // ----- utility methods ---------------------------------------------------
/**
* Get a host request object from a map of property values.
@@ -290,4 +321,399 @@ class HostResourceProvider extends AbstractControllerResourceProvider {
return hostRequest;
}
+
+
+ protected synchronized void createHosts(Set<HostRequest> requests)
+ throws AmbariException {
+
+ if (requests.isEmpty()) {
+ LOG.warn("Received an empty requests set");
+ return;
+ }
+
+ AmbariManagementController controller = getManagementController();
+ Clusters clusters = controller.getClusters();
+
+ Set<String> duplicates = new HashSet<String>();
+ Set<String> unknowns = new HashSet<String>();
+ Set<String> allHosts = new HashSet<String>();
+ for (HostRequest request : requests) {
+ if (request.getHostname() == null
+ || request.getHostname().isEmpty()) {
+ throw new IllegalArgumentException("Invalid arguments, hostname"
+ + " cannot be null");
+ }
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Received a createHost request"
+ + ", hostname=" + request.getHostname()
+ + ", request=" + request);
+ }
+
+ if (allHosts.contains(request.getHostname())) {
+ // throw dup error later
+ duplicates.add(request.getHostname());
+ continue;
+ }
+ allHosts.add(request.getHostname());
+
+ try {
+ // ensure host is registered
+ clusters.getHost(request.getHostname());
+ }
+ catch (HostNotFoundException e) {
+ unknowns.add(request.getHostname());
+ continue;
+ }
+
+ if (request.getClusterName() != null) {
+ try {
+ // validate that cluster_name is valid
+ clusters.getCluster(request.getClusterName());
+ } catch (ClusterNotFoundException e) {
+ throw new ParentObjectNotFoundException("Attempted to add a host to a cluster which doesn't exist: "
+ + " clusterName=" + request.getClusterName());
+ }
+ }
+ }
+
+ if (!duplicates.isEmpty()) {
+ StringBuilder names = new StringBuilder();
+ boolean first = true;
+ for (String hName : duplicates) {
+ if (!first) {
+ names.append(",");
+ }
+ first = false;
+ names.append(hName);
+ }
+ throw new IllegalArgumentException("Invalid request contains"
+ + " duplicate hostnames"
+ + ", hostnames=" + names.toString());
+ }
+
+ if (!unknowns.isEmpty()) {
+ StringBuilder names = new StringBuilder();
+ boolean first = true;
+ for (String hName : unknowns) {
+ if (!first) {
+ names.append(",");
+ }
+ first = false;
+ names.append(hName);
+ }
+
+ throw new IllegalArgumentException("Attempted to add unknown hosts to a cluster. " +
+ "These hosts have not been registered with the server: " + names.toString());
+ }
+
+ Map<String, Set<String>> hostClustersMap = new HashMap<String, Set<String>>();
+ Map<String, Map<String, String>> hostAttributes = new HashMap<String, Map<String, String>>();
+ for (HostRequest request : requests) {
+ if (request.getHostname() != null) {
+ Set<String> clusterSet = new HashSet<String>();
+ clusterSet.add(request.getClusterName());
+ hostClustersMap.put(request.getHostname(), clusterSet);
+ if (request.getHostAttributes() != null) {
+ hostAttributes.put(request.getHostname(), request.getHostAttributes());
+ }
+ }
+ }
+ clusters.updateHostWithClusterAndAttributes(hostClustersMap, hostAttributes);
+ }
+
+
+ protected Set<HostResponse> getHosts(Set<HostRequest> requests)
+ throws AmbariException {
+ Set<HostResponse> response = new HashSet<HostResponse>();
+
+ AmbariManagementController controller = getManagementController();
+
+ for (HostRequest request : requests) {
+ try {
+ response.addAll(getHosts(controller, request));
+ } catch (HostNotFoundException e) {
+ if (requests.size() == 1) {
+ // only throw exception if 1 request.
+ // there will be > 1 request in case of OR predicate
+ throw e;
+ }
+ }
+ }
+ return response;
+ }
+
+ protected static synchronized Set<HostResponse> getHosts(AmbariManagementController controller, HostRequest request)
+ throws AmbariException {
+
+ //TODO/FIXME host can only belong to a single cluster so get host directly from Cluster
+ //TODO/FIXME what is the requirement for filtering on host attributes?
+
+ List<Host> hosts;
+ Set<HostResponse> response = new HashSet<HostResponse>();
+ Cluster cluster = null;
+
+ Clusters clusters = controller.getClusters();
+
+ String clusterName = request.getClusterName();
+ String hostName = request.getHostname();
+
+ if (clusterName != null) {
+ //validate that cluster exists, throws exception if it doesn't.
+ try {
+ cluster = clusters.getCluster(clusterName);
+ } catch (ObjectNotFoundException e) {
+ throw new ParentObjectNotFoundException("Parent Cluster resource doesn't exist", e);
+ }
+ }
+
+ if (hostName == null) {
+ hosts = clusters.getHosts();
+ } else {
+ hosts = new ArrayList<Host>();
+ try {
+ hosts.add(clusters.getHost(request.getHostname()));
+ } catch (HostNotFoundException e) {
+ // add cluster name
+ throw new HostNotFoundException(clusterName, hostName);
+ }
+ }
+
+
+ for (Host h : hosts) {
+ if (clusterName != null) {
+ if (clusters.getClustersForHost(h.getHostName()).contains(cluster)) {
+ HostResponse r = h.convertToResponse();
+ r.setClusterName(clusterName);
+ r.setDesiredConfigs(h.getDesiredConfigs(cluster.getClusterId()));
+
+ response.add(r);
+ } else if (hostName != null) {
+ throw new HostNotFoundException(clusterName, hostName);
+ }
+ } else {
+ HostResponse r = h.convertToResponse();
+
+ Set<Cluster> clustersForHost = clusters.getClustersForHost(h.getHostName());
+ //todo: host can only belong to a single cluster
+ if (clustersForHost != null && clustersForHost.size() != 0) {
+ r.setClusterName(clustersForHost.iterator().next().getClusterName());
+ }
+ response.add(r);
+ }
+ }
+ return response;
+ }
+
+ protected synchronized void updateHosts(Set<HostRequest> requests)
+ throws AmbariException {
+
+ if (requests.isEmpty()) {
+ LOG.warn("Received an empty requests set");
+ return;
+ }
+
+ AmbariManagementController controller = getManagementController();
+ Clusters clusters = controller.getClusters();
+
+ for (HostRequest request : requests) {
+ if (request.getHostname() == null
+ || request.getHostname().isEmpty()) {
+ throw new IllegalArgumentException("Invalid arguments, hostname should"
+ + " be provided");
+ }
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Received a updateHost request"
+ + ", hostname=" + request.getHostname()
+ + ", request=" + request);
+ }
+
+ Host h = clusters.getHost(request.getHostname());
+
+ try {
+ //todo: the below method throws an exception when trying to create a duplicate mapping.
+ //todo: this is done to detect duplicates during host create. Unless it is allowable to
+ //todo: add a host to a cluster by modifying the cluster_name prop, we should not do this mapping here.
+ //todo: Determine if it is allowable to associate a host to a cluster via this mechanism.
+ clusters.mapHostToCluster(request.getHostname(), request.getClusterName());
+ } catch (DuplicateResourceException e) {
+ // do nothing
+ }
+
+ if (null != request.getHostAttributes())
+ h.setHostAttributes(request.getHostAttributes());
+
+ if (null != request.getRackInfo()) {
+ h.setRackInfo(request.getRackInfo());
+ }
+
+ if (null != request.getPublicHostName()) {
+ h.setPublicHostName(request.getPublicHostName());
+ }
+
+ if (null != request.getClusterName() && null != request.getDesiredConfig()) {
+ Cluster c = clusters.getCluster(request.getClusterName());
+
+ if (clusters.getHostsForCluster(request.getClusterName()).containsKey(h.getHostName())) {
+
+ ConfigurationRequest cr = request.getDesiredConfig();
+
+ if (null != cr.getProperties() && cr.getProperties().size() > 0) {
+ LOG.info(MessageFormat.format("Applying configuration with tag ''{0}'' to host ''{1}'' in cluster ''{2}''",
+ cr.getVersionTag(),
+ request.getHostname(),
+ request.getClusterName()));
+
+ cr.setClusterName(c.getClusterName());
+ controller.createConfiguration(cr);
+ }
+
+ Config baseConfig = c.getConfig(cr.getType(), cr.getVersionTag());
+ if (null != baseConfig) {
+ String authName = controller.getAuthName();
+ DesiredConfig oldConfig = h.getDesiredConfigs(c.getClusterId()).get(cr.getType());
+
+ if (h.addDesiredConfig(c.getClusterId(), cr.isSelected(), authName, baseConfig)) {
+ Logger logger = LoggerFactory.getLogger("configchange");
+ logger.info("cluster '" + c.getClusterName() + "', "
+ + "host '" + h.getHostName() + "' "
+ + "changed by: '" + authName + "'; "
+ + "type='" + baseConfig.getType() + "' "
+ + "tag='" + baseConfig.getVersionTag() + "'"
+ + (null == oldConfig ? "" : ", from='" + oldConfig.getVersion() + "'"));
+ }
+ }
+
+ }
+ }
+ //todo: if attempt was made to update a property other than those
+ //todo: that are allowed above, should throw exception
+ }
+ }
+
+
+ protected void deleteHosts(Set<HostRequest> requests)
+ throws AmbariException {
+
+ AmbariManagementController controller = getManagementController();
+ Clusters clusters = controller.getClusters();
+
+ List<HostRequest> okToRemove = new ArrayList<HostRequest>();
+
+ for (HostRequest hostRequest : requests) {
+ String hostName = hostRequest.getHostname();
+ if (null == hostName)
+ continue;
+
+ if (null != hostRequest.getClusterName()) {
+ Cluster cluster = clusters.getCluster(hostRequest.getClusterName());
+
+ List<ServiceComponentHost> list = cluster.getServiceComponentHosts(hostName);
+
+ if (0 != list.size()) {
+ StringBuilder reason = new StringBuilder("Cannot remove host ")
+ .append(hostName)
+ .append(" from ")
+ .append(hostRequest.getClusterName())
+ .append(". The following roles exist: ");
+
+ int i = 0;
+ for (ServiceComponentHost sch : list) {
+ if ((i++) > 0)
+ reason.append(", ");
+ reason.append(sch.getServiceComponentName());
+ }
+
+ throw new AmbariException(reason.toString());
+ }
+ okToRemove.add(hostRequest);
+
+ } else {
+ // check if host exists (throws exception if not found)
+ clusters.getHost(hostName);
+
+ // delete host outright
+ Set<Cluster> clusterSet = clusters.getClustersForHost(hostName);
+ if (0 != clusterSet.size()) {
+ StringBuilder reason = new StringBuilder("Cannot remove host ")
+ .append(hostName)
+ .append(". It belongs to clusters: ");
+ int i = 0;
+ for (Cluster c : clusterSet) {
+ if ((i++) > 0)
+ reason.append(", ");
+ reason.append(c.getClusterName());
+ }
+ throw new AmbariException(reason.toString());
+ }
+ okToRemove.add(hostRequest);
+ }
+ }
+
+ for (HostRequest hostRequest : okToRemove) {
+ if (null != hostRequest.getClusterName()) {
+ clusters.unmapHostFromCluster(hostRequest.getHostname(),
+ hostRequest.getClusterName());
+ } else {
+ clusters.deleteHost(hostRequest.getHostname());
+ }
+ }
+ }
+
+ // calculate the host status, accounting for the state of the host components
+ private String calculateHostStatus(HostResponse response) throws AmbariException {
+ HostHealthStatus.HealthStatus healthStatus = response.getHealthStatus().getHealthStatus();
+
+ if (!healthStatus.equals(HostHealthStatus.HealthStatus.UNKNOWN)) {
+ AmbariManagementController controller = getManagementController();
+ AmbariMetaInfo ambariMetaInfo = controller.getAmbariMetaInfo();
+ Clusters clusters = controller.getClusters();
+ Cluster cluster = clusters.getCluster(response.getClusterName());
+ StackId stackId = cluster.getDesiredStackVersion();
+
+ ServiceComponentHostRequest request = new ServiceComponentHostRequest(response.getClusterName(),
+ null, null, response.getHostname(), null, null);
+
+ Set<ServiceComponentHostResponse> hostComponentResponses =
+ controller.getHostComponents(Collections.singleton(request));
+
+ int masterCount = 0;
+ int mastersRunning = 0;
+ int slaveCount = 0;
+ int slavesRunning = 0;
+
+ for (ServiceComponentHostResponse hostComponentResponse : hostComponentResponses ) {
+ ComponentInfo componentInfo = ambariMetaInfo.getComponentCategory(stackId.getStackName(),
+ stackId.getStackVersion(), hostComponentResponse.getServiceName(),
+ hostComponentResponse.getComponentName());
+
+ if (componentInfo != null) {
+ String category = componentInfo.getCategory();
+ String state = hostComponentResponse.getLiveState();
+
+ if (category.equals("MASTER")) {
+ ++masterCount;
+ if (state.equals("STARTED")) {
+ ++mastersRunning;
+ }
+ } else if (category.equals("SLAVE")) {
+ ++slaveCount;
+ if (state.equals("STARTED")) {
+ ++slavesRunning;
+ }
+ }
+ }
+ }
+
+ if (masterCount == mastersRunning && slaveCount == slavesRunning) {
+ healthStatus = HostHealthStatus.HealthStatus.HEALTHY;
+ } else if (masterCount > 0 && mastersRunning < masterCount ) {
+ healthStatus = HostHealthStatus.HealthStatus.UNHEALTHY;
+ } else {
+ healthStatus = HostHealthStatus.HealthStatus.ALERT;
+ }
+ }
+ return healthStatus.toString();
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
index 98a65bc..5d5691f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
@@ -26,6 +26,8 @@ import java.util.Set;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.HostRequest;
+import org.apache.ambari.server.controller.HostResponse;
import org.apache.ambari.server.controller.RootServiceHostComponentRequest;
import org.apache.ambari.server.controller.RootServiceHostComponentResponse;
import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
@@ -78,7 +80,7 @@ public class RootServiceHostComponentResourceProvider extends
Set<RootServiceHostComponentResponse> responses = getResources(new Command<Set<RootServiceHostComponentResponse>>() {
@Override
public Set<RootServiceHostComponentResponse> invoke() throws AmbariException {
- return getManagementController().getRootServiceHostComponents(
+ return getRootServiceHostComponents(
Collections.singleton(rootServiceComponentRequest));
}
});
@@ -123,4 +125,33 @@ public class RootServiceHostComponentResourceProvider extends
return pkPropertyIds;
}
+ // Get the root service host components for the given set of requests
+ protected Set<RootServiceHostComponentResponse> getRootServiceHostComponents(
+ Set<RootServiceHostComponentRequest> requests) throws AmbariException {
+ Set<RootServiceHostComponentResponse> response = new HashSet<RootServiceHostComponentResponse>();
+ for (RootServiceHostComponentRequest request : requests) {
+ try {
+ response.addAll(getRootServiceHostComponents(request));
+ } catch (AmbariException e) {
+ if (requests.size() == 1) {
+ // only throw exception if 1 request.
+ // there will be > 1 request in case of OR predicate
+ throw e;
+ }
+ }
+ }
+ return response;
+ }
+
+ // Get the root service host components for the given request
+ private Set<RootServiceHostComponentResponse> getRootServiceHostComponents(
+ RootServiceHostComponentRequest request) throws AmbariException{
+
+ AmbariManagementController controller = getManagementController();
+ //Get all hosts of all clusters
+ Set<HostResponse> hosts = HostResourceProvider.getHosts(controller,
+ new HostRequest(request.getHostName(), null, null));
+
+ return controller.getRootServiceResponseFactory().getRootServiceHostComponent(request, hosts);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/main/java/org/apache/ambari/server/state/HostHealthStatus.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/HostHealthStatus.java b/ambari-server/src/main/java/org/apache/ambari/server/state/HostHealthStatus.java
index 5e202b6..fb8fe96 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/HostHealthStatus.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/HostHealthStatus.java
@@ -47,9 +47,9 @@ public class HostHealthStatus {
}
public static enum HealthStatus {
- UNKNOWN,
- HEALTHY,
- UNHEALTHY
+ UNKNOWN, // lost heartbeat
+ HEALTHY, // all masters and slaves are live
+ UNHEALTHY, // at least one master is dead
+ ALERT // at least one slave is dead
}
-
}
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
index 95143ee..ca6c86b 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
@@ -264,210 +264,6 @@ public class AmbariManagementControllerImplTest {
}
@Test
- public void testGetHosts() throws Exception {
- // member state mocks
- Injector injector = createStrictMock(Injector.class);
- Capture<AmbariManagementController> controllerCapture = new Capture<AmbariManagementController>();
- Clusters clusters = createNiceMock(Clusters.class);
-
- Cluster cluster = createNiceMock(Cluster.class);
- Host host = createNiceMock(Host.class);
- HostResponse response = createNiceMock(HostResponse.class);
-
- Set<Cluster> setCluster = Collections.singleton(cluster);
-
- // requests
- HostRequest request1 = new HostRequest("host1", "cluster1", Collections.<String, String>emptyMap());
-
- Set<HostRequest> setRequests = new HashSet<HostRequest>();
- setRequests.add(request1);
-
- // expectations
- // constructor init
- injector.injectMembers(capture(controllerCapture));
- expect(injector.getInstance(Gson.class)).andReturn(null);
-
- // getHosts
- expect(clusters.getCluster("cluster1")).andReturn(cluster);
- expect(clusters.getHost("host1")).andReturn(host);
- expect(host.getHostName()).andReturn("host1").anyTimes();
- expect(clusters.getClustersForHost("host1")).andReturn(setCluster);
- expect(host.convertToResponse()).andReturn(response);
- response.setClusterName("cluster1");
-
- // replay mocks
- replay(injector, clusters, cluster, host, response);
-
- //test
- AmbariManagementController controller = new AmbariManagementControllerImpl(null, clusters, injector);
- Set<HostResponse> setResponses = controller.getHosts(setRequests);
-
- // assert and verify
- assertSame(controller, controllerCapture.getValue());
- assertEquals(1, setResponses.size());
- assertTrue(setResponses.contains(response));
-
- verify(injector, clusters, cluster, host, response);
- }
-
- /**
- * Ensure that HostNotFoundException is propagated in case where there is a single request.
- */
- @Test
- public void testGetHosts___HostNotFoundException() throws Exception {
- // member state mocks
- Injector injector = createStrictMock(Injector.class);
- Capture<AmbariManagementController> controllerCapture = new Capture<AmbariManagementController>();
- Clusters clusters = createNiceMock(Clusters.class);
-
- Cluster cluster = createNiceMock(Cluster.class);
-
- // requests
- HostRequest request1 = new HostRequest("host1", "cluster1", Collections.<String, String>emptyMap());
- Set<HostRequest> setRequests = Collections.singleton(request1);
-
- // expectations
- // constructor init
- injector.injectMembers(capture(controllerCapture));
- expect(injector.getInstance(Gson.class)).andReturn(null);
-
- // getHosts
- expect(clusters.getCluster("cluster1")).andReturn(cluster);
- expect(clusters.getHost("host1")).andThrow(new HostNotFoundException("host1"));
-
- // replay mocks
- replay(injector, clusters, cluster);
-
- //test
- AmbariManagementController controller = new AmbariManagementControllerImpl(null, clusters, injector);
-
- // assert that exception is thrown in case where there is a single request
- try {
- controller.getHosts(setRequests);
- fail("expected HostNotFoundException");
- } catch (HostNotFoundException e) {
- // expected
- }
- assertSame(controller, controllerCapture.getValue());
- verify(injector, clusters, cluster);
- }
-
- /**
- * Ensure that HostNotFoundException is propagated in case where there is a single request.
- */
- @Test
- public void testGetHosts___HostNotFoundException_HostNotAssociatedWithCluster() throws Exception {
- // member state mocks
- Injector injector = createStrictMock(Injector.class);
- Capture<AmbariManagementController> controllerCapture = new Capture<AmbariManagementController>();
- Clusters clusters = createNiceMock(Clusters.class);
-
- Cluster cluster = createNiceMock(Cluster.class);
- Host host = createNiceMock(Host.class);
-
- // requests
- HostRequest request1 = new HostRequest("host1", "cluster1", Collections.<String, String>emptyMap());
- Set<HostRequest> setRequests = Collections.singleton(request1);
-
- // expectations
- // constructor init
- injector.injectMembers(capture(controllerCapture));
- expect(injector.getInstance(Gson.class)).andReturn(null);
-
- // getHosts
- expect(clusters.getCluster("cluster1")).andReturn(cluster);
- expect(clusters.getHost("host1")).andReturn(host);
- expect(host.getHostName()).andReturn("host1").anyTimes();
- // because cluster is not in set will result in HostNotFoundException
- expect(clusters.getClustersForHost("host1")).andReturn(Collections.<Cluster>emptySet());
-
- // replay mocks
- replay(injector, clusters, cluster, host);
-
- //test
- AmbariManagementController controller = new AmbariManagementControllerImpl(null, clusters, injector);
-
- // assert that exception is thrown in case where there is a single request
- try {
- controller.getHosts(setRequests);
- fail("expected HostNotFoundException");
- } catch (HostNotFoundException e) {
- // expected
- }
- assertSame(controller, controllerCapture.getValue());
- verify(injector, clusters, cluster, host);
- }
-
-
- /**
- * Ensure that HostNotFoundException is handled where there are multiple requests as would be the
- * case when an OR predicate is provided in the query.
- */
- @Test
- public void testGetHosts___OR_Predicate_HostNotFoundException() throws Exception {
- // member state mocks
- Injector injector = createStrictMock(Injector.class);
- Capture<AmbariManagementController> controllerCapture = new Capture<AmbariManagementController>();
- Clusters clusters = createNiceMock(Clusters.class);
-
- Cluster cluster = createNiceMock(Cluster.class);
- Host host1 = createNiceMock(Host.class);
- Host host2 = createNiceMock(Host.class);
- HostResponse response = createNiceMock(HostResponse.class);
- HostResponse response2 = createNiceMock(HostResponse.class);
-
- // requests
- HostRequest request1 = new HostRequest("host1", "cluster1", Collections.<String, String>emptyMap());
- HostRequest request2 = new HostRequest("host2", "cluster1", Collections.<String, String>emptyMap());
- HostRequest request3 = new HostRequest("host3", "cluster1", Collections.<String, String>emptyMap());
- HostRequest request4 = new HostRequest("host4", "cluster1", Collections.<String, String>emptyMap());
-
- Set<HostRequest> setRequests = new HashSet<HostRequest>();
- setRequests.add(request1);
- setRequests.add(request2);
- setRequests.add(request3);
- setRequests.add(request4);
-
- // expectations
- // constructor init
- injector.injectMembers(capture(controllerCapture));
- expect(injector.getInstance(Gson.class)).andReturn(null);
-
- // getHosts
- expect(clusters.getCluster("cluster1")).andReturn(cluster).times(4);
-
- expect(clusters.getHost("host1")).andReturn(host1);
- expect(host1.getHostName()).andReturn("host1").anyTimes();
- expect(clusters.getClustersForHost("host1")).andReturn(Collections.singleton(cluster));
- expect(host1.convertToResponse()).andReturn(response);
- response.setClusterName("cluster1");
-
- expect(clusters.getHost("host2")).andReturn(host2);
- expect(host2.getHostName()).andReturn("host2").anyTimes();
- expect(clusters.getClustersForHost("host2")).andReturn(Collections.singleton(cluster));
- expect(host2.convertToResponse()).andReturn(response2);
- response2.setClusterName("cluster1");
-
- expect(clusters.getHost("host3")).andThrow(new HostNotFoundException("host3"));
- expect(clusters.getHost("host4")).andThrow(new HostNotFoundException("host4"));
-
- // replay mocks
- replay(injector, clusters, cluster, host1, host2, response, response2);
-
- //test
- AmbariManagementController controller = new AmbariManagementControllerImpl(null, clusters, injector);
- Set<HostResponse> setResponses = controller.getHosts(setRequests);
-
- // assert and verify
- assertSame(controller, controllerCapture.getValue());
- assertEquals(2, setResponses.size());
- assertTrue(setResponses.contains(response));
- assertTrue(setResponses.contains(response2));
-
- verify(injector, clusters, cluster, host1, host2, response, response2);
- }
-
- @Test
public void testGetHostComponents() throws Exception {
// member state mocks
Injector injector = createStrictMock(Injector.class);
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index 1e8551a..b9d6d86 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -44,6 +44,7 @@ import org.apache.ambari.server.agent.ExecutionCommand;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.configuration.Configuration;
import org.apache.ambari.server.controller.internal.ComponentResourceProviderTest;
+import org.apache.ambari.server.controller.internal.HostResourceProviderTest;
import org.apache.ambari.server.controller.internal.ServiceResourceProviderTest;
import org.apache.ambari.server.orm.GuiceJpaInitializer;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
@@ -1325,7 +1326,7 @@ public class AmbariManagementControllerTest {
Set<HostRequest> requests = new HashSet<HostRequest>();
requests.add(r1);
try {
- controller.createHosts(requests);
+ HostResourceProviderTest.createHosts(controller, requests);
fail("Create host should fail for non-bootstrapped host");
} catch (Exception e) {
// Expected
@@ -1341,7 +1342,7 @@ public class AmbariManagementControllerTest {
requests.add(new HostRequest("h2", "foo", new HashMap<String, String>()));
try {
- controller.createHosts(requests);
+ HostResourceProviderTest.createHosts(controller, requests);
fail("Create host should fail for invalid clusters");
} catch (Exception e) {
// Expected
@@ -1350,7 +1351,7 @@ public class AmbariManagementControllerTest {
clusters.addCluster("foo");
clusters.getCluster("foo").setDesiredStackVersion(new StackId("HDP-0.1"));
- controller.createHosts(requests);
+ HostResourceProviderTest.createHosts(controller, requests);
Assert.assertNotNull(clusters.getHost("h1"));
Assert.assertNotNull(clusters.getHost("h2"));
@@ -1389,7 +1390,7 @@ public class AmbariManagementControllerTest {
set1.add(r1);
set1.add(r2);
set1.add(r3);
- controller.createHosts(set1);
+ HostResourceProviderTest.createHosts(controller, set1);
Assert.assertEquals(1, clusters.getClustersForHost("h1").size());
Assert.assertEquals(1, clusters.getClustersForHost("h2").size());
@@ -1416,7 +1417,7 @@ public class AmbariManagementControllerTest {
HostRequest rInvalid =
new HostRequest("h1", null, null);
set1.add(rInvalid);
- controller.createHosts(set1);
+ HostResourceProviderTest.createHosts(controller, set1);
fail("Expected failure for invalid host");
} catch (Exception e) {
// Expected
@@ -1431,7 +1432,7 @@ public class AmbariManagementControllerTest {
HostRequest rInvalid =
new HostRequest("h1", clusterName, null);
set1.add(rInvalid);
- controller.createHosts(set1);
+ HostResourceProviderTest.createHosts(controller, set1);
fail("Expected failure for invalid cluster");
} catch (Exception e) {
// Expected
@@ -1447,7 +1448,7 @@ public class AmbariManagementControllerTest {
new HostRequest("h1", clusterName, null);
set1.add(rInvalid1);
set1.add(rInvalid2);
- controller.createHosts(set1);
+ HostResourceProviderTest.createHosts(controller, set1);
fail("Expected failure for dup requests");
} catch (Exception e) {
// Expected
@@ -2288,7 +2289,7 @@ public class AmbariManagementControllerTest {
HostRequest r = new HostRequest(null, null, null);
- Set<HostResponse> resps = controller.getHosts(Collections.singleton(r));
+ Set<HostResponse> resps = HostResourceProviderTest.getHosts(controller, Collections.singleton(r));
Assert.assertEquals(4, resps.size());
@@ -2317,7 +2318,7 @@ public class AmbariManagementControllerTest {
Assert.assertEquals(4, foundHosts.size());
r = new HostRequest("h1", null, null);
- resps = controller.getHosts(Collections.singleton(r));
+ resps = HostResourceProviderTest.getHosts(controller, Collections.singleton(r));
Assert.assertEquals(1, resps.size());
HostResponse resp = resps.iterator().next();
Assert.assertEquals("h1", resp.getHostname());
@@ -7088,7 +7089,7 @@ public class AmbariManagementControllerTest {
requests.clear();
requests.add(new HostRequest(host1, clusterName, null));
try {
- controller.deleteHosts(requests);
+ HostResourceProviderTest.deleteHosts(controller, requests);
fail("Expect failure deleting hosts when components exist.");
} catch (Exception e) {
}
@@ -7112,7 +7113,7 @@ public class AmbariManagementControllerTest {
requests.clear();
requests.add(new HostRequest(host1, null, null));
try {
- controller.deleteHosts(requests);
+ HostResourceProviderTest.deleteHosts(controller, requests);
fail("Expect failure when removing from host when it is part of a cluster.");
} catch (Exception e) {
}
@@ -7120,7 +7121,7 @@ public class AmbariManagementControllerTest {
// delete host from cluster
requests.clear();
requests.add(new HostRequest(host1, clusterName, null));
- controller.deleteHosts(requests);
+ HostResourceProviderTest.deleteHosts(controller, requests);
// host is no longer part of the cluster
Assert.assertFalse(clusters.getHostsForCluster(clusterName).containsKey(host1));
@@ -7129,7 +7130,7 @@ public class AmbariManagementControllerTest {
// delete entirely
requests.clear();
requests.add(new HostRequest(host1, null, null));
- controller.deleteHosts(requests);
+ HostResourceProviderTest.deleteHosts(controller, requests);
// verify host does not exist
try {
@@ -7142,7 +7143,7 @@ public class AmbariManagementControllerTest {
// remove host2
requests.clear();
requests.add(new HostRequest(host2, null, null));
- controller.deleteHosts(requests);
+ HostResourceProviderTest.deleteHosts(controller, requests);
// verify host does not exist
try {
@@ -7156,7 +7157,7 @@ public class AmbariManagementControllerTest {
requests.clear();
requests.add(new HostRequest(host3, null, null));
try {
- controller.deleteHosts(requests);
+ HostResourceProviderTest.deleteHosts(controller, requests);
Assert.fail("Expected a HostNotFoundException trying to remove a host that was never added.");
} catch (HostNotFoundException e) {
// expected
@@ -7456,7 +7457,7 @@ public class AmbariManagementControllerTest {
// add some hosts
Set<HostRequest> hrs = new HashSet<HostRequest>();
hrs.add(new HostRequest(HOST1, CLUSTER_NAME, null));
- amc.createHosts(hrs);
+ HostResourceProviderTest.createHosts(amc, hrs);
Set<ServiceRequest> serviceRequests = new HashSet<ServiceRequest>();
serviceRequests.add(new ServiceRequest(CLUSTER_NAME, "HDFS", null, null));
@@ -7595,7 +7596,7 @@ public class AmbariManagementControllerTest {
hostRequests.add(new HostRequest("host2", "c1", null));
hostRequests.add(new HostRequest("host3", "c1", null));
- amc.createHosts(hostRequests);
+ HostResourceProviderTest.createHosts(amc, hostRequests);
Set<ServiceComponentHostRequest> componentHostRequests = new HashSet<ServiceComponentHostRequest>();
componentHostRequests.add(new ServiceComponentHostRequest("c1", null, "DATANODE", "host1", null, null));
@@ -7868,7 +7869,7 @@ public class AmbariManagementControllerTest {
Set<HostRequest> hostRequests = new HashSet<HostRequest>();
hostRequests.add(new HostRequest(HOST1, CLUSTER_NAME, null));
- amc.createHosts(hostRequests);
+ HostResourceProviderTest.createHosts(amc, hostRequests);
Set<ServiceComponentHostRequest> componentHostRequests = new HashSet<ServiceComponentHostRequest>();
componentHostRequests.add(new ServiceComponentHostRequest(CLUSTER_NAME, null, "DATANODE", HOST1, null, null));