Bladeren bron

AMBARI-3987 - Resource providers are set with wrong stack version.

tbeerbower 12 jaren geleden
bovenliggende
commit
29ebc51701

+ 23 - 3
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java

@@ -48,6 +48,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * An abstract provider module implementation.
@@ -315,6 +317,18 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
 
   // ----- utility methods ---------------------------------------------------
 
+  /**
+   * Get the metrics version for the given cluster name.
+   *
+   * @param clusterName  the cluster name
+   *
+   * @return the metrics version for the given cluster name
+   */
+  protected PropertyHelper.MetricsVersion getMetricsVersion(String clusterName) {
+    updateClusterVersion();
+    return clusterVersionsMap.get(clusterName);
+  }
+
   protected abstract ResourceProvider createResourceProvider(Resource.Type type);
 
   protected void registerResourceProvider(Resource.Type type) {
@@ -444,9 +458,15 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
 
         for (Resource cluster : clusters) {
           String clusterVersion = (String) cluster.getPropertyValue(CLUSTER_VERSION_PROPERTY_ID);
-
-          PropertyHelper.MetricsVersion version =  clusterVersion.startsWith("HDP-1") ?
-              PropertyHelper.MetricsVersion.HDP1 : PropertyHelper.MetricsVersion.HDP2;
+          PropertyHelper.MetricsVersion version = PropertyHelper.MetricsVersion.HDP2;
+
+          Matcher m = Pattern.compile("[0-9]+(\\.[0-9]+)+").matcher(clusterVersion);
+          if (m.find()) {
+            clusterVersion = m.group(0);
+            if (clusterVersion.equals("1") || clusterVersion.startsWith("1.")) {
+              version = PropertyHelper.MetricsVersion.HDP1;
+            }
+          }
 
           clusterVersionsMap.put(
               (String) cluster.getPropertyValue(CLUSTER_NAME_PROPERTY_ID),

+ 121 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractProviderModuleTest.java

@@ -0,0 +1,121 @@
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
+import org.apache.ambari.server.controller.spi.NoSuchResourceException;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * AbstractProviderModule tests.
+ */
+public class AbstractProviderModuleTest {
+  @Test
+  public void testGetMetricsVersion() throws Exception {
+
+    TestAbstractProviderModule module = new TestAbstractProviderModule("HDP-1.0");
+    PropertyHelper.MetricsVersion version = module.getMetricsVersion("c1");
+    Assert.assertEquals(PropertyHelper.MetricsVersion.HDP1, version);
+    version = module.getMetricsVersion("c2");
+    Assert.assertNull(version);
+
+    module = new TestAbstractProviderModule("HDPLocal-1.3.2");
+    version = module.getMetricsVersion("c1");
+    Assert.assertEquals(PropertyHelper.MetricsVersion.HDP1, version);
+
+    module = new TestAbstractProviderModule("HDP-2.0.1");
+    version = module.getMetricsVersion("c1");
+    Assert.assertEquals(PropertyHelper.MetricsVersion.HDP2, version);
+
+    module = new TestAbstractProviderModule("HDP-2.0.1.x");
+    version = module.getMetricsVersion("c1");
+    Assert.assertEquals(PropertyHelper.MetricsVersion.HDP2, version);
+
+    module = new TestAbstractProviderModule("HDP-9.9.9");
+    version = module.getMetricsVersion("c1");
+    Assert.assertEquals(PropertyHelper.MetricsVersion.HDP2, version);
+
+    module = new TestAbstractProviderModule("HDPLocal-2.0.0");
+    version = module.getMetricsVersion("c1");
+    Assert.assertEquals(PropertyHelper.MetricsVersion.HDP2, version);
+  }
+
+  private static class TestAbstractProviderModule extends AbstractProviderModule {
+    private final String clusterVersion;
+
+    private TestAbstractProviderModule(String clusterVersion) {
+      this.clusterVersion = clusterVersion;
+    }
+
+    @Override
+    protected ResourceProvider createResourceProvider(Resource.Type type) {
+      return new TestResourceProvider(type, clusterVersion);
+    }
+  }
+
+  private static class TestResourceProvider implements ResourceProvider {
+    private final Resource.Type type;
+    private final String clusterVersion;
+
+    private TestResourceProvider(Resource.Type type, String clusterVersion) {
+      this.type = type;
+      this.clusterVersion = clusterVersion;
+    }
+
+    @Override
+    public RequestStatus createResources(Request request)
+        throws SystemException, UnsupportedPropertyException,
+        ResourceAlreadyExistsException, NoSuchParentResourceException {
+      return null;
+    }
+
+    @Override
+    public Set<Resource> getResources(Request request, Predicate predicate)
+        throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+
+      if (type == Resource.Type.Cluster) {
+        Resource cluster = new ResourceImpl(Resource.Type.Cluster);
+        cluster.setProperty(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID, 1);
+        cluster.setProperty(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID, "c1");
+        cluster.setProperty(ClusterResourceProvider.CLUSTER_VERSION_PROPERTY_ID, clusterVersion);
+
+        return Collections.singleton(cluster);
+      }
+      return Collections.emptySet();
+    }
+
+    @Override
+    public RequestStatus updateResources(Request request, Predicate predicate)
+        throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+      return null;
+    }
+
+    @Override
+    public RequestStatus deleteResources(Predicate predicate)
+        throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+      return null;
+    }
+
+    @Override
+    public Map<Resource.Type, String> getKeyPropertyIds() {
+      return null;
+    }
+
+    @Override
+    public Set<String> checkPropertyIds(Set<String> propertyIds) {
+      return null;
+    }
+  }
+}