Browse Source

AMBARI-2711 - Get call on host resource at api/v1/hosts/(hostname) returns empty response

tbeerbower 12 years ago
parent
commit
6e2fa0343a

+ 26 - 15
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java

@@ -530,14 +530,16 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
 
 
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
+    AbstractPropertyProvider lastProvider = null;
 
 
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
 
 
-      providers.put(version, new JMXPropertyProvider(PropertyHelper.getJMXPropertyIds(type, version), streamProvider,
-          jmxHostProvider, clusterNamePropertyId, hostNamePropertyId, componentNamePropertyId, statePropertyId, healthyStates));
+      lastProvider = new JMXPropertyProvider(PropertyHelper.getJMXPropertyIds(type, version), streamProvider,
+          jmxHostProvider, clusterNamePropertyId, hostNamePropertyId, componentNamePropertyId, statePropertyId, healthyStates);
+      providers.put(version, lastProvider);
     }
     }
 
 
-    return new VersioningPropertyProvider(clusterVersionsMap, providers, clusterNamePropertyId);
+    return new VersioningPropertyProvider(clusterVersionsMap, providers, lastProvider, clusterNamePropertyId);
   }
   }
 
 
   /**
   /**
@@ -551,14 +553,16 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
 
 
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
+    AbstractPropertyProvider lastProvider = null;
 
 
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
 
 
-      providers.put(version, new GangliaReportPropertyProvider(PropertyHelper.getGangliaPropertyIds(type, version), streamProvider,
-          configuration, hostProvider, clusterNamePropertyId));
+      lastProvider = new GangliaReportPropertyProvider(PropertyHelper.getGangliaPropertyIds(type, version), streamProvider,
+          configuration, hostProvider, clusterNamePropertyId);
+      providers.put(version, lastProvider);
     }
     }
 
 
-    return new VersioningPropertyProvider(clusterVersionsMap, providers, clusterNamePropertyId);
+    return new VersioningPropertyProvider(clusterVersionsMap, providers, lastProvider, clusterNamePropertyId);
   }
   }
 
 
   /**
   /**
@@ -573,14 +577,16 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
 
 
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
+    AbstractPropertyProvider lastProvider = null;
 
 
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
 
 
-      providers.put(version, new GangliaHostPropertyProvider(PropertyHelper.getGangliaPropertyIds(type, version), streamProvider,
-          configuration, hostProvider, clusterNamePropertyId, hostNamePropertyId));
+      lastProvider = new GangliaHostPropertyProvider(PropertyHelper.getGangliaPropertyIds(type, version), streamProvider,
+          configuration, hostProvider, clusterNamePropertyId, hostNamePropertyId);
+      providers.put(version, lastProvider);
     }
     }
 
 
-    return new VersioningPropertyProvider(clusterVersionsMap, providers, clusterNamePropertyId);
+    return new VersioningPropertyProvider(clusterVersionsMap, providers, lastProvider, clusterNamePropertyId);
   }
   }
 
 
   /**
   /**
@@ -595,14 +601,17 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
 
 
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
+    AbstractPropertyProvider lastProvider = null;
 
 
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
+      lastProvider =
+          new GangliaComponentPropertyProvider(PropertyHelper.getGangliaPropertyIds(type, version),
+              streamProvider, configuration, hostProvider, clusterNamePropertyId, componentNamePropertyId);
 
 
-      providers.put(version, new GangliaComponentPropertyProvider(PropertyHelper.getGangliaPropertyIds(type, version), streamProvider,
-          configuration, hostProvider, clusterNamePropertyId, componentNamePropertyId));
+      providers.put(version, lastProvider);
     }
     }
 
 
-    return new VersioningPropertyProvider(clusterVersionsMap, providers, clusterNamePropertyId);
+    return new VersioningPropertyProvider(clusterVersionsMap, providers, lastProvider, clusterNamePropertyId);
   }
   }
 
 
   /**
   /**
@@ -618,13 +627,15 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
 
 
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers =
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
         new HashMap<PropertyHelper.MetricsVersion, AbstractPropertyProvider>();
+    AbstractPropertyProvider lastProvider = null;
 
 
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
     for (PropertyHelper.MetricsVersion version : PropertyHelper.MetricsVersion.values()) {
 
 
-      providers.put(version, new GangliaHostComponentPropertyProvider(PropertyHelper.getGangliaPropertyIds(type, version), streamProvider,
-          configuration, hostProvider, clusterNamePropertyId, hostNamePropertyId, componentNamePropertyId));
+      lastProvider = new GangliaHostComponentPropertyProvider(PropertyHelper.getGangliaPropertyIds(type, version), streamProvider,
+          configuration, hostProvider, clusterNamePropertyId, hostNamePropertyId, componentNamePropertyId);
+      providers.put(version, lastProvider);
     }
     }
 
 
-    return new VersioningPropertyProvider(clusterVersionsMap, providers, clusterNamePropertyId);
+    return new VersioningPropertyProvider(clusterVersionsMap, providers, lastProvider, clusterNamePropertyId);
   }
   }
 }
 }

+ 16 - 8
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersioningPropertyProvider.java

@@ -38,6 +38,7 @@ public class VersioningPropertyProvider extends BaseProvider implements Property
 
 
   private final Map<String, PropertyHelper.MetricsVersion> clusterVersions;
   private final Map<String, PropertyHelper.MetricsVersion> clusterVersions;
   private final Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers;
   private final Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers;
+  private final AbstractPropertyProvider defaultProvider;
   private final String clusterNamePropertyId;
   private final String clusterNamePropertyId;
 
 
   /**
   /**
@@ -45,11 +46,13 @@ public class VersioningPropertyProvider extends BaseProvider implements Property
    */
    */
   public VersioningPropertyProvider(Map<String, PropertyHelper.MetricsVersion> clusterVersions,
   public VersioningPropertyProvider(Map<String, PropertyHelper.MetricsVersion> clusterVersions,
                                     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers,
                                     Map<PropertyHelper.MetricsVersion, AbstractPropertyProvider> providers,
+                                    AbstractPropertyProvider defaultProvider,
                                     String clusterNamePropertyId) {
                                     String clusterNamePropertyId) {
     super(getComponentMetrics(providers));
     super(getComponentMetrics(providers));
 
 
     this.clusterVersions       = clusterVersions;
     this.clusterVersions       = clusterVersions;
     this.providers             = providers;
     this.providers             = providers;
+    this.defaultProvider       = defaultProvider;
     this.clusterNamePropertyId = clusterNamePropertyId;
     this.clusterNamePropertyId = clusterNamePropertyId;
   }
   }
 
 
