You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sw...@apache.org on 2014/12/03 22:04:09 UTC

[2/2] ambari git commit: AMBARI-8535. AMS Provider is not instantiated after install. (swagle)

AMBARI-8535. AMS Provider is not instantiated after install. (swagle)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/2160d544
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/2160d544
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/2160d544

Branch: refs/heads/trunk
Commit: 2160d544a648224f5320337bff5184fa0498b655
Parents: 2518a56
Author: Siddharth Wagle <sw...@hortonworks.com>
Authored: Wed Dec 3 12:29:37 2014 -0800
Committer: Siddharth Wagle <sw...@hortonworks.com>
Committed: Wed Dec 3 12:29:37 2014 -0800

----------------------------------------------------------------------
 .../internal/AbstractProviderModule.java        | 143 ++++++++++++----
 .../internal/ClusterResourceProvider.java       |   4 +-
 .../internal/StackDefinedPropertyProvider.java  |  22 +--
 .../controller/metrics/MetricHostProvider.java  |   3 +-
 .../metrics/MetricsPropertyProvider.java        | 118 +++++--------
 .../metrics/MetricsPropertyProviderProxy.java   | 169 +++++++++++++++++++
 .../metrics/MetricsReportPropertyProvider.java  |  31 +---
 .../MetricsReportPropertyProviderProxy.java     |  93 ++++++++++
 .../metrics/MetricsServiceProvider.java         |  35 ++++
 .../ganglia/GangliaHostPropertyProvider.java    |   1 -
 .../ganglia/GangliaPropertyProvider.java        |  32 ++--
 .../ganglia/GangliaReportPropertyProvider.java  |   4 +-
 .../metrics/timeline/AMSPropertyProvider.java   |  21 +--
 .../internal/MetricsServiceProviderTest.java    | 135 +++++++++++++++
 .../StackDefinedPropertyProviderTest.java       |  39 ++++-
 .../metrics/JMXPropertyProviderTest.java        |  17 +-
 .../RestMetricsPropertyProviderTest.java        |  17 +-
 .../ganglia/GangliaPropertyProviderTest.java    |  15 +-
 .../GangliaReportPropertyProviderTest.java      |   4 +-
 .../timeline/AMSPropertyProviderTest.java       |  26 ++-
 20 files changed, 718 insertions(+), 211 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/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 7b734cf..1616493 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
@@ -33,6 +33,7 @@ import org.apache.ambari.server.controller.jmx.JMXPropertyProvider;
 import org.apache.ambari.server.controller.metrics.MetricHostProvider;
 import org.apache.ambari.server.controller.metrics.MetricsPropertyProvider;
 import org.apache.ambari.server.controller.metrics.MetricsReportPropertyProvider;
+import org.apache.ambari.server.controller.metrics.MetricsServiceProvider;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
@@ -56,6 +57,7 @@ import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.State;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
 import java.net.InetAddress;
 import java.util.Collections;
 import java.util.EnumMap;
@@ -67,15 +69,16 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService;
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService.GANGLIA;
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService.TIMELINE_METRICS;
 
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.GANGLIA;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.TIMELINE_METRICS;
 
 /**
  * An abstract provider module implementation.
  */
-public abstract class AbstractProviderModule implements ProviderModule, ResourceProviderObserver, JMXHostProvider, MetricHostProvider, HostInfoProvider {
+public abstract class AbstractProviderModule implements ProviderModule,
+    ResourceProviderObserver, JMXHostProvider, MetricHostProvider,
+    MetricsServiceProvider, HostInfoProvider {
 
   private static final int PROPERTY_REQUEST_CONNECT_TIMEOUT = 5000;
   private static final int PROPERTY_REQUEST_READ_TIMEOUT    = 10000;
@@ -226,8 +229,93 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
     }
   }
 
+  // ----- MetricsServiceProvider ---------------------------------------------
+
+  /**
+   * Get type of Metrics system installed.
+   * @return @MetricsService, null if none found.
+   */
+  public MetricsService getMetricsServiceType() {
+    try {
+      checkInit();
+    } catch (SystemException e) {
+      LOG.error("Exception during checkInit.", e);
+    }
+    if (clusterGangliaCollectorMap.isEmpty() && clusterMetricCollectorMap.isEmpty()) {
+      resetMetricProviderMap();
+    }
+
+    if (!clusterMetricCollectorMap.isEmpty()) {
+      return TIMELINE_METRICS;
+    } else if (!clusterGangliaCollectorMap.isEmpty()) {
+      return GANGLIA;
+    }
+    return null;
+  }
+
+  private void resetMetricProviderMap() {
+    LOG.info("Resetting metric property provider.");
+    ResourceProvider provider = getResourceProvider(Resource.Type.Cluster);
+
+    Set<String> propertyIds = new HashSet<String>();
+    propertyIds.add(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID);
+
+    Map<String, String> requestInfoProperties = new HashMap<String, String>();
+    requestInfoProperties.put(ClusterResourceProvider.GET_IGNORE_PERMISSIONS_PROPERTY_ID, "true");
+
+    Request request = PropertyHelper.getReadRequest(propertyIds,
+      requestInfoProperties, null, null, null);
+
+    try {
+      Set<Resource> clusters = provider.getResources(request, null);
+
+      if (clusters != null && !clusters.isEmpty()) {
+        for (Resource cluster : clusters) {
+          String clusterName = (String) cluster.getPropertyValue(CLUSTER_NAME_PROPERTY_ID);
+
+          request = PropertyHelper.getReadRequest(HOST_COMPONENT_HOST_NAME_PROPERTY_ID,
+            HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+
+          Predicate predicate =
+            new PredicateBuilder().property(HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID)
+              .equals(clusterName).and().property(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID)
+              .equals(GANGLIA_SERVER).toPredicate();
+
+          provider = getResourceProvider(Resource.Type.HostComponent);
+          Set<Resource> hostComponents = provider.getResources(request, predicate);
+
+          if (hostComponents != null && !hostComponents.isEmpty()) {
+            Resource hostComponent = hostComponents.iterator().next();
+            String hostName = (String) hostComponent.getPropertyValue(HOST_COMPONENT_HOST_NAME_PROPERTY_ID);
+            clusterGangliaCollectorMap.put(clusterName, hostName);
+          }
+
+          predicate = new PredicateBuilder().property(HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID)
+            .equals(clusterName).and().property(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID)
+            .equals(METRIC_SERVER).toPredicate();
+
+          hostComponents = provider.getResources(request, predicate);
+          if (hostComponents != null && !hostComponents.isEmpty()) {
+            Resource hostComponent = hostComponents.iterator().next();
+            String hostName = (String) hostComponent.getPropertyValue(HOST_COMPONENT_HOST_NAME_PROPERTY_ID);
+            clusterMetricCollectorMap.put(clusterName, hostName);
+          }
+        }
+      }
+
+    } catch (SystemException e) {
+      LOG.warn("Error finding metrics provider.", e);
+    } catch (UnsupportedPropertyException e) {
+      LOG.warn("Error finding metrics provider.", e);
+    } catch (NoSuchResourceException e) {
+      LOG.warn("Error finding metrics provider.", e);
+    } catch (NoSuchParentResourceException e) {
+      LOG.warn("Error finding metrics provider.", e);
+    }
 
-  // ----- MetricsHostProvider ---------------------------------------------------
+  }
+
+  // ----- MetricsHostProvider ------------------------------------------------
 
   @Override
   public String getCollectorHostName(String clusterName, MetricsService service) throws SystemException {
@@ -343,20 +431,6 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
       componentHostResponse.getLiveState().equals(State.STARTED.name());
   }
 
-  protected MetricsService getMetricsServiceType() {
-    try {
-      checkInit();
-    } catch (SystemException e) {
-      LOG.error("Exception during checkInit.", e);
-      return GANGLIA;
-    }
-    if (!clusterMetricCollectorMap.isEmpty()) {
-      return TIMELINE_METRICS;
-    } else {
-      return GANGLIA;
-    }
-  }
-
   protected boolean isHostLive(String clusterName, String hostName) {
     if (clusterName == null) {
       return false;
@@ -546,6 +620,7 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
             streamProvider,
             ComponentSSLConfiguration.instance(),
             this,
+            this,
             PropertyHelper.getPropertyId("Clusters", "cluster_name")));
           providers.add(new AlertSummaryPropertyProvider(type,
             "Clusters/cluster_name", null));
@@ -560,6 +635,7 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
             streamProvider,
             ComponentSSLConfiguration.instance(),
             this,
+            this,
             PropertyHelper.getPropertyId("Hosts", "cluster_name"),
             PropertyHelper.getPropertyId("Hosts", "host_name")
           ));
