diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/util/WebAppUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/util/WebAppUtils.java index e62bf104ae4..33b53b0d0ce 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/util/WebAppUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/util/WebAppUtils.java @@ -29,6 +29,7 @@ import java.util.Iterator; import java.util.List; +import com.google.common.annotations.VisibleForTesting; import org.apache.hadoop.classification.InterfaceAudience.Private; import org.apache.hadoop.classification.InterfaceStability.Evolving; import org.apache.hadoop.conf.Configuration; @@ -224,13 +225,27 @@ public static String getResolvedRemoteRMWebAppURLWithoutScheme(Configuration con Policy httpPolicy) { String rmId = null; if (HAUtil.isHAEnabled(conf)) { - // If HA enabled, pick one of the RM-IDs and rely on redirect to go to - // the Active RM - rmId = (String) HAUtil.getRMHAIds(conf).toArray()[0]; + // If HA enabled, get the active rm id + rmId = getActiveRMHAId(conf); } return getResolvedRemoteRMWebAppURLWithoutScheme(conf, httpPolicy, rmId); } + private static String testActiveRMHAId = null; + + @VisibleForTesting + public static void setTestActiveRMHAId(String rmId) { + testActiveRMHAId = rmId; + } + + private static String getActiveRMHAId(Configuration conf) { + if (testActiveRMHAId != null) { + return testActiveRMHAId; + } else { + return RMHAUtils.findActiveRMHAId(new YarnConfiguration(conf)); + } + } + public static String getResolvedRemoteRMWebAppURLWithoutScheme( Configuration conf, Policy httpPolicy, String rmId) { InetSocketAddress address = null; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/util/TestWebAppUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/util/TestWebAppUtils.java index d6f78b18c1b..10270d169a4 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/util/TestWebAppUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/util/TestWebAppUtils.java @@ -83,8 +83,11 @@ public void TestRMWebAppURLRemoteAndLocal() throws UnknownHostException { configuration.setBoolean(YarnConfiguration.RM_HA_ENABLED, true); configuration.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID + "," + RM2_NODE_ID); + WebAppUtils.setTestActiveRMHAId(RM2_NODE_ID); String rmRemoteUrl = WebAppUtils.getResolvedRemoteRMWebAppURLWithoutScheme(configuration); - Assert.assertEquals("ResolvedRemoteRMWebAppUrl should resolve to the first HA RM address", rm1Address, rmRemoteUrl); + Assert.assertEquals("ResolvedRemoteRMWebAppUrl should resolve to the active RM webapp address", + rm2Address, rmRemoteUrl); + WebAppUtils.setTestActiveRMHAId(null); String rmLocalUrl = WebAppUtils.getResolvedRMWebAppURLWithoutScheme(configuration); Assert.assertEquals("ResolvedRMWebAppUrl should resolve to the default RM webapp address", rmAddress, rmLocalUrl);