diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/RMAdminCLI.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/RMAdminCLI.java index ee389b3..a1cbdb1 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/RMAdminCLI.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/RMAdminCLI.java @@ -19,24 +19,26 @@ package org.apache.hadoop.yarn.client.cli; import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import java.util.Collection; import java.util.Map; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; import org.apache.hadoop.classification.InterfaceAudience.Private; import org.apache.hadoop.classification.InterfaceStability.Unstable; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.CommonConfigurationKeys; import org.apache.hadoop.ha.HAAdmin; import org.apache.hadoop.ha.HAServiceTarget; import org.apache.hadoop.ipc.RemoteException; import org.apache.hadoop.security.UserGroupInformation; -import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; import org.apache.hadoop.yarn.client.ClientRMProxy; import org.apache.hadoop.yarn.client.RMHAServiceTarget; +import org.apache.hadoop.yarn.conf.ConfigurationProvider; +import org.apache.hadoop.yarn.conf.ConfigurationProviderFactory; import org.apache.hadoop.yarn.conf.HAUtil; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.YarnException; @@ -58,6 +60,8 @@ private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); + private ConfigurationProvider configurationProvider; + protected final static Map ADMIN_USAGE = ImmutableMap.builder() .put("-refreshQueues", new UsageInfo("", @@ -82,12 +86,19 @@ "is specified.")) .build(); - public RMAdminCLI() { + public RMAdminCLI() throws Exception { super(); + this.configurationProvider = + initConfigurationProvider(new YarnConfiguration()); } - public RMAdminCLI(Configuration conf) { + public RMAdminCLI(Configuration conf) throws Exception{ super(conf); + YarnConfiguration yarnConf = + (conf instanceof YarnConfiguration) ? (YarnConfiguration) conf + : new YarnConfiguration(conf); + this.configurationProvider = + initConfigurationProvider(yarnConf); } private static void appendHAUsage(final StringBuilder usageBuilder) { @@ -192,10 +203,13 @@ private static void printUsage(String cmd) { } - protected ResourceManagerAdministrationProtocol createAdminProtocol() throws IOException { + protected ResourceManagerAdministrationProtocol createAdminProtocol() + throws IOException, YarnException { // Get the current configuration - final YarnConfiguration conf = new YarnConfiguration(getConf()); - return ClientRMProxy.createRMProxy(conf, ResourceManagerAdministrationProtocol.class); + final YarnConfiguration conf = + loadConfiguration(new YarnConfiguration(getConf())); + return ClientRMProxy.createRMProxy(conf, + ResourceManagerAdministrationProtocol.class); } private int refreshQueues() throws IOException, YarnException { @@ -254,7 +268,7 @@ private int refreshServiceAcls() throws IOException, YarnException { return 0; } - private int getGroups(String[] usernames) throws IOException { + private int getGroups(String[] usernames) throws IOException, YarnException { // Get groups users belongs to ResourceManagerAdministrationProtocol adminProtocol = createAdminProtocol(); @@ -296,8 +310,16 @@ public int run(String[] args) throws Exception { return exitCode; } + YarnConfiguration conf = loadConfiguration(new YarnConfiguration()); + if (USAGE.containsKey(cmd)) { - return super.run(args); + if (conf.getBoolean(YarnConfiguration.RM_HA_ENABLED, + YarnConfiguration.DEFAULT_RM_HA_ENABLED)) { + return super.run(args); + } + System.out.println("The RM HA is disabled. " + cmd + + " can only be executed when RM HA is enabled"); + return exitCode; } // @@ -397,7 +419,8 @@ protected HAServiceTarget resolveTarget(String rmId) { throw new IllegalArgumentException(msg.toString()); } try { - YarnConfiguration conf = new YarnConfiguration(getConf()); + YarnConfiguration conf = + loadConfiguration(new YarnConfiguration(getConf())); conf.set(YarnConfiguration.RM_HA_ID, rmId); return new RMHAServiceTarget(conf); } catch (IllegalArgumentException iae) { @@ -406,11 +429,44 @@ protected HAServiceTarget resolveTarget(String rmId) { } catch (IOException ioe) { throw new YarnRuntimeException( "Could not connect to RM HA Admin for node " + rmId); + } catch (YarnException e) { + throw new YarnRuntimeException( + "Could not connect to RM HA Admin for node " + rmId); } } + private ConfigurationProvider initConfigurationProvider(Configuration conf) + throws Exception { + ConfigurationProvider configurationProvider = + ConfigurationProviderFactory.getConfigurationProvider(conf); + configurationProvider.init(conf); + return configurationProvider; + } + + @VisibleForTesting + protected YarnConfiguration loadConfiguration(YarnConfiguration conf) + throws YarnException, IOException { + InputStream inputStream = + this.configurationProvider.getConfigurationInputStream(conf, + YarnConfiguration.YARN_SITE_CONFIGURATION_FILE); + conf.addResource(inputStream); + return conf; + } + + public void closeConfigurationProvider() throws Exception { + this.configurationProvider.close(); + } + public static void main(String[] args) throws Exception { - int result = ToolRunner.run(new RMAdminCLI(), args); - System.exit(result); + RMAdminCLI adminCLI = null; + try { + adminCLI = new RMAdminCLI(); + int result = ToolRunner.run(adminCLI, args); + System.exit(result); + } finally { + if (adminCLI != null) { + adminCLI.closeConfigurationProvider(); + } + } } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/TestRMAdminCLI.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/TestRMAdminCLI.java index cec8fcc..2e06e9a 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/TestRMAdminCLI.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/TestRMAdminCLI.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.never; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -38,6 +39,7 @@ import org.apache.hadoop.ha.HAServiceTarget; import org.apache.hadoop.yarn.client.cli.RMAdminCLI; import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.server.api.ResourceManagerAdministrationProtocol; import org.apache.hadoop.yarn.server.api.protocolrecords.RefreshAdminAclsRequest; import org.apache.hadoop.yarn.server.api.protocolrecords.RefreshNodesRequest; @@ -54,9 +56,10 @@ private ResourceManagerAdministrationProtocol admin; private HAServiceProtocol haadmin; private RMAdminCLI rmAdminCLI; + private RMAdminCLI rmAdminCLIWithHAEnabled; @Before - public void configure() throws IOException { + public void configure() throws Exception { admin = mock(ResourceManagerAdministrationProtocol.class); haadmin = mock(HAServiceProtocol.class); @@ -79,6 +82,27 @@ protected HAServiceTarget resolveTarget(String rmId) { return haServiceTarget; } }; + + rmAdminCLIWithHAEnabled = new RMAdminCLI() { + + @Override + protected ResourceManagerAdministrationProtocol createAdminProtocol() + throws IOException { + return admin; + } + + @Override + protected HAServiceTarget resolveTarget(String rmId) { + return haServiceTarget; + } + + @Override + protected YarnConfiguration loadConfiguration(YarnConfiguration conf) + throws YarnException, IOException { + conf.setBoolean(YarnConfiguration.RM_HA_ENABLED, true); + return conf; + } + }; } @Test(timeout=500) @@ -150,7 +174,16 @@ public boolean matches(Object argument) { @Test(timeout = 500) public void testTransitionToActive() throws Exception { String[] args = {"-transitionToActive", "rm1"}; + + // RM HA is disabled. + // transitionToActive should not be executed assertEquals(0, rmAdminCLI.run(args)); + verify(haadmin, never()).transitionToActive( + any(HAServiceProtocol.StateChangeRequestInfo.class)); + + // Now RM HA is enabled. + // transitionToActive should be executed + assertEquals(0, rmAdminCLIWithHAEnabled.run(args)); verify(haadmin).transitionToActive( any(HAServiceProtocol.StateChangeRequestInfo.class)); } @@ -158,7 +191,16 @@ public void testTransitionToActive() throws Exception { @Test(timeout = 500) public void testTransitionToStandby() throws Exception { String[] args = {"-transitionToStandby", "rm1"}; + + // RM HA is disabled. + // transitionToStandby should not be executed assertEquals(0, rmAdminCLI.run(args)); + verify(haadmin, never()).transitionToStandby( + any(HAServiceProtocol.StateChangeRequestInfo.class)); + + // Now RM HA is enabled. + // transitionToStandby should be executed + assertEquals(0, rmAdminCLIWithHAEnabled.run(args)); verify(haadmin).transitionToStandby( any(HAServiceProtocol.StateChangeRequestInfo.class)); } @@ -166,14 +208,30 @@ public void testTransitionToStandby() throws Exception { @Test(timeout = 500) public void testGetServiceState() throws Exception { String[] args = {"-getServiceState", "rm1"}; + + // RM HA is disabled. + // getServiceState should not be executed assertEquals(0, rmAdminCLI.run(args)); + verify(haadmin, never()).getServiceStatus(); + + // Now RM HA is enabled. + // getServiceState should be executed + assertEquals(0, rmAdminCLIWithHAEnabled.run(args)); verify(haadmin).getServiceStatus(); } @Test(timeout = 500) public void testCheckHealth() throws Exception { String[] args = {"-checkHealth", "rm1"}; + + // RM HA is disabled. + // checkHealth should not be executed assertEquals(0, rmAdminCLI.run(args)); + verify(haadmin, never()).monitorHealth(); + + // Now RM HA is enabled. + // checkHealth should be executed + assertEquals(0, rmAdminCLIWithHAEnabled.run(args)); verify(haadmin).monitorHealth(); }