@@ -77,18 +80,23 @@ public class VersioningPropertyProvider extends BaseProvider implements Property
     // give each set of resources to the underlying provider that matches the
     // give each set of resources to the underlying provider that matches the
     // metrics version of the associated cluster
     // metrics version of the associated cluster
     for (Map.Entry<String, Set<Resource>> entry : resourcesByCluster.entrySet()) {
     for (Map.Entry<String, Set<Resource>> entry : resourcesByCluster.entrySet()) {
-      String clusterName = entry.getKey();
-      Set<Resource> resourceSet = entry.getValue();
+      String                   clusterName = entry.getKey();
+      Set<Resource>            resourceSet = entry.getValue();
+      AbstractPropertyProvider provider    = null;
 
 
-      PropertyHelper.MetricsVersion version = clusterVersions.get(clusterName);
+      if (clusterName == null) {
+        provider = defaultProvider;
+      } else {
+        PropertyHelper.MetricsVersion version = clusterVersions.get(clusterName);
 
 
-      if (version != null) {
-
-        AbstractPropertyProvider provider = providers.get(version);
-        if (provider != null) {
-          keepers.addAll(provider.populateResources(resourceSet, request, predicate));
+        if (version != null) {
+          provider = providers.get(version);
         }
         }
       }
       }
+
+      if (provider != null) {
+        keepers.addAll(provider.populateResources(resourceSet, request, predicate));
+      }
     }
     }
     return keepers;
     return keepers;
   }
   }

+ 15 - 2
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersioningPropertyProviderTest.java

@@ -69,8 +69,9 @@ public class VersioningPropertyProviderTest {
 
 
     providers.put(PropertyHelper.MetricsVersion.HDP2, propertyProvider2);
     providers.put(PropertyHelper.MetricsVersion.HDP2, propertyProvider2);
 
 
-
-    VersioningPropertyProvider provider = new VersioningPropertyProvider(clusterVersionsMap, providers, PropertyHelper.getPropertyId("HostRoles", "cluster_name"));
+    // set propertyProvider2 as the default provider
+    VersioningPropertyProvider provider = new VersioningPropertyProvider(clusterVersionsMap, providers,
+        propertyProvider2, PropertyHelper.getPropertyId("HostRoles", "cluster_name"));
 
 
 
 
     Request request = PropertyHelper.getReadRequest();
     Request request = PropertyHelper.getReadRequest();
@@ -106,6 +107,18 @@ public class VersioningPropertyProviderTest {
 
 
     Assert.assertEquals(resource1, propertyProvider1.getResource());
     Assert.assertEquals(resource1, propertyProvider1.getResource());
     Assert.assertEquals(resource2, propertyProvider2.getResource());
     Assert.assertEquals(resource2, propertyProvider2.getResource());
+
+
+    // test resource with no associated cluster ... should go to default provider2
+    propertyProvider1.setResource(null);
+    propertyProvider2.setResource(null);
+
+    Resource resource3 = new ResourceImpl(Resource.Type.HostComponent);
+
+    provider.populateResources(Collections.singleton(resource3), request, null);
+
+    Assert.assertNull(propertyProvider1.getResource());
+    Assert.assertEquals(resource3, propertyProvider2.getResource());
   }
   }
 
 
   private class TestJMXPropertyProvider extends JMXPropertyProvider {
   private class TestJMXPropertyProvider extends JMXPropertyProvider {