@@ -591,6 +667,7 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
               streamProvider,
               ComponentSSLConfiguration.instance(),
               this,
+              this,
               PropertyHelper.getPropertyId("ServiceComponentInfo", "cluster_name"),
               PropertyHelper.getPropertyId("ServiceComponentInfo", "component_name"));
           }
@@ -598,6 +675,7 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
               type,
               this,
               this,
+              this,
               streamProvider,
               PropertyHelper.getPropertyId("ServiceComponentInfo", "cluster_name"),
               null,
@@ -633,6 +711,7 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
               streamProvider,
               ComponentSSLConfiguration.instance(),
               this,
+              this,
               PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
               PropertyHelper.getPropertyId("HostRoles", "host_name"),
               PropertyHelper.getPropertyId("HostRoles", "component_name"));
@@ -641,6 +720,7 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
               type,
               this,
               this,
+              this,
               streamProvider,
               PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
               PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -657,8 +737,6 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
     putPropertyProviders(type, providers);
   }
 
-
-
   private void checkInit() throws SystemException {
     if (!initialized) {
       synchronized (this) {
@@ -891,11 +969,12 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
   private PropertyProvider createMetricsReportPropertyProvider(Resource.Type type, StreamProvider streamProvider,
                                                                ComponentSSLConfiguration configuration,
                                                                MetricHostProvider hostProvider,
+                                                               MetricsServiceProvider serviceProvider,
                                                                String clusterNamePropertyId) {
 
     return MetricsReportPropertyProvider.createInstance(
-      getMetricsServiceType(), PropertyHelper.getMetricPropertyIds(type),
-      streamProvider, configuration, hostProvider, clusterNamePropertyId);
+      PropertyHelper.getMetricPropertyIds(type), streamProvider,
+      configuration, hostProvider, serviceProvider, clusterNamePropertyId);
   }
 
   /**
@@ -905,11 +984,13 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
                                                              StreamProvider streamProvider,
                                                              ComponentSSLConfiguration configuration,
                                                              MetricHostProvider hostProvider,
+                                                             MetricsServiceProvider serviceProvider,
                                                              String clusterNamePropertyId,
                                                              String hostNamePropertyId) {
-    return MetricsPropertyProvider.createInstance(getMetricsServiceType(), type,
+    return MetricsPropertyProvider.createInstance(type,
       PropertyHelper.getMetricPropertyIds(type), streamProvider, configuration,
-      hostProvider, clusterNamePropertyId, hostNamePropertyId, null);
+      hostProvider, serviceProvider, clusterNamePropertyId,
+      hostNamePropertyId, null);
   }
 
   /**
@@ -919,11 +1000,13 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
                                                                   StreamProvider streamProvider,
                                                                   ComponentSSLConfiguration configuration,
                                                                   MetricHostProvider hostProvider,
+                                                                  MetricsServiceProvider serviceProvider,
                                                                   String clusterNamePropertyId,
                                                                   String componentNamePropertyId) {
-    return MetricsPropertyProvider.createInstance(getMetricsServiceType(), type,
+    return MetricsPropertyProvider.createInstance(type,
       PropertyHelper.getMetricPropertyIds(type), streamProvider, configuration,
-      hostProvider, clusterNamePropertyId, null, componentNamePropertyId);
+      hostProvider, serviceProvider, clusterNamePropertyId, null,
+      componentNamePropertyId);
   }
 
 
@@ -934,13 +1017,15 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
                                                                       StreamProvider streamProvider,
                                                                       ComponentSSLConfiguration configuration,
                                                                       MetricHostProvider hostProvider,
+                                                                      MetricsServiceProvider serviceProvider,
                                                                       String clusterNamePropertyId,
                                                                       String hostNamePropertyId,
                                                                       String componentNamePropertyId) {
 
-    return MetricsPropertyProvider.createInstance(getMetricsServiceType(), type,
+    return MetricsPropertyProvider.createInstance(type,
       PropertyHelper.getMetricPropertyIds(type), streamProvider, configuration,
-      hostProvider, clusterNamePropertyId, hostNamePropertyId, componentNamePropertyId);
+      hostProvider, serviceProvider, clusterNamePropertyId, hostNamePropertyId,
+      componentNamePropertyId);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
index 15cd8de..7423c25 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
@@ -59,8 +59,8 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor {
   // ----- Property ID constants ---------------------------------------------
 
   // Clusters
-  protected static final String CLUSTER_ID_PROPERTY_ID      = PropertyHelper.getPropertyId("Clusters", "cluster_id");
-  protected static final String CLUSTER_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("Clusters", "cluster_name");
+  public static final String CLUSTER_ID_PROPERTY_ID      = PropertyHelper.getPropertyId("Clusters", "cluster_id");
+  public static final String CLUSTER_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("Clusters", "cluster_name");
   protected static final String CLUSTER_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("Clusters", "version");
   protected static final String CLUSTER_PROVISIONING_STATE_PROPERTY_ID = PropertyHelper.getPropertyId("Clusters", "provisioning_state");
   protected static final String CLUSTER_DESIRED_CONFIGS_PROPERTY_ID = PropertyHelper.getPropertyId("Clusters", "desired_configs");

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProvider.java
index 5896a88..a18086b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProvider.java
@@ -25,9 +25,7 @@ import org.apache.ambari.server.controller.jmx.JMXHostProvider;
 import org.apache.ambari.server.controller.jmx.JMXPropertyProvider;
 import org.apache.ambari.server.controller.metrics.MetricHostProvider;
 import org.apache.ambari.server.controller.metrics.MetricsPropertyProvider;
-import org.apache.ambari.server.controller.metrics.ganglia.GangliaComponentPropertyProvider;
-import org.apache.ambari.server.controller.metrics.ganglia.GangliaHostComponentPropertyProvider;
-import org.apache.ambari.server.controller.metrics.ganglia.GangliaPropertyProvider;
+import org.apache.ambari.server.controller.metrics.MetricsServiceProvider;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.PropertyProvider;
 import org.apache.ambari.server.controller.spi.Request;
@@ -41,7 +39,6 @@ import org.apache.ambari.server.state.stack.Metric;
 import org.apache.ambari.server.state.stack.MetricDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -52,7 +49,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService;
 
 /**
  * This class analyzes a service's metrics to determine if additional
@@ -82,6 +79,7 @@ public class StackDefinedPropertyProvider implements PropertyProvider {
   private PropertyProvider defaultGanglia = null;
 
   private final MetricHostProvider metricHostProvider;
+  private final MetricsServiceProvider metricsServiceProvider;
   private MetricsService metricsService = MetricsService.GANGLIA;
 
   /**
@@ -100,6 +98,7 @@ public class StackDefinedPropertyProvider implements PropertyProvider {
   public StackDefinedPropertyProvider(Resource.Type type,
                                       JMXHostProvider jmxHostProvider,
                                       MetricHostProvider metricHostProvider,
+                                      MetricsServiceProvider serviceProvider,
                                       StreamProvider streamProvider,
                                       String clusterPropertyId,
                                       String hostPropertyId,
@@ -109,6 +108,7 @@ public class StackDefinedPropertyProvider implements PropertyProvider {
                                       PropertyProvider defaultGangliaPropertyProvider) {
 
     this.metricHostProvider = metricHostProvider;
+    this.metricsServiceProvider = serviceProvider;
 
     if (null == clusterPropertyId)
       throw new NullPointerException("Cluster name property id cannot be null");
@@ -133,6 +133,7 @@ public class StackDefinedPropertyProvider implements PropertyProvider {
                                       MetricsService metricsService,
                                       JMXHostProvider jmxHostProvider,
                                       MetricHostProvider metricHostProvider,
+                                      MetricsServiceProvider serviceProvider,
                                       StreamProvider streamProvider,
                                       String clusterPropertyId,
                                       String hostPropertyId,
@@ -141,7 +142,7 @@ public class StackDefinedPropertyProvider implements PropertyProvider {
                                       PropertyProvider defaultJmxPropertyProvider,
                                       PropertyProvider defaultGangliaPropertyProvider) {
 
-    this(type, jmxHostProvider, metricHostProvider,
+    this(type, jmxHostProvider, metricHostProvider, serviceProvider,
       streamProvider, clusterPropertyId, hostPropertyId, componentPropertyId,
       jmxStatePropertyId, defaultJmxPropertyProvider, defaultGangliaPropertyProvider);
 
@@ -198,10 +199,11 @@ public class StackDefinedPropertyProvider implements PropertyProvider {
       }
 
       if (gangliaMap.size() > 0) {
-        MetricsPropertyProvider propertyProvider =
-          MetricsPropertyProvider.createInstance(metricsService,
-            type, gangliaMap, streamProvider, sslConfig, metricHostProvider,
-            clusterNamePropertyId, hostNamePropertyId, componentNamePropertyId);
+        PropertyProvider propertyProvider =
+          MetricsPropertyProvider.createInstance(type, gangliaMap,
+            streamProvider, sslConfig, metricHostProvider,
+            metricsServiceProvider, clusterNamePropertyId,
+            hostNamePropertyId, componentNamePropertyId);
 
         propertyProvider.populateResources(resources, request, predicate);
       } else {

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricHostProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricHostProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricHostProvider.java
index fec2b57..a5a7a71 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricHostProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricHostProvider.java
@@ -18,7 +18,8 @@
 package org.apache.ambari.server.controller.metrics;
 
 import org.apache.ambari.server.controller.spi.SystemException;
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService;
+
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService;
 
 public interface MetricHostProvider {
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsPropertyProvider.java
index 4f1964f..24e692c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsPropertyProvider.java
@@ -20,12 +20,6 @@ package org.apache.ambari.server.controller.metrics;
 import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
 import org.apache.ambari.server.controller.internal.AbstractPropertyProvider;
 import org.apache.ambari.server.controller.internal.PropertyInfo;
-import org.apache.ambari.server.controller.metrics.ganglia.GangliaComponentPropertyProvider;
-import org.apache.ambari.server.controller.metrics.ganglia.GangliaHostComponentPropertyProvider;
-import org.apache.ambari.server.controller.metrics.ganglia.GangliaHostPropertyProvider;
-import org.apache.ambari.server.controller.metrics.timeline.AMSComponentPropertyProvider;
-import org.apache.ambari.server.controller.metrics.timeline.AMSHostComponentPropertyProvider;
-import org.apache.ambari.server.controller.metrics.timeline.AMSHostPropertyProvider;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
@@ -33,13 +27,10 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.utilities.StreamProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
 
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService.TIMELINE_METRICS;
-
 public abstract class MetricsPropertyProvider extends AbstractPropertyProvider {
   protected final static Logger LOG =
     LoggerFactory.getLogger(MetricsPropertyProvider.class);
@@ -58,15 +49,8 @@ public abstract class MetricsPropertyProvider extends AbstractPropertyProvider {
 
   protected final ComponentSSLConfiguration configuration;
 
-  /**
-   * Enumeration to distinguish metrics service installed for a cluster
-   */
-  public enum MetricsService {
-    GANGLIA,
-    TIMELINE_METRICS
-  }
-
-  public MetricsPropertyProvider(Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
+  protected MetricsPropertyProvider(Map<String, Map<String,
+    PropertyInfo>> componentPropertyInfoMap,
                                  StreamProvider streamProvider,
                                  ComponentSSLConfiguration configuration,
                                  MetricHostProvider hostProvider,
@@ -84,77 +68,29 @@ public abstract class MetricsPropertyProvider extends AbstractPropertyProvider {
     this.componentNamePropertyId  = componentNamePropertyId;
   }
 
-  public static MetricsPropertyProvider createInstance(
-        MetricsService metricsService,
+  public static MetricsPropertyProviderProxy createInstance(
         Resource.Type type,
         Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
         StreamProvider streamProvider,
         ComponentSSLConfiguration configuration,
         MetricHostProvider hostProvider,
+        MetricsServiceProvider serviceProvider,
         String clusterNamePropertyId,
         String hostNamePropertyId,
         String componentNamePropertyId) {
 
     if (type.isInternalType()) {
-      switch (type.getInternalType()) {
-        case Host:
-          if (metricsService.equals(TIMELINE_METRICS)) {
-            return new AMSHostPropertyProvider(componentPropertyInfoMap,
-              streamProvider,
-              configuration,
-              hostProvider,
-              clusterNamePropertyId,
-              hostNamePropertyId);
-          } else {
-            return new GangliaHostPropertyProvider(
-              componentPropertyInfoMap,
-              streamProvider,
-              configuration,
-              hostProvider,
-              clusterNamePropertyId,
-              hostNamePropertyId);
-          }
-        case HostComponent:
-          if (metricsService.equals(TIMELINE_METRICS)) {
-            return new AMSHostComponentPropertyProvider(
-              componentPropertyInfoMap,
-              streamProvider,
-              configuration,
-              hostProvider,
-              clusterNamePropertyId,
-              hostNamePropertyId,
-              componentNamePropertyId);
-          } else {
-            return new GangliaHostComponentPropertyProvider(
-              componentPropertyInfoMap,
-              streamProvider,
-              configuration,
-              hostProvider,
-              clusterNamePropertyId,
-              hostNamePropertyId,
-              componentNamePropertyId);
-          }
-        case Component:
-          if (metricsService.equals(TIMELINE_METRICS)) {
-            return new AMSComponentPropertyProvider(
-              componentPropertyInfoMap,
-              streamProvider,
-              configuration,
-              hostProvider,
-              clusterNamePropertyId,
-              componentNamePropertyId);
-          } else {
-            return new GangliaComponentPropertyProvider(
-              componentPropertyInfoMap,
-              streamProvider,
-              configuration,
-              hostProvider,
-              clusterNamePropertyId,
-              componentNamePropertyId);
-          }
-        default:
-          break;
-      }
+      return new MetricsPropertyProviderProxy(
+        type.getInternalType(),
+        componentPropertyInfoMap,
+        streamProvider,
+        configuration,
+        hostProvider,
+        serviceProvider,
+        clusterNamePropertyId,
+        hostNamePropertyId,
+        componentNamePropertyId
+      );
     }
 
     return null;
@@ -178,6 +114,30 @@ public abstract class MetricsPropertyProvider extends AbstractPropertyProvider {
    */
   protected abstract String getComponentName(Resource resource);
 
+  @Override
+  public Set<Resource> populateResources(Set<Resource> resources,
+                Request request, Predicate predicate) throws SystemException {
+
+    Set<String> ids = getRequestPropertyIds(request, predicate);
+    if (ids.isEmpty()) {
+      return resources;
+    }
+
+    return populateResourcesWithProperties(resources, request, ids);
+  }
+
+  /**
+   * Delegate implementation of populating resources to concrete providers.
+   *
+   * @param resources @Resource
+   * @param request @Request
+   * @param propertyIds Set of ids
+   * @return @Set of resources
+   * @throws SystemException
+   */
+  protected abstract Set<Resource> populateResourcesWithProperties(Set<Resource> resources,
+      Request request, Set<String> propertyIds) throws SystemException;
+
   /**
    * Get a comma delimited string from the given set of strings or
    * an empty string if the size of the given set is greater than

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsPropertyProviderProxy.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsPropertyProviderProxy.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsPropertyProviderProxy.java
new file mode 100644
index 0000000..e1f607e
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsPropertyProviderProxy.java
@@ -0,0 +1,169 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.metrics;
+
+import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
+import org.apache.ambari.server.controller.internal.AbstractPropertyProvider;
+import org.apache.ambari.server.controller.internal.PropertyInfo;
+import org.apache.ambari.server.controller.metrics.ganglia.GangliaComponentPropertyProvider;
+import org.apache.ambari.server.controller.metrics.ganglia.GangliaHostComponentPropertyProvider;
+import org.apache.ambari.server.controller.metrics.ganglia.GangliaHostPropertyProvider;
+import org.apache.ambari.server.controller.metrics.ganglia.GangliaPropertyProvider;
+import org.apache.ambari.server.controller.metrics.ganglia.GangliaReportPropertyProvider;
+import org.apache.ambari.server.controller.metrics.timeline.AMSComponentPropertyProvider;
+import org.apache.ambari.server.controller.metrics.timeline.AMSHostComponentPropertyProvider;
+import org.apache.ambari.server.controller.metrics.timeline.AMSHostPropertyProvider;
+import org.apache.ambari.server.controller.metrics.timeline.AMSPropertyProvider;
+import org.apache.ambari.server.controller.metrics.timeline.AMSReportPropertyProvider;
+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.SystemException;
+import org.apache.ambari.server.controller.utilities.StreamProvider;
+import java.util.Map;
+import java.util.Set;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.GANGLIA;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.TIMELINE_METRICS;
+import static org.apache.ambari.server.controller.spi.Resource.InternalType;
+
+public class MetricsPropertyProviderProxy extends AbstractPropertyProvider {
+  private final MetricsServiceProvider metricsServiceProvider;
+  private AMSPropertyProvider amsPropertyProvider;
+  private GangliaPropertyProvider gangliaPropertyProvider;
+
+  public MetricsPropertyProviderProxy(
+    InternalType type,
+    Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
+    StreamProvider streamProvider,
+    ComponentSSLConfiguration configuration,
+    MetricHostProvider hostProvider,
+    MetricsServiceProvider serviceProvider,
+    String clusterNamePropertyId,
+    String hostNamePropertyId,
+    String componentNamePropertyId) {
+
+    super(componentPropertyInfoMap);
+    this.metricsServiceProvider = serviceProvider;
+
+    switch (type) {
+      case Host:
+        createHostPropertyProviders(componentPropertyInfoMap, streamProvider,
+          configuration, hostProvider, clusterNamePropertyId, hostNamePropertyId);
+        break;
+
+      case HostComponent:
+        createHostComponentPropertyProviders(componentPropertyInfoMap, streamProvider,
+          configuration, hostProvider, clusterNamePropertyId,
+          hostNamePropertyId, componentNamePropertyId);
+        break;
+
+      case Component:
+        createComponentPropertyProviders(componentPropertyInfoMap, streamProvider,
+          configuration, hostProvider, clusterNamePropertyId, componentNamePropertyId);
+        break;
+
+      default:
+        break;
+    }
+  }
+
+  private void createHostPropertyProviders(Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
+                                           StreamProvider streamProvider,
+                                           ComponentSSLConfiguration configuration,
+                                           MetricHostProvider hostProvider,
+                                           String clusterNamePropertyId,
+                                           String hostNamePropertyId) {
+
+    this.amsPropertyProvider = new AMSHostPropertyProvider(componentPropertyInfoMap,
+                                            streamProvider,
+                                            configuration,
+                                            hostProvider,
+                                            clusterNamePropertyId,
+                                            hostNamePropertyId);
+
+    this.gangliaPropertyProvider = new GangliaHostPropertyProvider(componentPropertyInfoMap,
+                                            streamProvider,
+                                            configuration,
+                                            hostProvider,
+                                            clusterNamePropertyId,
+                                            hostNamePropertyId);
+}
+
+  private void createHostComponentPropertyProviders(Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
+                                            StreamProvider streamProvider,
+                                            ComponentSSLConfiguration configuration,
+                                            MetricHostProvider hostProvider,
+                                            String clusterNamePropertyId,
+                                            String hostNamePropertyId,
+                                            String componentNamePropertyId) {
+
+    this.amsPropertyProvider = new AMSHostComponentPropertyProvider(
+                                            componentPropertyInfoMap,
+                                            streamProvider,
+                                            configuration,
+                                            hostProvider,
+                                            clusterNamePropertyId,
+                                            hostNamePropertyId,
+                                            componentNamePropertyId);
+
+    this.gangliaPropertyProvider = new GangliaHostComponentPropertyProvider(
+                                            componentPropertyInfoMap,
+                                            streamProvider,
+                                            configuration,
+                                            hostProvider,
+                                            clusterNamePropertyId,
+                                            hostNamePropertyId,
+                                            componentNamePropertyId);
+  }
+
+  private void createComponentPropertyProviders(Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
+                                                StreamProvider streamProvider,
+                                                ComponentSSLConfiguration configuration,
+                                                MetricHostProvider hostProvider,
+                                                String clusterNamePropertyId,
+                                                String componentNamePropertyId) {
+
+    this.amsPropertyProvider = new AMSComponentPropertyProvider(
+                                            componentPropertyInfoMap,
+                                            streamProvider,
+                                            configuration,
+                                            hostProvider,
+                                            clusterNamePropertyId,
+                                            componentNamePropertyId);
+
+    this.gangliaPropertyProvider = new GangliaComponentPropertyProvider(
+                                            componentPropertyInfoMap,
+                                            streamProvider,
+                                            configuration,
+                                            hostProvider,
+                                            clusterNamePropertyId,
+                                            componentNamePropertyId);
+  }
+
+  @Override
+  public Set<Resource> populateResources(Set<Resource> resources, Request request,
+                                         Predicate predicate) throws SystemException {
+
+    if (metricsServiceProvider.getMetricsServiceType().equals(GANGLIA)) {
+      return gangliaPropertyProvider.populateResources(resources, request, predicate);
+    } else if (metricsServiceProvider.getMetricsServiceType().equals(TIMELINE_METRICS)) {
+      return amsPropertyProvider.populateResources(resources, request, predicate);
+    }
+    return null;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsReportPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsReportPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsReportPropertyProvider.java
index 39af1d9..20e11ad 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsReportPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsReportPropertyProvider.java
@@ -20,16 +20,11 @@ package org.apache.ambari.server.controller.metrics;
 import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
 import org.apache.ambari.server.controller.internal.AbstractPropertyProvider;
 import org.apache.ambari.server.controller.internal.PropertyInfo;
-import org.apache.ambari.server.controller.metrics.ganglia.GangliaReportPropertyProvider;
-import org.apache.ambari.server.controller.metrics.timeline.AMSReportPropertyProvider;
 import org.apache.ambari.server.controller.utilities.StreamProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import java.util.Map;
 
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService;
-
 public abstract class MetricsReportPropertyProvider extends AbstractPropertyProvider {
 
   protected final StreamProvider streamProvider;
@@ -62,27 +57,19 @@ public abstract class MetricsReportPropertyProvider extends AbstractPropertyProv
     this.configuration = configuration;
   }
 
-  public static MetricsReportPropertyProvider createInstance(
-          MetricsService metricsService,
+  public static MetricsReportPropertyProviderProxy createInstance(
           Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
           StreamProvider streamProvider,
           ComponentSSLConfiguration configuration,
           MetricHostProvider hostProvider,
+          MetricsServiceProvider serviceProvider,
           String clusterNamePropertyId) {
-    if (metricsService.equals(MetricsService.GANGLIA)) {
-      return new GangliaReportPropertyProvider(
-        componentPropertyInfoMap,
-        streamProvider,
-        configuration,
-        hostProvider,
-        clusterNamePropertyId);
-    } else {
-      return new AMSReportPropertyProvider(
-        componentPropertyInfoMap,
-        streamProvider,
-        configuration,
-        hostProvider,
-        clusterNamePropertyId);
-    }
+
+    return new MetricsReportPropertyProviderProxy(componentPropertyInfoMap,
+                                                  streamProvider,
+                                                  configuration,
+                                                  hostProvider,
+                                                  serviceProvider,
+                                                  clusterNamePropertyId);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsReportPropertyProviderProxy.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsReportPropertyProviderProxy.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsReportPropertyProviderProxy.java
new file mode 100644
index 0000000..154046f
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsReportPropertyProviderProxy.java
@@ -0,0 +1,93 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.metrics;
+
+import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
+import org.apache.ambari.server.controller.internal.AbstractPropertyProvider;
+import org.apache.ambari.server.controller.internal.PropertyInfo;
+import org.apache.ambari.server.controller.metrics.ganglia.GangliaReportPropertyProvider;
+import org.apache.ambari.server.controller.metrics.timeline.AMSReportPropertyProvider;
+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.SystemException;
+import org.apache.ambari.server.controller.utilities.StreamProvider;
+
+import java.util.Map;
+import java.util.Set;
+
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.GANGLIA;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.TIMELINE_METRICS;
+
+public class MetricsReportPropertyProviderProxy extends AbstractPropertyProvider {
+  private MetricsReportPropertyProvider amsMetricsReportProvider;
+  private MetricsReportPropertyProvider gangliaMetricsReportProvider;
+  private final MetricsServiceProvider metricsServiceProvider;
+
+  public MetricsReportPropertyProviderProxy(
+    Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
+    StreamProvider streamProvider,
+    ComponentSSLConfiguration configuration,
+    MetricHostProvider hostProvider,
+    MetricsServiceProvider serviceProvider,
+    String clusterNamePropertyId) {
+
+
+    super(componentPropertyInfoMap);
+    this.metricsServiceProvider = serviceProvider;
+
+    createReportPropertyProviders(componentPropertyInfoMap,
+      streamProvider,
+      configuration,
+      hostProvider,
+      clusterNamePropertyId);
+  }
+
+  private void createReportPropertyProviders(Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
+                                             StreamProvider streamProvider,
+                                             ComponentSSLConfiguration configuration,
+                                             MetricHostProvider hostProvider,
+                                             String clusterNamePropertyId) {
+
+    this.amsMetricsReportProvider = new AMSReportPropertyProvider(
+      componentPropertyInfoMap,
+      streamProvider,
+      configuration,
+      hostProvider,
+      clusterNamePropertyId);
+
+    this.gangliaMetricsReportProvider = new GangliaReportPropertyProvider(
+      componentPropertyInfoMap,
+      streamProvider,
+      configuration,
+      hostProvider,
+      clusterNamePropertyId);
+  }
+
+  @Override
+  public Set<Resource> populateResources(Set<Resource> resources, Request request,
+                                         Predicate predicate) throws SystemException {
+
+    if (metricsServiceProvider.getMetricsServiceType().equals(GANGLIA)) {
+      return gangliaMetricsReportProvider.populateResources(resources, request, predicate);
+    } else if (metricsServiceProvider.getMetricsServiceType().equals(TIMELINE_METRICS)) {
+      return amsMetricsReportProvider.populateResources(resources, request, predicate);
+    }
+    return null;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsServiceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsServiceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsServiceProvider.java
new file mode 100644
index 0000000..f9f9dc6
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/MetricsServiceProvider.java
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.metrics;
+
+public interface MetricsServiceProvider {
+
+  /**
+   * Enumeration to distinguish metrics service installed for a cluster
+   */
+  public enum MetricsService {
+    GANGLIA,
+    TIMELINE_METRICS
+  }
+
+  /**
+   * Provide type of metrics service installed.
+   * @return @MetricsService
+   */
+  public MetricsService getMetricsServiceType();
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaHostPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaHostPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaHostPropertyProvider.java
index df58ee5..41a500f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaHostPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaHostPropertyProvider.java
@@ -23,7 +23,6 @@ import org.apache.ambari.server.controller.internal.PropertyInfo;
 import org.apache.ambari.server.controller.metrics.MetricHostProvider;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.utilities.StreamProvider;
-
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProvider.java
index 63533c6..e23f461 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProvider.java
@@ -18,25 +18,34 @@
 
 package org.apache.ambari.server.controller.metrics.ganglia;
 
-import org.apache.ambari.server.controller.internal.AbstractPropertyProvider;
 import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
 import org.apache.ambari.server.controller.internal.PropertyInfo;
 import org.apache.ambari.server.controller.metrics.MetricHostProvider;
 import org.apache.ambari.server.controller.metrics.MetricsPropertyProvider;
-import org.apache.ambari.server.controller.spi.*;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.TemporalInfo;
 import org.apache.ambari.server.controller.utilities.StreamProvider;
 import org.apache.http.client.utils.URIBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService.*;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.GANGLIA;
 
 /**
  * Abstract property provider implementation for a Ganglia source.
@@ -87,15 +96,10 @@ public abstract class GangliaPropertyProvider extends MetricsPropertyProvider {
   // ----- PropertyProvider --------------------------------------------------
 
   @Override
-  public Set<Resource> populateResources(Set<Resource> resources, Request request, Predicate predicate)
-      throws SystemException {
-
-    Set<String> ids = getRequestPropertyIds(request, predicate);
-    if (ids.isEmpty()) {
-      return resources;
-    }
+  public Set<Resource> populateResourcesWithProperties(Set<Resource> resources,
+            Request request, Set<String> propertyIds) throws SystemException {
 
-    Map<String, Map<TemporalInfo, RRDRequest>> requestMap = getRRDRequests(resources, request, ids);
+    Map<String, Map<TemporalInfo, RRDRequest>> requestMap = getRRDRequests(resources, request, propertyIds);
 
     // For each cluster...
     for (Map.Entry<String, Map<TemporalInfo, RRDRequest>> clusterEntry : requestMap.entrySet()) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaReportPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaReportPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaReportPropertyProvider.java
index 09ea31c..e8dc7d1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaReportPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaReportPropertyProvider.java
@@ -32,15 +32,13 @@ import org.codehaus.jackson.map.ObjectMapper;
 import org.codehaus.jackson.type.TypeReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService.GANGLIA;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.GANGLIA;
 
 /**
  * Property provider implementation for a Ganglia source. This provider is specialized

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProvider.java
index d75c982..9e51a61 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProvider.java
@@ -21,25 +21,18 @@ import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
 import org.apache.ambari.server.controller.internal.PropertyInfo;
 import org.apache.ambari.server.controller.metrics.MetricHostProvider;
 import org.apache.ambari.server.controller.metrics.MetricsPropertyProvider;
-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.SystemException;
 import org.apache.ambari.server.controller.spi.TemporalInfo;
 import org.apache.ambari.server.controller.utilities.StreamProvider;
-import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.params.HttpMethodParams;
 import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
 import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
-import org.apache.http.HttpStatus;
 import org.apache.http.client.utils.URIBuilder;
 import org.codehaus.jackson.map.AnnotationIntrospector;
 import org.codehaus.jackson.map.ObjectMapper;
 import org.codehaus.jackson.map.ObjectReader;
 import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -54,8 +47,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService.TIMELINE_METRICS;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.TIMELINE_METRICS;
 import static org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
 public abstract class AMSPropertyProvider extends MetricsPropertyProvider {
@@ -329,16 +321,11 @@ public abstract class AMSPropertyProvider extends MetricsPropertyProvider {
   }
 
   @Override
-  public Set<Resource> populateResources(Set<Resource> resources,
-              Request request, Predicate predicate) throws SystemException {
-
-    Set<String> ids = getRequestPropertyIds(request, predicate);
-    if (ids.isEmpty()) {
-      return resources;
-    }
+  public Set<Resource> populateResourcesWithProperties(Set<Resource> resources,
+               Request request, Set<String> propertyIds) throws SystemException {
 
     Map<String, Map<TemporalInfo, MetricsRequest>> requestMap =
-      getMetricsRequests(resources, request, ids);
+      getMetricsRequests(resources, request, propertyIds);
 
     // For each cluster
     for (Map.Entry<String, Map<TemporalInfo, MetricsRequest>> clusterEntry : requestMap.entrySet()) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MetricsServiceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MetricsServiceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MetricsServiceProviderTest.java
new file mode 100644
index 0000000..9e4131f
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MetricsServiceProviderTest.java
@@ -0,0 +1,135 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+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.junit.Assert;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.apache.ambari.server.controller.internal.ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID;
+import static org.apache.ambari.server.controller.internal.HostComponentResourceProvider.HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID;
+import static org.apache.ambari.server.controller.internal.HostComponentResourceProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID;
+import static org.apache.ambari.server.controller.internal.HostComponentResourceProvider.HOST_COMPONENT_HOST_NAME_PROPERTY_ID;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class MetricsServiceProviderTest {
+
+  @SuppressWarnings("unchecked")
+  @Test
+  public void testResetMetricProviderMap() throws Exception {
+    TestMetricProviderModule providerModule = new TestMetricProviderModule();
+
+    ResourceProvider clusterResourceProvider = providerModule.getResourceProvider(Resource.Type.Cluster);
+
+    final Resource cluster = mock(Resource.class);
+    final Set<Resource> resources = new HashSet<Resource>() {{ add(cluster); }};
+    when(clusterResourceProvider.getResources((Request) any(),
+      (Predicate) any())).thenReturn(resources);
+    when(cluster.getPropertyValue(CLUSTER_NAME_PROPERTY_ID)).thenReturn("c1");
+
+    // Assert requests and predicates used
+    ResourceProvider hostComponentResourceProvider = providerModule
+      .getResourceProvider(Resource.Type.HostComponent);
+
+    Set<String> propertyIds = new HashSet<String>();
+    propertyIds.add(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+    propertyIds.add(HOST_COMPONENT_HOST_NAME_PROPERTY_ID);
+
+    Request expectedRequest = PropertyHelper.getReadRequest(propertyIds);
+
+    Predicate expectedPredicate1 =
+      new PredicateBuilder().property(HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID)
+        .equals("c1").and().property(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID)
+        .equals("GANGLIA_SERVER").toPredicate();
+
+    Predicate expectedPredicate2 =
+      new PredicateBuilder().property(HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID)
+        .equals("c1").and().property(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID)
+        .equals("METRIC_COLLECTOR").toPredicate();
+
+    ArgumentCaptor<Request> requestCapture = ArgumentCaptor.forClass(Request.class);
+    ArgumentCaptor<Predicate> predicateCapture = ArgumentCaptor.forClass(Predicate.class);
+
+    when(hostComponentResourceProvider.getResources(any(Request.class),
+      any(Predicate.class))).thenReturn(Collections.<Resource>emptySet());
+
+    // Assert default null
+    MetricsService service = providerModule.getMetricsServiceType();
+    verify(hostComponentResourceProvider, times(3)).getResources(requestCapture
+      .capture(), predicateCapture.capture());
+
+    List<Request> requests = requestCapture.getAllValues();
+    Request request1 = requests.get(requests.size() - 2); // GANGLIA check
+    Request request2 = requests.get(requests.size() - 1); // COLLECTOR check
+
+    List<Predicate> predicates = predicateCapture.getAllValues();
+    Predicate predicate1 = predicates.get(predicates.size() - 2);
+    Predicate predicate2 = predicates.get(predicates.size() - 1);
+
+    Assert.assertEquals(expectedRequest, request1);
+    Assert.assertEquals(expectedRequest, request2);
+    Assert.assertEquals(expectedPredicate1, predicate1);
+    Assert.assertEquals(expectedPredicate2, predicate2);
+
+    Assert.assertEquals(null, service);
+
+    // Assert change to actual service
+
+    final Resource hostComponent = mock(Resource.class);
+    Set<Resource> hostComponents = new HashSet<Resource>() {{ add(hostComponent); }};
+    when(hostComponentResourceProvider.getResources(any(Request.class),
+      any(Predicate.class))).thenReturn(hostComponents);
+    when(hostComponent.getPropertyValue
+      (HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID)).thenReturn("METRIC_COLLECTOR");
+    when(hostComponent.getPropertyValue(HOST_COMPONENT_HOST_NAME_PROPERTY_ID)).thenReturn("h1");
+
+    service = providerModule.getMetricsServiceType();
+    Assert.assertEquals(MetricsService.TIMELINE_METRICS, service);
+  }
+
+  private static class TestMetricProviderModule extends AbstractProviderModule {
+    ResourceProvider clusterResourceProvider = mock(ClusterResourceProvider.class);
+
+    ResourceProvider hostCompResourceProvider = mock(HostComponentResourceProvider.class);
+
+    @Override
+    protected ResourceProvider createResourceProvider(Resource.Type type) {
+      if (type == Resource.Type.Cluster)
+        return clusterResourceProvider;
+      else if (type == Resource.Type.HostComponent)
+        return hostCompResourceProvider;
+      return null;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProviderTest.java
index 8198e9c..c31cc37 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProviderTest.java
@@ -34,9 +34,9 @@ import org.apache.ambari.server.controller.utilities.StreamProvider;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.Metric;
 import org.junit.After;
@@ -54,6 +54,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.apache.ambari.server.controller.metrics.ganglia.GangliaPropertyProviderTest.TestGangliaServiceProvider;
+
 /**
  * Tests the stack defined property provider.
  */
@@ -103,10 +105,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider tj = new JMXPropertyProviderTest.TestJMXHostProvider(true);
     TestGangliaHostProvider tg = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider tm = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider sdpp = new StackDefinedPropertyProvider(
-        Resource.Type.HostComponent, tj, tm, new CombinedStreamProvider(),
-        "HostRoles/cluster_name", "HostRoles/host_name", "HostRoles/component_name", "HostRoles/state", null, null);
+        Resource.Type.HostComponent, tj, tm, serviceProvider,
+        new CombinedStreamProvider(), "HostRoles/cluster_name",
+        "HostRoles/host_name", "HostRoles/component_name", "HostRoles/state",
+        null, null);
 
     Resource resource = new ResourceImpl(Resource.Type.HostComponent);
 
@@ -290,11 +295,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider hostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(true);
     TestGangliaHostProvider gangliaHostProvider = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         hostProvider,
         metricsHostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -351,11 +358,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider hostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(false);
     TestGangliaHostProvider gangliaHostProvider = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         hostProvider,
         metricsHostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -403,11 +412,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider hostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(false);
     TestGangliaHostProvider gangliaHostProvider = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         hostProvider,
         metricsHostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -440,12 +451,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider hostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(false);
     TestGangliaHostProvider gangliaHostProvider = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         hostProvider,
-
         metricsHostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -493,12 +505,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider hostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(false);
     TestGangliaHostProvider gangliaHostProvider = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         hostProvider,
-
         metricsHostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -552,12 +565,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider hostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(false);
     TestGangliaHostProvider gangliaHostProvider = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         hostProvider,
-
         metricsHostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -678,11 +692,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider hostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(false);
     TestGangliaHostProvider gangliaHostProvider = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         hostProvider,
         gangliaHostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -720,12 +736,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider hostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(false);
     TestGangliaHostProvider gangliaHostProvider = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         hostProvider,
-
         metricsHostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         null,
@@ -757,11 +774,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider hostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(false);
     TestGangliaHostProvider gangliaHostProvider = new TestGangliaHostProvider();
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         hostProvider,
         metricsHostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -799,11 +818,13 @@ public class StackDefinedPropertyProviderTest {
 
     JMXPropertyProviderTest.TestJMXHostProvider jmxHostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(true);
     TestGangliaHostProvider hostProvider = new TestGangliaHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         jmxHostProvider,
         hostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -845,11 +866,13 @@ public class StackDefinedPropertyProviderTest {
 
     JMXPropertyProviderTest.TestJMXHostProvider jmxHostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(true);
     TestGangliaHostProvider hostProvider = new TestGangliaHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         jmxHostProvider,
         hostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),
@@ -968,11 +991,13 @@ public class StackDefinedPropertyProviderTest {
     JMXPropertyProviderTest.TestJMXHostProvider jmxHostProvider = new JMXPropertyProviderTest.TestJMXHostProvider(true);
     JMXPropertyProviderTest.TestMetricHostProvider metricsHostProvider = new JMXPropertyProviderTest.TestMetricHostProvider();
     TestGangliaHostProvider hostProvider = new TestGangliaHostProvider();
+    TestGangliaServiceProvider serviceProvider = new TestGangliaServiceProvider();
 
     StackDefinedPropertyProvider propertyProvider = new StackDefinedPropertyProvider(
         Resource.Type.HostComponent,
         jmxHostProvider,
         hostProvider,
+        serviceProvider,
         streamProvider,
         PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
         PropertyHelper.getPropertyId("HostRoles", "host_name"),

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/JMXPropertyProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/JMXPropertyProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/JMXPropertyProviderTest.java
index a640ec2..69fb5f5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/JMXPropertyProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/JMXPropertyProviderTest.java
@@ -29,9 +29,12 @@ import org.apache.ambari.server.controller.spi.TemporalInfo;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.junit.Assert;
 import org.junit.Test;
-
-import java.util.*;
-
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService;
 
 /**
  * JMX property provider tests.
@@ -515,7 +518,7 @@ public class JMXPropertyProviderTest {
   public static class TestMetricHostProvider implements MetricHostProvider {
 
     @Override
-    public String getCollectorHostName(String clusterName, MetricsPropertyProvider.MetricsService service) throws SystemException {
+    public String getCollectorHostName(String clusterName, MetricsService service) throws SystemException {
       return null;
     }
 
@@ -525,17 +528,17 @@ public class JMXPropertyProviderTest {
     }
 
     @Override
-    public String getCollectorPortName(String clusterName, MetricsPropertyProvider.MetricsService service) throws SystemException {
+    public String getCollectorPortName(String clusterName, MetricsService service) throws SystemException {
       return null;
     }
 
     @Override
-    public boolean isCollectorHostLive(String clusterName, MetricsPropertyProvider.MetricsService service) throws SystemException {
+    public boolean isCollectorHostLive(String clusterName, MetricsService service) throws SystemException {
       return false;
     }
 
     @Override
-    public boolean isCollectorComponentLive(String clusterName, MetricsPropertyProvider.MetricsService service) throws SystemException {
+    public boolean isCollectorComponentLive(String clusterName, MetricsService service) throws SystemException {
       return false;
     }
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/RestMetricsPropertyProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/RestMetricsPropertyProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/RestMetricsPropertyProviderTest.java
index 51e88ed..c50ccba 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/RestMetricsPropertyProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/RestMetricsPropertyProviderTest.java
@@ -23,7 +23,6 @@ import com.google.inject.Injector;
 import org.apache.ambari.server.controller.internal.PropertyInfo;
 import org.apache.ambari.server.controller.internal.ResourceImpl;
 import org.apache.ambari.server.controller.internal.StackDefinedPropertyProvider;
-import org.apache.ambari.server.controller.jmx.JMXHostProvider;
 import org.apache.ambari.server.controller.jmx.TestStreamProvider;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
@@ -40,9 +39,13 @@ import org.apache.ambari.server.state.stack.MetricDefinition;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
-import java.util.*;
-
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
@@ -383,7 +386,7 @@ public class RestMetricsPropertyProviderTest {
   public static class TestMetricsHostProvider implements MetricHostProvider {
 
     @Override
-    public String getCollectorHostName(String clusterName, MetricsPropertyProvider.MetricsService service) throws SystemException {
+    public String getCollectorHostName(String clusterName, MetricsService service) throws SystemException {
       return null;
     }
 
@@ -393,17 +396,17 @@ public class RestMetricsPropertyProviderTest {
     }
 
     @Override
-    public String getCollectorPortName(String clusterName, MetricsPropertyProvider.MetricsService service) throws SystemException {
+    public String getCollectorPortName(String clusterName, MetricsService service) throws SystemException {
       return null;
     }
 
     @Override
-    public boolean isCollectorHostLive(String clusterName, MetricsPropertyProvider.MetricsService service) throws SystemException {
+    public boolean isCollectorHostLive(String clusterName, MetricsService service) throws SystemException {
       return false;
     }
 
     @Override
-    public boolean isCollectorComponentLive(String clusterName, MetricsPropertyProvider.MetricsService service) throws SystemException {
+    public boolean isCollectorComponentLive(String clusterName, MetricsService service) throws SystemException {
       return false;
     }
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/2160d544/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProviderTest.java
index 30a7598..befd062 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaPropertyProviderTest.java
@@ -23,6 +23,7 @@ import org.apache.ambari.server.controller.internal.PropertyInfo;
 import org.apache.ambari.server.controller.internal.ResourceImpl;
 import org.apache.ambari.server.controller.internal.TemporalInfoImpl;
 import org.apache.ambari.server.controller.metrics.MetricHostProvider;
+import org.apache.ambari.server.controller.metrics.MetricsServiceProvider;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.SystemException;
@@ -38,7 +39,6 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.powermock.api.easymock.PowerMock;
 import org.powermock.core.classloader.annotations.PrepareForTest;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -48,9 +48,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService;
-import static org.apache.ambari.server.controller.metrics.MetricsPropertyProvider.MetricsService.GANGLIA;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService;
+import static org.apache.ambari.server.controller.metrics.MetricsServiceProvider.MetricsService.GANGLIA;
 import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
@@ -841,6 +840,14 @@ public class GangliaPropertyProviderTest {
     return metricsBuilder.toString();
   }
 
+  public static class TestGangliaServiceProvider implements MetricsServiceProvider {
+
+    @Override
+    public MetricsService getMetricsServiceType() {
+      return MetricsService.GANGLIA;
+    }
+  }
+
   public static class TestGangliaHostProvider implements MetricHostProvider {
 
     private boolean isHostLive;