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:49 UTC

[1/2] AMBARI-3670 - Hosts should roll up host_components status into its status

Updated Branches:
  refs/heads/trunk c13df4d7d -> 69010c808


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java
index 88d8d40..cbdcb0e 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java
@@ -18,32 +18,55 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import com.google.gson.Gson;
+import com.google.inject.Injector;
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.HostNotFoundException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.AmbariManagementController;
-import org.apache.ambari.server.controller.HostRequest;
+import org.apache.ambari.server.controller.AmbariManagementControllerImpl;
 import org.apache.ambari.server.controller.HostResponse;
 import org.apache.ambari.server.controller.RequestStatusResponse;
+import org.apache.ambari.server.controller.HostRequest;
+import org.apache.ambari.server.controller.ServiceComponentHostRequest;
+import org.apache.ambari.server.controller.ServiceComponentHostResponse;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 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.Host;
 import org.apache.ambari.server.state.HostHealthStatus;
-import org.easymock.EasyMock;
+import org.apache.ambari.server.state.StackId;
+import org.easymock.Capture;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.createStrictMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 /**
  * HostResourceProvider tests.
@@ -54,13 +77,13 @@ public class HostResourceProviderTest {
     Resource.Type type = Resource.Type.Host;
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    Clusters clusters = createNiceMock(Clusters.class);
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
 
-    managementController.createHosts(
-        AbstractResourceProviderTest.Matcher.getHostRequestSet("Host100", "Cluster100", null));
+    expect(managementController.getClusters()).andReturn(clusters);
 
     // replay
-    replay(managementController, response);
+    replay(managementController, response, clusters);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
@@ -85,7 +108,7 @@ public class HostResourceProviderTest {
     provider.createResources(request);
 
     // verify
-    verify(managementController, response);
+    verify(managementController, response, clusters);
   }
 
   @Test
@@ -93,28 +116,65 @@ public class HostResourceProviderTest {
     Resource.Type type = Resource.Type.Host;
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Host host1 = createNiceMock(Host.class);
+    Host host2 = createNiceMock(Host.class);
+    Host host3 = createNiceMock(Host.class);
+    HostHealthStatus healthStatus = createNiceMock(HostHealthStatus.class);
+    AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
+
+    HostResponse hostResponse1 = createNiceMock(HostResponse.class);
+    HostResponse hostResponse2 = createNiceMock(HostResponse.class);
+    HostResponse hostResponse3 = createNiceMock(HostResponse.class);
 
-    Set<HostResponse> allResponse = new HashSet<HostResponse>();
-    allResponse.add(new HostResponse("Host100", "Cluster100",
-        "", "", 2, 1, "", "", "", 100000L, 200000L, null, 10L,
-        0L, "rack info", null, null,
-        new HostHealthStatus(HostHealthStatus.HealthStatus.HEALTHY, "HEALTHY"), "HEALTHY"));
-    allResponse.add(new HostResponse("Host101", "Cluster100",
-        "", "", 2, 1, "", "", "", 100000L, 200000L, null, 10L,
-        0L, "rack info", null, null,
-        new HostHealthStatus(HostHealthStatus.HealthStatus.HEALTHY, "HEALTHY"), "HEALTHY"));
-    allResponse.add(new HostResponse("Host102", "Cluster100",
-        "", "", 2, 1, "", "", "", 100000L, 200000L, null, 10L,
-        0L, "rack info", null, null,
-        new HostHealthStatus(HostHealthStatus.HealthStatus.HEALTHY, "HEALTHY"), "HEALTHY"));
+    List<Host> hosts = new LinkedList<Host>();
+    hosts.add(host1);
+    hosts.add(host2);
+    hosts.add(host3);
+
+    Set<Cluster> clusterSet = new HashSet<Cluster>();
+    clusterSet.add(cluster);
 
     // set expectations
-    expect(managementController.getHosts(
-        AbstractResourceProviderTest.Matcher.getHostRequestSet(null, "Cluster100", null))).
-        andReturn(allResponse).once();
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+    expect(managementController.getHostComponents((Set<ServiceComponentHostRequest>) anyObject())).andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
+
+    expect(clusters.getHosts()).andReturn(hosts).anyTimes();
+
+    expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
+
+    expect(clusters.getClustersForHost("Host100")).andReturn(clusterSet).anyTimes();
+    expect(clusters.getClustersForHost("Host101")).andReturn(clusterSet).anyTimes();
+    expect(clusters.getClustersForHost("Host102")).andReturn(clusterSet).anyTimes();
+
+    expect(host1.getHostName()).andReturn("Host100").anyTimes();
+    expect(host2.getHostName()).andReturn("Host101").anyTimes();
+    expect(host3.getHostName()).andReturn("Host102").anyTimes();
+
+    expect(host1.convertToResponse()).andReturn(hostResponse1);
+    expect(host2.convertToResponse()).andReturn(hostResponse2);
+    expect(host3.convertToResponse()).andReturn(hostResponse3);
+
+    expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse2.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse3.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
+    expect(hostResponse2.getHostname()).andReturn("Host101").anyTimes();
+    expect(hostResponse3.getHostname()).andReturn("Host102").anyTimes();
+    expect(hostResponse1.getHealthStatus()).andReturn(healthStatus).anyTimes();
+    expect(hostResponse2.getHealthStatus()).andReturn(healthStatus).anyTimes();
+    expect(hostResponse3.getHealthStatus()).andReturn(healthStatus).anyTimes();
+
+    expect(healthStatus.getHealthStatus()).andReturn(HostHealthStatus.HealthStatus.HEALTHY).anyTimes();
+    expect(healthStatus.getHealthReport()).andReturn("HEALTHY").anyTimes();
 
     // replay
-    replay(managementController);
+    replay(managementController, clusters, cluster,
+        host1, host2, host3,
+        hostResponse1, hostResponse2, hostResponse3,
+        healthStatus, ambariMetaInfo);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
@@ -134,44 +194,444 @@ public class HostResourceProviderTest {
     Set<Resource> resources = provider.getResources(request, predicate);
 
     Assert.assertEquals(3, resources.size());
-    Set<String> names = new HashSet<String>();
     for (Resource resource : resources) {
       String clusterName = (String) resource.getPropertyValue(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID);
       Assert.assertEquals("Cluster100", clusterName);
-      names.add((String) resource.getPropertyValue(HostResourceProvider.HOST_NAME_PROPERTY_ID));
     }
-    // Make sure that all of the response objects got moved into resources
-    for (HostResponse response : allResponse ) {
-      Assert.assertTrue(names.contains(response.getHostname()));
+
+    // verify
+    verify(managementController, clusters, cluster,
+        host1, host2, host3,
+        hostResponse1, hostResponse2, hostResponse3,
+        healthStatus, ambariMetaInfo);
+  }
+
+  @Test
+  public void testGetResources_Status_Healthy() throws Exception {
+    Resource.Type type = Resource.Type.Host;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Host host1 = createNiceMock(Host.class);
+    HostHealthStatus healthStatus = createNiceMock(HostHealthStatus.class);
+    AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
+    StackId stackId = createNiceMock(StackId.class);
+    ComponentInfo componentInfo = createNiceMock(ComponentInfo.class);
+
+    HostResponse hostResponse1 = createNiceMock(HostResponse.class);
+
+    List<Host> hosts = new LinkedList<Host>();
+    hosts.add(host1);
+
+    Set<Cluster> clusterSet = new HashSet<Cluster>();
+    clusterSet.add(cluster);
+
+    ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("Cluster100", "Service100", "Component100", "Host100", null, null, "STARTED", "", null, null);
+    ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("Cluster100", "Service100", "Component102", "Host100", null, null, "STARTED", "", null, null);
+    ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("Cluster100", "Service100", "Component103", "Host100", null, null, "STARTED", "", null, null);
+
+    Set<ServiceComponentHostResponse> responses = new HashSet<ServiceComponentHostResponse>();
+    responses.add(shr1);
+    responses.add(shr2);
+    responses.add(shr3);
+
+    // set expectations
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+    expect(managementController.getHostComponents((Set<ServiceComponentHostRequest>) anyObject())).andReturn(responses).anyTimes();
+
+    expect(clusters.getHosts()).andReturn(hosts).anyTimes();
+
+    expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
+
+    expect(clusters.getClustersForHost("Host100")).andReturn(clusterSet).anyTimes();
+
+    expect(cluster.getDesiredStackVersion()).andReturn(stackId);
+
+    expect(host1.getHostName()).andReturn("Host100").anyTimes();
+
+    expect(host1.convertToResponse()).andReturn(hostResponse1);
+
+    expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
+    expect(hostResponse1.getHealthStatus()).andReturn(healthStatus).anyTimes();
+
+    expect(healthStatus.getHealthStatus()).andReturn(HostHealthStatus.HealthStatus.HEALTHY).anyTimes();
+    expect(healthStatus.getHealthReport()).andReturn("HEALTHY").anyTimes();
+
+
+    expect(ambariMetaInfo.getComponentCategory((String) anyObject(), (String) anyObject(),
+        (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes();
+
+    expect(componentInfo.getCategory()).andReturn("MASTER").anyTimes();
+
+
+    // replay
+    replay(managementController, clusters, cluster,
+        host1,
+        hostResponse1, stackId, componentInfo,
+        healthStatus, ambariMetaInfo);
+
+    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+
+    Set<String> propertyIds = new HashSet<String>();
+
+    propertyIds.add(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID);
+    propertyIds.add(HostResourceProvider.HOST_NAME_PROPERTY_ID);
+    propertyIds.add(HostResourceProvider.HOST_HOST_STATUS_PROPERTY_ID);
+
+    Predicate predicate =
+        new PredicateBuilder().property(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").
+            toPredicate();
+    Request request = PropertyHelper.getReadRequest(propertyIds);
+    Set<Resource> resources = provider.getResources(request, predicate);
+
+    Assert.assertEquals(1, resources.size());
+    for (Resource resource : resources) {
+      String clusterName = (String) resource.getPropertyValue(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID);
+      Assert.assertEquals("Cluster100", clusterName);
+      String status = (String) resource.getPropertyValue(HostResourceProvider.HOST_HOST_STATUS_PROPERTY_ID);
+      Assert.assertEquals("HEALTHY", status);
+    }
+
+    // verify
+    verify(managementController, clusters, cluster,
+        host1,
+        hostResponse1, stackId, componentInfo,
+        healthStatus, ambariMetaInfo);
+  }
+
+  @Test
+  public void testGetResources_Status_Unhealthy() throws Exception {
+    Resource.Type type = Resource.Type.Host;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Host host1 = createNiceMock(Host.class);
+    HostHealthStatus healthStatus = createNiceMock(HostHealthStatus.class);
+    AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
+    StackId stackId = createNiceMock(StackId.class);
+    ComponentInfo componentInfo = createNiceMock(ComponentInfo.class);
+
+    HostResponse hostResponse1 = createNiceMock(HostResponse.class);
+
+    List<Host> hosts = new LinkedList<Host>();
+    hosts.add(host1);
+
+    Set<Cluster> clusterSet = new HashSet<Cluster>();
+    clusterSet.add(cluster);
+
+    ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("Cluster100", "Service100", "Component100", "Host100", null, null, "STARTED", "", null, null);
+    ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("Cluster100", "Service100", "Component102", "Host100", null, null, "INSTALLED", "", null, null);
+    ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("Cluster100", "Service100", "Component103", "Host100", null, null, "STARTED", "", null, null);
+
+    Set<ServiceComponentHostResponse> responses = new HashSet<ServiceComponentHostResponse>();
+    responses.add(shr1);
+    responses.add(shr2);
+    responses.add(shr3);
+
+    // set expectations
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+    expect(managementController.getHostComponents((Set<ServiceComponentHostRequest>) anyObject())).andReturn(responses).anyTimes();
+
+    expect(clusters.getHosts()).andReturn(hosts).anyTimes();
+
+    expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
+
+    expect(clusters.getClustersForHost("Host100")).andReturn(clusterSet).anyTimes();
+
+    expect(cluster.getDesiredStackVersion()).andReturn(stackId);
+
+    expect(host1.getHostName()).andReturn("Host100").anyTimes();
+
+    expect(host1.convertToResponse()).andReturn(hostResponse1);
+
+    expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
+    expect(hostResponse1.getHealthStatus()).andReturn(healthStatus).anyTimes();
+
+    expect(healthStatus.getHealthStatus()).andReturn(HostHealthStatus.HealthStatus.HEALTHY).anyTimes();
+    expect(healthStatus.getHealthReport()).andReturn("HEALTHY").anyTimes();
+
+
+    expect(ambariMetaInfo.getComponentCategory((String) anyObject(), (String) anyObject(),
+        (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes();
+
+    expect(componentInfo.getCategory()).andReturn("MASTER").anyTimes();
+
+
+    // replay
+    replay(managementController, clusters, cluster,
+        host1,
+        hostResponse1, stackId, componentInfo,
+        healthStatus, ambariMetaInfo);
+
+    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+
+    Set<String> propertyIds = new HashSet<String>();
+
+    propertyIds.add(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID);
+    propertyIds.add(HostResourceProvider.HOST_NAME_PROPERTY_ID);
+    propertyIds.add(HostResourceProvider.HOST_HOST_STATUS_PROPERTY_ID);
+
+    Predicate predicate =
+        new PredicateBuilder().property(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").
+            toPredicate();
+    Request request = PropertyHelper.getReadRequest(propertyIds);
+    Set<Resource> resources = provider.getResources(request, predicate);
+
+    Assert.assertEquals(1, resources.size());
+    for (Resource resource : resources) {
+      String clusterName = (String) resource.getPropertyValue(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID);
+      Assert.assertEquals("Cluster100", clusterName);
+      String status = (String) resource.getPropertyValue(HostResourceProvider.HOST_HOST_STATUS_PROPERTY_ID);
+      Assert.assertEquals("UNHEALTHY", status);
     }
 
     // verify
-    verify(managementController);
+    verify(managementController, clusters, cluster,
+        host1,
+        hostResponse1, stackId, componentInfo,
+        healthStatus, ambariMetaInfo);
   }
-  
+
+  @Test
+  public void testGetResources_Status_Unknown() throws Exception {
+    Resource.Type type = Resource.Type.Host;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Host host1 = createNiceMock(Host.class);
+    HostHealthStatus healthStatus = createNiceMock(HostHealthStatus.class);
+    AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
+
+    HostResponse hostResponse1 = createNiceMock(HostResponse.class);
+
+    List<Host> hosts = new LinkedList<Host>();
+    hosts.add(host1);
+
+    Set<Cluster> clusterSet = new HashSet<Cluster>();
+    clusterSet.add(cluster);
+
+    // set expectations
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+
+    expect(clusters.getHosts()).andReturn(hosts).anyTimes();
+
+    expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
+
+    expect(clusters.getClustersForHost("Host100")).andReturn(clusterSet).anyTimes();
+
+    expect(host1.getHostName()).andReturn("Host100").anyTimes();
+
+    expect(host1.convertToResponse()).andReturn(hostResponse1);
+
+    expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
+    expect(hostResponse1.getHealthStatus()).andReturn(healthStatus).anyTimes();
+
+    expect(healthStatus.getHealthStatus()).andReturn(HostHealthStatus.HealthStatus.UNKNOWN).anyTimes();
+    expect(healthStatus.getHealthReport()).andReturn("UNKNOWN").anyTimes();
+
+
+    // replay
+    replay(managementController, clusters, cluster,
+        host1,
+        hostResponse1,
+        healthStatus, ambariMetaInfo);
+
+    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+
+    Set<String> propertyIds = new HashSet<String>();
+
+    propertyIds.add(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID);
+    propertyIds.add(HostResourceProvider.HOST_NAME_PROPERTY_ID);
+    propertyIds.add(HostResourceProvider.HOST_HOST_STATUS_PROPERTY_ID);
+
+    Predicate predicate =
+        new PredicateBuilder().property(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").
+            toPredicate();
+    Request request = PropertyHelper.getReadRequest(propertyIds);
+    Set<Resource> resources = provider.getResources(request, predicate);
+
+    Assert.assertEquals(1, resources.size());
+    for (Resource resource : resources) {
+      String clusterName = (String) resource.getPropertyValue(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID);
+      Assert.assertEquals("Cluster100", clusterName);
+      String status = (String) resource.getPropertyValue(HostResourceProvider.HOST_HOST_STATUS_PROPERTY_ID);
+      Assert.assertEquals("UNKNOWN", status);
+    }
+
+    // verify
+    verify(managementController, clusters, cluster,
+        host1,
+        hostResponse1,
+        healthStatus, ambariMetaInfo);
+  }
+
+  @Test
+  public void testGetResources_Status_Alert() throws Exception {
+    Resource.Type type = Resource.Type.Host;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Host host1 = createNiceMock(Host.class);
+    HostHealthStatus healthStatus = createNiceMock(HostHealthStatus.class);
+    AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
+    StackId stackId = createNiceMock(StackId.class);
+    ComponentInfo componentInfo = createNiceMock(ComponentInfo.class);
+
+    HostResponse hostResponse1 = createNiceMock(HostResponse.class);
+
+    List<Host> hosts = new LinkedList<Host>();
+    hosts.add(host1);
+
+    Set<Cluster> clusterSet = new HashSet<Cluster>();
+    clusterSet.add(cluster);
+
+    ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("Cluster100", "Service100", "Component100", "Host100", null, null, "STARTED", "", null, null);
+    ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("Cluster100", "Service100", "Component102", "Host100", null, null, "INSTALLED", "", null, null);
+    ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("Cluster100", "Service100", "Component103", "Host100", null, null, "STARTED", "", null, null);
+
+    Set<ServiceComponentHostResponse> responses = new HashSet<ServiceComponentHostResponse>();
+    responses.add(shr1);
+    responses.add(shr2);
+    responses.add(shr3);
+
+    // set expectations
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+    expect(managementController.getHostComponents((Set<ServiceComponentHostRequest>) anyObject())).andReturn(responses).anyTimes();
+
+    expect(clusters.getHosts()).andReturn(hosts).anyTimes();
+
+    expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
+
+    expect(clusters.getClustersForHost("Host100")).andReturn(clusterSet).anyTimes();
+
+    expect(cluster.getDesiredStackVersion()).andReturn(stackId);
+
+    expect(host1.getHostName()).andReturn("Host100").anyTimes();
+
+    expect(host1.convertToResponse()).andReturn(hostResponse1);
+
+    expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
+    expect(hostResponse1.getHealthStatus()).andReturn(healthStatus).anyTimes();
+
+    expect(healthStatus.getHealthStatus()).andReturn(HostHealthStatus.HealthStatus.HEALTHY).anyTimes();
+    expect(healthStatus.getHealthReport()).andReturn("HEALTHY").anyTimes();
+
+
+    expect(ambariMetaInfo.getComponentCategory((String) anyObject(), (String) anyObject(),
+        (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes();
+
+    expect(componentInfo.getCategory()).andReturn("SLAVE").anyTimes();
+
+
+    // replay
+    replay(managementController, clusters, cluster,
+        host1,
+        hostResponse1, stackId, componentInfo,
+        healthStatus, ambariMetaInfo);
+
+    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+
+    Set<String> propertyIds = new HashSet<String>();
+
+    propertyIds.add(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID);
+    propertyIds.add(HostResourceProvider.HOST_NAME_PROPERTY_ID);
+    propertyIds.add(HostResourceProvider.HOST_HOST_STATUS_PROPERTY_ID);
+
+    Predicate predicate =
+        new PredicateBuilder().property(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").
+            toPredicate();
+    Request request = PropertyHelper.getReadRequest(propertyIds);
+    Set<Resource> resources = provider.getResources(request, predicate);
+
+    Assert.assertEquals(1, resources.size());
+    for (Resource resource : resources) {
+      String clusterName = (String) resource.getPropertyValue(HostResourceProvider.HOST_CLUSTER_NAME_PROPERTY_ID);
+      Assert.assertEquals("Cluster100", clusterName);
+      String status = (String) resource.getPropertyValue(HostResourceProvider.HOST_HOST_STATUS_PROPERTY_ID);
+      Assert.assertEquals("ALERT", status);
+    }
+
+    // verify
+    verify(managementController, clusters, cluster,
+        host1,
+        hostResponse1, stackId, componentInfo,
+        healthStatus, ambariMetaInfo);
+  }
+
   @Test
   public void testUpdateDesiredConfig() throws Exception {
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
-    RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Host host1 = createNiceMock(Host.class);
+    HostHealthStatus healthStatus = createNiceMock(HostHealthStatus.class);
+    AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
 
-    HostResponse hr = new HostResponse("Host100", "Cluster100",
-        "", "", 2, 1, "", "", "", 100000L, 200000L, null, 10L,
-        0L, "rack info", null, null,
-        new HostHealthStatus(HostHealthStatus.HealthStatus.HEALTHY, "HEALTHY"), "HEALTHY");
-    
-    Set<HostResponse> hostResponseSet = new HashSet<HostResponse>();
-    hostResponseSet.add(hr);
+    HostResponse hostResponse1 = createNiceMock(HostResponse.class);
+
+    List<Host> hosts = new LinkedList<Host>();
+    hosts.add(host1);
+
+    Set<Cluster> clusterSet = new HashSet<Cluster>();
+    clusterSet.add(cluster);
 
     // set expectations
-    expect(managementController.getHosts(
-        AbstractResourceProviderTest.Matcher.getHostRequestSet("Host100", "Cluster100", null))).
-        andReturn(hostResponseSet);
-    managementController.updateHosts(EasyMock.<Set<HostRequest>>anyObject());
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+    expect(managementController.getHostComponents((Set<ServiceComponentHostRequest>) anyObject())).andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
+
+    expect(clusters.getHosts()).andReturn(hosts).anyTimes();
+    expect(clusters.getHost("Host100")).andReturn(host1).anyTimes();
+
+    expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
+
+    expect(clusters.getClustersForHost("Host100")).andReturn(clusterSet).anyTimes();
+
+    expect(host1.getHostName()).andReturn("Host100").anyTimes();
+
+    expect(host1.convertToResponse()).andReturn(hostResponse1);
+
+    expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
+    expect(hostResponse1.getHealthStatus()).andReturn(healthStatus).anyTimes();
+
+    expect(healthStatus.getHealthStatus()).andReturn(HostHealthStatus.HealthStatus.HEALTHY).anyTimes();
+    expect(healthStatus.getHealthReport()).andReturn("HEALTHY").anyTimes();
 
     // replay
-    replay(managementController, response);
-    
+    replay(managementController, clusters, cluster,
+        host1,
+        hostResponse1,
+        healthStatus, ambariMetaInfo);
 
     Map<String, Object> properties = new LinkedHashMap<String, Object>();
 
@@ -199,7 +659,10 @@ public class HostResourceProviderTest {
     provider.updateResources(request, predicate);
     
     // verify
-    verify(managementController, response);    
+    verify(managementController, clusters, cluster,
+        host1,
+        hostResponse1,
+        healthStatus, ambariMetaInfo);
   }
 
   @Test
@@ -207,22 +670,49 @@ public class HostResourceProviderTest {
     Resource.Type type = Resource.Type.Host;
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
-    RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Host host1 = createNiceMock(Host.class);
+    HostHealthStatus healthStatus = createNiceMock(HostHealthStatus.class);
+    AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
+
+    HostResponse hostResponse1 = createNiceMock(HostResponse.class);
+
+    List<Host> hosts = new LinkedList<Host>();
+    hosts.add(host1);
 
-    Set<HostResponse> hostResponseSet = new HashSet<HostResponse>();
-    hostResponseSet.add(new HostResponse("Host100", "Cluster100",
-        "", "", 2, 1, "", "", "", 100000L, 200000L, null, 10L,
-        0L, "rack info", null, null,
-        new HostHealthStatus(HostHealthStatus.HealthStatus.HEALTHY, "HEALTHY"), "HEALTHY"));
+    Set<Cluster> clusterSet = new HashSet<Cluster>();
+    clusterSet.add(cluster);
 
     // set expectations
-    expect(managementController.getHosts(
-        AbstractResourceProviderTest.Matcher.getHostRequestSet("Host100", "Cluster100", null))).
-        andReturn(hostResponseSet);
-    managementController.updateHosts(EasyMock.<Set<HostRequest>>anyObject());
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+    expect(managementController.getHostComponents((Set<ServiceComponentHostRequest>) anyObject())).andReturn(Collections.<ServiceComponentHostResponse>emptySet()).anyTimes();
+
+    expect(clusters.getHosts()).andReturn(hosts).anyTimes();
+    expect(clusters.getHost("Host100")).andReturn(host1).anyTimes();
+
+    expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
+
+    expect(clusters.getClustersForHost("Host100")).andReturn(clusterSet).anyTimes();
+
+    expect(host1.getHostName()).andReturn("Host100").anyTimes();
+
+    expect(host1.convertToResponse()).andReturn(hostResponse1);
+
+    expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
+    expect(hostResponse1.getHealthStatus()).andReturn(healthStatus).anyTimes();
+
+    expect(healthStatus.getHealthStatus()).andReturn(HostHealthStatus.HealthStatus.HEALTHY).anyTimes();
+    expect(healthStatus.getHealthReport()).andReturn("HEALTHY").anyTimes();
 
     // replay
-    replay(managementController, response);
+    replay(managementController, clusters, cluster,
+        host1,
+        hostResponse1,
+        healthStatus, ambariMetaInfo);
+
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
@@ -244,7 +734,10 @@ public class HostResourceProviderTest {
     provider.updateResources(request, predicate);
 
     // verify
-    verify(managementController, response);
+    verify(managementController, clusters, cluster,
+        host1,
+        hostResponse1,
+        healthStatus, ambariMetaInfo);
   }
 
   @Test
@@ -252,12 +745,34 @@ public class HostResourceProviderTest {
     Resource.Type type = Resource.Type.Host;
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Host host1 = createNiceMock(Host.class);
+    HostHealthStatus healthStatus = createNiceMock(HostHealthStatus.class);
+
+    List<Host> hosts = new LinkedList<Host>();
+    hosts.add(host1);
+
+    Set<Cluster> clusterSet = new HashSet<Cluster>();
 
     // set expectations
-    managementController.deleteHosts(AbstractResourceProviderTest.Matcher.getHostRequestSet("Host100", null, null));
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(clusters.getHosts()).andReturn(hosts).anyTimes();
+    expect(clusters.getHost("Host100")).andReturn(host1).anyTimes();
+
+    expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
+
+    expect(clusters.getClustersForHost("Host100")).andReturn(clusterSet).anyTimes();
+
+    expect(host1.getHostName()).andReturn("Host100").anyTimes();
+
+    expect(healthStatus.getHealthStatus()).andReturn(HostHealthStatus.HealthStatus.HEALTHY).anyTimes();
+    expect(healthStatus.getHealthReport()).andReturn("HEALTHY").anyTimes();
 
     // replay
-    replay(managementController);
+    replay(managementController, clusters, cluster,
+        host1,
+        healthStatus);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
@@ -282,6 +797,239 @@ public class HostResourceProviderTest {
     Assert.assertNull(lastEvent.getRequest());
 
     // verify
-    verify(managementController);
+    verify(managementController, clusters, cluster,
+        host1,
+        healthStatus);
+  }
+
+  public static HostResourceProvider getHostProvider(AmbariManagementController managementController) {
+    Resource.Type type = Resource.Type.Host;
+
+    return (HostResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+  }
+
+  @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 = getHosts(controller, 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 {
+      getHosts(controller, 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 {
+      getHosts(controller, 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 = getHosts(controller, 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);
+  }
+
+  public static void createHosts(AmbariManagementController controller, Set<HostRequest> requests) throws AmbariException {
+    HostResourceProvider provider = getHostProvider(controller);
+    provider.createHosts(requests);
+  }
+
+  public static Set<HostResponse> getHosts(AmbariManagementController controller,
+                                                 Set<HostRequest> requests) throws AmbariException {
+    HostResourceProvider provider = getHostProvider(controller);
+    return provider.getHosts(requests);
+  }
+
+  public static void deleteHosts(AmbariManagementController controller, Set<HostRequest> requests)
+      throws AmbariException {
+    HostResourceProvider provider = getHostProvider(controller);
+    provider.deleteHosts(requests);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/69010c80/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java
index baa6178..cb7051c 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java
@@ -19,26 +19,31 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
 
-import java.util.Collections;
 import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Set;
 
+import org.apache.ambari.server.controller.AbstractRootServiceResponseFactory;
 import org.apache.ambari.server.controller.AmbariManagementController;
+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.Predicate;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
-import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
-import org.easymock.EasyMock;
-import org.junit.Assert;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.HostHealthStatus;
 import org.junit.Test;
 
 public class RootServiceHostComponentResourceProviderTest {
@@ -48,21 +53,55 @@ public class RootServiceHostComponentResourceProviderTest {
     Resource.Type type = Resource.Type.RootServiceHostComponent;
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    Host host1 = createNiceMock(Host.class);
+    HostHealthStatus healthStatus = createNiceMock(HostHealthStatus.class);
 
-    Set<RootServiceHostComponentResponse> allResponse = new HashSet<RootServiceHostComponentResponse>();
-    allResponse.add(new RootServiceHostComponentResponse("host1", "component1", "HEALTHY", "1.1.1", Collections.<String,String>emptyMap()));
-    allResponse.add(new RootServiceHostComponentResponse("host2", "component2", "HEALTHY", "1.1.1", Collections.<String,String>emptyMap()));
-    allResponse.add(new RootServiceHostComponentResponse("host3", "component3", "HEARBEAT_LOST", "1.1.1", Collections.<String,String>emptyMap()));
+    HostResponse hostResponse1 = createNiceMock(HostResponse.class);
 
-    Set<RootServiceHostComponentResponse> nameResponse = new HashSet<RootServiceHostComponentResponse>();
-    nameResponse.add(new RootServiceHostComponentResponse("host4", "component4", "HEALTHY", "1.1.1", Collections.<String,String>emptyMap()));
+    RootServiceHostComponentResponse response = createNiceMock(RootServiceHostComponentResponse.class);
 
+    AbstractRootServiceResponseFactory factory = createNiceMock(AbstractRootServiceResponseFactory.class);
+
+    List<Host> hosts = new LinkedList<Host>();
+    hosts.add(host1);
+
+    Set<Cluster> clusterSet = new HashSet<Cluster>();
+    clusterSet.add(cluster);
+
+    Set<RootServiceHostComponentResponse> responseSet = new HashSet<RootServiceHostComponentResponse>();
+    responseSet.add(response);
 
     // set expectations
-    expect(managementController.getRootServiceHostComponents(EasyMock.<Set<RootServiceHostComponentRequest>>anyObject())).andReturn(allResponse).once();
-    expect(managementController.getRootServiceHostComponents(EasyMock.<Set<RootServiceHostComponentRequest>>anyObject())).andReturn(nameResponse).once();
+    expect(managementController.getRootServiceResponseFactory()).andReturn(factory).anyTimes();
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(clusters.getHosts()).andReturn(hosts).anyTimes();
+
+    expect(factory.getRootServiceHostComponent((RootServiceHostComponentRequest) anyObject(), (Set<HostResponse>) anyObject())).
+        andReturn(responseSet).anyTimes();
+
+    expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes();
+
+    expect(clusters.getClustersForHost("Host100")).andReturn(clusterSet).anyTimes();
+
+    expect(host1.getHostName()).andReturn("Host100").anyTimes();
+
+    expect(host1.convertToResponse()).andReturn(hostResponse1).anyTimes();
+
+    expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
+    expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
+    expect(hostResponse1.getHealthStatus()).andReturn(healthStatus).anyTimes();
+
+    expect(healthStatus.getHealthStatus()).andReturn(HostHealthStatus.HealthStatus.HEALTHY).anyTimes();
+    expect(healthStatus.getHealthReport()).andReturn("HEALTHY").anyTimes();
+
     // replay
-    replay(managementController);
+    replay(managementController, clusters, cluster,
+        host1,
+        hostResponse1,
+        healthStatus, factory, response);
+
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
@@ -79,36 +118,17 @@ public class RootServiceHostComponentResourceProviderTest {
     propertyIds.add(RootServiceHostComponentResourceProvider.PROPERTIES_PROPERTY_ID);
     propertyIds.add(RootServiceHostComponentResourceProvider.COMPONENT_VERSION_PROPERTY_ID);
     
-    
     // create the request
     Request request = PropertyHelper.getReadRequest(propertyIds);
 
     // get all ... no predicate
-    Set<Resource> resources = provider.getResources(request, null);
-
-    Assert.assertEquals(allResponse.size(), resources.size());
-    for (Resource resource : resources) {
-      String hostName = (String) resource.getPropertyValue(RootServiceHostComponentResourceProvider.HOST_NAME_PROPERTY_ID);
-      String componentName = (String) resource.getPropertyValue(RootServiceHostComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID);
-      String componentState = (String) resource.getPropertyValue(RootServiceHostComponentResourceProvider.COMPONENT_STATE_PROPERTY_ID);
-      String componentVersion = (String) resource.getPropertyValue(RootServiceHostComponentResourceProvider.COMPONENT_VERSION_PROPERTY_ID);
-      Assert.assertTrue(allResponse.contains(new RootServiceHostComponentResponse(hostName, componentName, componentState, componentVersion,
-          Collections.<String, String>emptyMap())));
-    }
-
-    // get service named service4
-    Predicate predicate =
-        new PredicateBuilder().property(RootServiceHostComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID).
-        equals("component4").toPredicate();
-    resources = provider.getResources(request, predicate);
-
-    Assert.assertEquals(1, resources.size());
-    Assert.assertEquals("component4", resources.iterator().next().
-        getPropertyValue(RootServiceHostComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID));
-
+    provider.getResources(request, null);
 
     // verify
-    verify(managementController);
+    verify(managementController, clusters, cluster,
+        host1,
+        hostResponse1,
+        healthStatus, factory, response);
   }
 
 }


[2/2] git commit: AMBARI-3670 - Hosts should roll up host_components status into its status

Posted by tb...@apache.org.
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));