diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java index a91a6027740..fd961f292d5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java @@ -132,11 +132,11 @@ public class RouterAdmin extends Configured implements Tool { try { if ("-add".equals(cmd)) { if (addMount(argv, i)) { - System.err.println("Successfuly added mount point " + argv[i]); + System.out.println("Successfuly added mount point " + argv[i]); } } else if ("-rm".equals(cmd)) { if (removeMount(argv[i])) { - System.err.println("Successfully removed mount point " + argv[i]); + System.out.println("Successfully removed mount point " + argv[i]); } } else if ("-ls".equals(cmd)) { if (argv.length > 1) { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java index 3882b8b3607..9e82967b014 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterAdminCLI.java @@ -18,16 +18,20 @@ package org.apache.hadoop.hdfs.server.federation.router; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.net.InetSocketAddress; +import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.server.federation.RouterConfigBuilder; import org.apache.hadoop.hdfs.server.federation.RouterDFSCluster.RouterContext; import org.apache.hadoop.hdfs.server.federation.StateStoreDFSCluster; +import org.apache.hadoop.hdfs.server.federation.resolver.RemoteLocation; import org.apache.hadoop.hdfs.server.federation.store.StateStoreService; import org.apache.hadoop.hdfs.server.federation.store.impl.MountTableStoreImpl; import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesRequest; @@ -36,6 +40,7 @@ import org.apache.hadoop.hdfs.server.federation.store.records.MountTable; import org.apache.hadoop.hdfs.tools.federation.RouterAdmin; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.util.ToolRunner; +import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; @@ -83,12 +88,123 @@ public class TestRouterAdminCLI { } @AfterClass - public static void tearDown() { + public static void tearDownCluster() { cluster.stopRouter(routerContext); cluster.shutdown(); cluster = null; } + @After + public void tearDown() { + // set back system out + System.setOut(OLD_OUT); + } + + @Test + public void testAddMountTable() throws Exception { + String nsId = "ns0"; + String src = "/test-addmounttable"; + String dest = "/addmounttable"; + String[] argv = new String[] {"-add", src, nsId, dest}; + Assert.assertEquals(0, ToolRunner.run(admin, argv)); + + stateStore.loadCache(MountTableStoreImpl.class, true); + GetMountTableEntriesRequest getRequest = GetMountTableEntriesRequest + .newInstance(src); + GetMountTableEntriesResponse getResponse = client.getMountTableManager() + .getMountTableEntries(getRequest); + MountTable mountTable = getResponse.getEntries().get(0); + + List destinations = mountTable.getDestinations(); + assertEquals(1, destinations.size()); + + assertEquals(src, mountTable.getSourcePath()); + assertEquals(nsId, destinations.get(0).getNameserviceId()); + assertEquals(dest, destinations.get(0).getDest()); + assertFalse(mountTable.isReadOnly()); + + // test mount table update behavior + dest = dest + "-new"; + argv = new String[] {"-add", src, nsId, dest, "-readonly"}; + Assert.assertEquals(0, ToolRunner.run(admin, argv)); + stateStore.loadCache(MountTableStoreImpl.class, true); + + getResponse = client.getMountTableManager() + .getMountTableEntries(getRequest); + mountTable = getResponse.getEntries().get(0); + assertEquals(2, mountTable.getDestinations().size()); + assertEquals(nsId, mountTable.getDestinations().get(1).getNameserviceId()); + assertEquals(dest, mountTable.getDestinations().get(1).getDest()); + assertTrue(mountTable.isReadOnly()); + } + + @Test + public void testListMountTable() throws Exception { + String nsId = "ns0"; + String src = "/test-lsmounttable"; + String dest = "/lsmounttable"; + String[] argv = new String[] {"-add", src, nsId, dest}; + assertEquals(0, ToolRunner.run(admin, argv)); + + // re-set system out for testing + System.setOut(new PrintStream(out)); + stateStore.loadCache(MountTableStoreImpl.class, true); + argv = new String[] {"-ls", src}; + assertEquals(0, ToolRunner.run(admin, argv)); + assertTrue(out.toString().contains(src)); + + out.reset(); + GetMountTableEntriesRequest getRequest = GetMountTableEntriesRequest + .newInstance("/"); + GetMountTableEntriesResponse getResponse = client.getMountTableManager() + .getMountTableEntries(getRequest); + + // Test ls command without input path, it will list + // mount table under root path. + argv = new String[] {"-ls"}; + assertEquals(0, ToolRunner.run(admin, argv)); + assertTrue(out.toString().contains(src)); + String outStr = out.toString(); + // verify if all the mount table are listed + for(MountTable entry: getResponse.getEntries()) { + assertTrue(outStr.contains(entry.getSourcePath())); + } + } + + @Test + public void testRemoveMountTable() throws Exception { + String nsId = "ns0"; + String src = "/test-rmmounttable"; + String dest = "/rmmounttable"; + String[] argv = new String[] {"-add", src, nsId, dest}; + assertEquals(0, ToolRunner.run(admin, argv)); + + stateStore.loadCache(MountTableStoreImpl.class, true); + GetMountTableEntriesRequest getRequest = GetMountTableEntriesRequest + .newInstance(src); + GetMountTableEntriesResponse getResponse = client.getMountTableManager() + .getMountTableEntries(getRequest); + // ensure mount table added successfully + MountTable mountTable = getResponse.getEntries().get(0); + assertEquals(src, mountTable.getSourcePath()); + + argv = new String[] {"-rm", src}; + assertEquals(0, ToolRunner.run(admin, argv)); + + stateStore.loadCache(MountTableStoreImpl.class, true); + getResponse = client.getMountTableManager() + .getMountTableEntries(getRequest); + assertEquals(0, getResponse.getEntries().size()); + + // remove an invalid mount table + String invalidPath = "/invalid"; + System.setOut(new PrintStream(out)); + argv = new String[] {"-rm", invalidPath}; + assertEquals(0, ToolRunner.run(admin, argv)); + assertTrue(out.toString().contains( + "Cannot remove mount point " + invalidPath)); + } + @Test public void testMountTableDefaultACL() throws Exception { String[] argv = new String[] {"-add", "/testpath0", "ns0", "/testdir0"}; @@ -140,8 +256,7 @@ public class TestRouterAdminCLI { assertEquals(0, ToolRunner.run(admin, argv)); verifyExecutionResult("/testpath2-3", true, 0, 0); - // set back system out and login user - System.setOut(OLD_OUT); + // set back login user remoteUser = UserGroupInformation.createRemoteUser(superUser); UserGroupInformation.setLoginUser(remoteUser); }