You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hcatalog-commits@incubator.apache.org by tr...@apache.org on 2012/09/10 23:29:03 UTC
svn commit: r1383152 [20/27] - in /incubator/hcatalog/trunk: ./
hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/
hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/drivers/
hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/ ...
Modified: incubator/hcatalog/trunk/src/test/org/apache/hcatalog/security/TestHdfsAuthorizationProvider.java
URL: http://svn.apache.org/viewvc/incubator/hcatalog/trunk/src/test/org/apache/hcatalog/security/TestHdfsAuthorizationProvider.java?rev=1383152&r1=1383151&r2=1383152&view=diff
==============================================================================
--- incubator/hcatalog/trunk/src/test/org/apache/hcatalog/security/TestHdfsAuthorizationProvider.java (original)
+++ incubator/hcatalog/trunk/src/test/org/apache/hcatalog/security/TestHdfsAuthorizationProvider.java Mon Sep 10 23:28:55 2012
@@ -52,531 +52,531 @@ import org.junit.Before;
import org.junit.Test;
public class TestHdfsAuthorizationProvider {
-
- protected HCatDriver hcatDriver;
- protected HiveMetaStoreClient msc;
- protected HiveConf conf;
- protected String whDir;
- protected Path whPath;
- protected FileSystem whFs;
- protected Warehouse wh;
- protected Hive hive;
-
- @Before
- public void setUp() throws Exception {
-
- conf = new HiveConf(this.getClass());
- conf.set(ConfVars.PREEXECHOOKS.varname, "");
- conf.set(ConfVars.POSTEXECHOOKS.varname, "");
- conf.set(ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-
- conf.set("hive.metastore.local", "true");
- conf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname, HCatSemanticAnalyzer.class.getName());
- conf.setBoolVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED, true);
- conf.setVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER,
- StorageDelegationAuthorizationProvider.class.getCanonicalName());
- conf.set("fs.pfile.impl", "org.apache.hadoop.fs.ProxyLocalFileSystem");
-
- whDir = System.getProperty("test.warehouse.dir", "/tmp/testhdfsauthorization_wh");
- conf.setVar(HiveConf.ConfVars.METASTOREWAREHOUSE, whDir);
-
- UserGroupInformation ugi = ShimLoader.getHadoopShims().getUGIForConf(conf);
- String username = ShimLoader.getHadoopShims().getShortUserName(ugi);
-
- whPath = new Path(whDir);
- whFs = whPath.getFileSystem(conf);
-
- wh = new Warehouse(conf);
- hive = Hive.get(conf);
-
- //clean up mess in HMS
- HcatTestUtils.cleanupHMS(hive, wh, perm700);
-
- whFs.delete(whPath, true);
- whFs.mkdirs(whPath, perm755);
-
- SessionState.start(new CliSessionState(conf));
- hcatDriver = new HCatDriver();
- }
-
- @After
- public void tearDown() throws IOException {
- whFs.close();
- hcatDriver.close();
- Hive.closeCurrent();
- }
-
- public Path getDbPath(String dbName) throws MetaException, HiveException {
- return HcatTestUtils.getDbPath(hive, wh, dbName);
- }
-
- public Path getTablePath(String dbName, String tableName) throws HiveException {
- Table table = hive.getTable(dbName, tableName);
- return table.getPath();
- }
-
- public Path getPartPath(String partName, String dbName, String tableName) throws HiveException {
- return new Path(getTablePath(dbName, tableName), partName);
- }
-
- /** Execute the query expecting success*/
- public void exec(String format, Object ... args) throws Exception {
- String command = String.format(format, args);
- CommandProcessorResponse resp = hcatDriver.run(command);
- Assert.assertEquals(resp.getErrorMessage(), 0, resp.getResponseCode());
- Assert.assertEquals(resp.getErrorMessage(), null, resp.getErrorMessage());
- }
-
- /** Execute the query expecting it to fail with AuthorizationException */
- public void execFail(String format, Object ... args) throws Exception {
- String command = String.format(format, args);
- CommandProcessorResponse resp = hcatDriver.run(command);
- Assert.assertNotSame(resp.getErrorMessage(), 0, resp.getResponseCode());
- Assert.assertTrue((resp.getResponseCode() == 40000) || (resp.getResponseCode() == 403));
- if(resp.getErrorMessage() != null){
- Assert.assertTrue(resp.getErrorMessage().contains("org.apache.hadoop.security.AccessControlException"));
- }
- }
-
-
- /**
- * Tests whether the warehouse directory is writable by the current user (as defined by Hadoop)
- */
- @Test
- public void testWarehouseIsWritable() throws Exception {
- Path top = new Path(whPath, "_foobarbaz12_");
- try {
- whFs.mkdirs(top);
- } finally {
- whFs.delete(top, true);
- }
- }
-
- @Test
- public void testShowDatabases() throws Exception {
- exec("CREATE DATABASE doo");
- exec("SHOW DATABASES");
-
- whFs.setPermission(whPath, perm300); //revoke r
- execFail("SHOW DATABASES");
- }
-
- @Test
- public void testDatabaseOps() throws Exception {
- exec("SHOW TABLES");
- exec("SHOW TABLE EXTENDED LIKE foo1");
-
- whFs.setPermission(whPath, perm700);
- exec("CREATE DATABASE doo");
- exec("DESCRIBE DATABASE doo");
- exec("USE doo");
- exec("SHOW TABLES");
- exec("SHOW TABLE EXTENDED LIKE foo1");
- exec("DROP DATABASE doo");
-
- //custom location
- Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
- whFs.mkdirs(dbPath, perm700);
- exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
- exec("DESCRIBE DATABASE doo2", dbPath.toUri());
- exec("USE doo2");
- exec("SHOW TABLES");
- exec("SHOW TABLE EXTENDED LIKE foo1");
- exec("DROP DATABASE doo2", dbPath.toUri());
-
- //custom non-existing location
- exec("CREATE DATABASE doo3 LOCATION '%s/subpath'", dbPath.toUri());
- }
-
- @Test
- public void testCreateDatabaseFail1() throws Exception {
- whFs.setPermission(whPath, perm500);
- execFail("CREATE DATABASE doo"); //in the default location
-
- whFs.setPermission(whPath, perm555);
- execFail("CREATE DATABASE doo2");
- }
-
- @Test
- public void testCreateDatabaseFail2() throws Exception {
- //custom location
- Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
-
- whFs.mkdirs(dbPath, perm700);
- whFs.setPermission(dbPath, perm500);
- execFail("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
- }
-
- @Test
- public void testDropDatabaseFail1() throws Exception {
- whFs.setPermission(whPath, perm700);
- exec("CREATE DATABASE doo"); //in the default location
-
- whFs.setPermission(getDbPath("doo"), perm500); //revoke write
- execFail("DROP DATABASE doo");
- }
-
- @Test
- public void testDropDatabaseFail2() throws Exception {
- //custom location
- Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
-
- whFs.mkdirs(dbPath, perm700);
- exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
-
- whFs.setPermission(dbPath, perm500);
- execFail("DROP DATABASE doo2");
- }
-
- @Test
- public void testDescSwitchDatabaseFail() throws Exception {
- whFs.setPermission(whPath, perm700);
- exec("CREATE DATABASE doo");
- whFs.setPermission(getDbPath("doo"), perm300); //revoke read
- execFail("DESCRIBE DATABASE doo");
- execFail("USE doo");
-
- //custom location
- Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
- whFs.mkdirs(dbPath, perm700);
- exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
- whFs.mkdirs(dbPath, perm300); //revoke read
- execFail("DESCRIBE DATABASE doo2", dbPath.toUri());
- execFail("USE doo2");
- }
-
- @Test
- public void testShowTablesFail() throws Exception {
- whFs.setPermission(whPath, perm700);
- exec("CREATE DATABASE doo");
- exec("USE doo");
- whFs.setPermission(getDbPath("doo"), perm300); //revoke read
- execFail("SHOW TABLES");
- execFail("SHOW TABLE EXTENDED LIKE foo1");
- }
-
- @Test
- public void testTableOps() throws Exception {
- //default db
- exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
- exec("DESCRIBE foo1");
- exec("DROP TABLE foo1");
-
- //default db custom location
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- whFs.mkdirs(tablePath, perm700);
- exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
- exec("DESCRIBE foo2");
- exec("DROP TABLE foo2");
-
- //default db custom non existing location
- exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
- exec("DESCRIBE foo3");
- exec("DROP TABLE foo3");
-
- //non default db
- exec("CREATE DATABASE doo");
- exec("USE doo");
-
- exec("CREATE TABLE foo4 (foo INT) STORED AS RCFILE");
- exec("DESCRIBE foo4");
- exec("DROP TABLE foo4");
-
- //non-default db custom location
- tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- whFs.mkdirs(tablePath, perm700);
- exec("CREATE EXTERNAL TABLE foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
- exec("DESCRIBE foo5");
- exec("DROP TABLE foo5");
-
- //non-default db custom non existing location
- exec("CREATE EXTERNAL TABLE foo6 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
- exec("DESCRIBE foo6");
- exec("DROP TABLE foo6");
-
- exec("DROP TABLE IF EXISTS foo_non_exists");
-
- exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
- exec("DESCRIBE EXTENDED foo1");
- exec("DESCRIBE FORMATTED foo1");
- exec("DESCRIBE foo1.foo");
-
- //deep non-existing path for the table
- tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- whFs.mkdirs(tablePath, perm700);
- exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s/a/a/a/'", tablePath);
- }
-
- @Test
- public void testCreateTableFail1() throws Exception {
- //default db
- whFs.mkdirs(whPath, perm500); //revoke w
- execFail("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
- }
-
- @Test
- public void testCreateTableFail2() throws Exception {
- //default db custom location
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- whFs.mkdirs(tablePath, perm500);
- execFail("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-
- //default db custom non existing location
- execFail("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
- }
-
- @Test
- public void testCreateTableFail3() throws Exception {
- //non default db
- exec("CREATE DATABASE doo");
- whFs.setPermission(getDbPath("doo"), perm500);
-
- execFail("CREATE TABLE doo.foo4 (foo INT) STORED AS RCFILE");
-
- //non-default db custom location, permission to write to tablePath, but not on db path
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- whFs.mkdirs(tablePath, perm700);
- exec("USE doo");
- execFail("CREATE EXTERNAL TABLE foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
- }
-
- @Test
- public void testCreateTableFail4() throws Exception {
- //non default db
- exec("CREATE DATABASE doo");
-
- //non-default db custom location
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- whFs.mkdirs(tablePath, perm500);
- execFail("CREATE EXTERNAL TABLE doo.foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-
- //non-default db custom non existing location
- execFail("CREATE EXTERNAL TABLE doo.foo6 (foo INT) STORED AS RCFILE LOCATION '%s/a/a/a/'", tablePath);
- }
-
- @Test
- public void testDropTableFail1() throws Exception {
- //default db
- exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
- whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke w
- execFail("DROP TABLE foo1");
- }
-
- @Test
- public void testDropTableFail2() throws Exception {
- //default db custom location
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
- whFs.mkdirs(tablePath, perm500);
- execFail("DROP TABLE foo2");
- }
-
- @Test
- public void testDropTableFail4() throws Exception {
- //non default db
- exec("CREATE DATABASE doo");
-
- //non-default db custom location
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-
- exec("CREATE EXTERNAL TABLE doo.foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
- whFs.mkdirs(tablePath, perm500);
- exec("USE doo"); //There is no DROP TABLE doo.foo5 support in Hive
- execFail("DROP TABLE foo5");
- }
-
- @Test
- public void testDescTableFail() throws Exception {
- //default db
- exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
- whFs.mkdirs(getTablePath("default", "foo1"), perm300); //revoke read
- execFail("DESCRIBE foo1");
-
- //default db custom location
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- whFs.mkdirs(tablePath, perm700);
- exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
- whFs.mkdirs(tablePath, perm300); //revoke read
- execFail("DESCRIBE foo2");
- }
-
- @Test
- public void testAlterTableRename() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
- exec("ALTER TABLE foo1 RENAME TO foo2");
-
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
- exec("ALTER TABLE foo3 RENAME TO foo4");
- }
-
- @Test
- public void testAlterTableRenameFail() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
- whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke write
- execFail("ALTER TABLE foo1 RENAME TO foo2");
-
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
- whFs.mkdirs(tablePath, perm500); //revoke write
- execFail("ALTER TABLE foo3 RENAME TO foo4");
- }
-
- @Test
- public void testAlterTableRelocate() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- exec("ALTER TABLE foo1 SET LOCATION '%s'", tablePath.makeQualified(whFs));
-
- tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
- exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'",
- tablePath.makeQualified(whFs));
- tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
- exec("ALTER TABLE foo3 SET LOCATION '%s'", tablePath.makeQualified(whFs));
- }
-
- @Test
- public void testAlterTableRelocateFail() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
- Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
- whFs.mkdirs(tablePath, perm500); //revoke write
- execFail("ALTER TABLE foo1 SET LOCATION '%s'", tablePath.makeQualified(whFs));
-
- //dont have access to new table loc
- tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
- exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'",
- tablePath.makeQualified(whFs));
- tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
- whFs.mkdirs(tablePath, perm500); //revoke write
- execFail("ALTER TABLE foo3 SET LOCATION '%s'", tablePath.makeQualified(whFs));
-
- //have access to new table loc, but not old table loc
- tablePath = new Path(whPath, new Random().nextInt() + "/mytable3");
- exec("CREATE EXTERNAL TABLE foo4 (foo INT) STORED AS RCFILE LOCATION '%s'",
- tablePath.makeQualified(whFs));
- whFs.mkdirs(tablePath, perm500); //revoke write
- tablePath = new Path(whPath, new Random().nextInt() + "/mytable3");
- execFail("ALTER TABLE foo4 SET LOCATION '%s'", tablePath.makeQualified(whFs));
- }
-
- @Test
- public void testAlterTable() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
- exec("ALTER TABLE foo1 SET TBLPROPERTIES ('foo'='bar')");
- exec("ALTER TABLE foo1 SET SERDEPROPERTIES ('foo'='bar')");
- exec("ALTER TABLE foo1 ADD COLUMNS (foo2 INT)");
- }
-
- @Test
- public void testAddDropPartition() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
- exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
- exec("ALTER TABLE foo1 ADD IF NOT EXISTS PARTITION (b='2010-10-10')");
- String relPath = new Random().nextInt() + "/mypart";
- exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-11') LOCATION '%s'", relPath);
-
- exec("ALTER TABLE foo1 PARTITION (b='2010-10-10') SET FILEFORMAT RCFILE");
-
- exec("ALTER TABLE foo1 PARTITION (b='2010-10-10') SET FILEFORMAT INPUTFORMAT "
- + "'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT "
- + "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver "
- + "'mydriver' outputdriver 'yourdriver'");
-
- exec("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
- exec("ALTER TABLE foo1 DROP PARTITION (b='2010-10-11')");
- }
-
- @Test
- public void testAddPartitionFail1() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
- whFs.mkdirs(getTablePath("default", "foo1"), perm500);
- execFail("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
- }
-
- @Test
- public void testAddPartitionFail2() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
- String relPath = new Random().nextInt() + "/mypart";
- Path partPath = new Path(getTablePath("default", "foo1"), relPath);
- whFs.mkdirs(partPath, perm500);
- exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10') LOCATION '%s'", partPath);
- }
-
- @Test
- public void testDropPartitionFail1() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
- exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
- whFs.mkdirs(getPartPath("b=2010-10-10", "default", "foo1"), perm500);
- execFail("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
- }
-
- @Test
- public void testDropPartitionFail2() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
- String relPath = new Random().nextInt() + "/mypart";
- Path partPath = new Path(getTablePath("default", "foo1"), relPath);
- whFs.mkdirs(partPath, perm700);
- exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10') LOCATION '%s'", partPath);
- whFs.mkdirs(partPath, perm500); //revoke write
- execFail("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
- }
-
- @Test
- public void testAlterTableFail() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (boo STRING) STORED AS TEXTFILE");
- whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke write
- execFail("ALTER TABLE foo1 SET TBLPROPERTIES ('foo'='bar')");
- execFail("ALTER TABLE foo1 SET SERDEPROPERTIES ('foo'='bar')");
- execFail("ALTER TABLE foo1 ADD COLUMNS (foo2 INT)");
- }
-
- @Test
- public void testShowTables() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (boo STRING) STORED AS TEXTFILE");
- exec("SHOW PARTITIONS foo1");
-
- whFs.mkdirs(getTablePath("default", "foo1"), perm300); //revoke read
- execFail("SHOW PARTITIONS foo1");
- }
-
- @Test
- public void testAlterTablePartRename() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
- Path loc = new Path(whPath, new Random().nextInt() + "/mypart");
- exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", loc);
- exec("ALTER TABLE foo1 PARTITION (b='2010-10-16') RENAME TO PARTITION (b='2010-10-17')");
- }
-
- @Test
- public void testAlterTablePartRenameFail() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
- Path loc = new Path(whPath, new Random().nextInt() + "/mypart");
- exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", loc);
- whFs.setPermission(loc, perm500); //revoke w
- execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') RENAME TO PARTITION (b='2010-10-17')");
- }
-
- @Test
- public void testAlterTablePartRelocate() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
- exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16')");
- Path partPath = new Path(whPath, new Random().nextInt() + "/mypart");
- exec("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", partPath.makeQualified(whFs));
- }
-
- @Test
- public void testAlterTablePartRelocateFail() throws Exception {
- exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
-
- Path oldLoc = new Path(whPath, new Random().nextInt() + "/mypart");
- Path newLoc = new Path(whPath, new Random().nextInt() + "/mypart2");
-
- exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", oldLoc);
- whFs.mkdirs(oldLoc, perm500);
- execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", newLoc.makeQualified(whFs));
- whFs.mkdirs(oldLoc, perm700);
- whFs.mkdirs(newLoc, perm500);
- execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", newLoc.makeQualified(whFs));
- }
-
+
+ protected HCatDriver hcatDriver;
+ protected HiveMetaStoreClient msc;
+ protected HiveConf conf;
+ protected String whDir;
+ protected Path whPath;
+ protected FileSystem whFs;
+ protected Warehouse wh;
+ protected Hive hive;
+
+ @Before
+ public void setUp() throws Exception {
+
+ conf = new HiveConf(this.getClass());
+ conf.set(ConfVars.PREEXECHOOKS.varname, "");
+ conf.set(ConfVars.POSTEXECHOOKS.varname, "");
+ conf.set(ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+
+ conf.set("hive.metastore.local", "true");
+ conf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname, HCatSemanticAnalyzer.class.getName());
+ conf.setBoolVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED, true);
+ conf.setVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER,
+ StorageDelegationAuthorizationProvider.class.getCanonicalName());
+ conf.set("fs.pfile.impl", "org.apache.hadoop.fs.ProxyLocalFileSystem");
+
+ whDir = System.getProperty("test.warehouse.dir", "/tmp/testhdfsauthorization_wh");
+ conf.setVar(HiveConf.ConfVars.METASTOREWAREHOUSE, whDir);
+
+ UserGroupInformation ugi = ShimLoader.getHadoopShims().getUGIForConf(conf);
+ String username = ShimLoader.getHadoopShims().getShortUserName(ugi);
+
+ whPath = new Path(whDir);
+ whFs = whPath.getFileSystem(conf);
+
+ wh = new Warehouse(conf);
+ hive = Hive.get(conf);
+
+ //clean up mess in HMS
+ HcatTestUtils.cleanupHMS(hive, wh, perm700);
+
+ whFs.delete(whPath, true);
+ whFs.mkdirs(whPath, perm755);
+
+ SessionState.start(new CliSessionState(conf));
+ hcatDriver = new HCatDriver();
+ }
+
+ @After
+ public void tearDown() throws IOException {
+ whFs.close();
+ hcatDriver.close();
+ Hive.closeCurrent();
+ }
+
+ public Path getDbPath(String dbName) throws MetaException, HiveException {
+ return HcatTestUtils.getDbPath(hive, wh, dbName);
+ }
+
+ public Path getTablePath(String dbName, String tableName) throws HiveException {
+ Table table = hive.getTable(dbName, tableName);
+ return table.getPath();
+ }
+
+ public Path getPartPath(String partName, String dbName, String tableName) throws HiveException {
+ return new Path(getTablePath(dbName, tableName), partName);
+ }
+
+ /** Execute the query expecting success*/
+ public void exec(String format, Object... args) throws Exception {
+ String command = String.format(format, args);
+ CommandProcessorResponse resp = hcatDriver.run(command);
+ Assert.assertEquals(resp.getErrorMessage(), 0, resp.getResponseCode());
+ Assert.assertEquals(resp.getErrorMessage(), null, resp.getErrorMessage());
+ }
+
+ /** Execute the query expecting it to fail with AuthorizationException */
+ public void execFail(String format, Object... args) throws Exception {
+ String command = String.format(format, args);
+ CommandProcessorResponse resp = hcatDriver.run(command);
+ Assert.assertNotSame(resp.getErrorMessage(), 0, resp.getResponseCode());
+ Assert.assertTrue((resp.getResponseCode() == 40000) || (resp.getResponseCode() == 403));
+ if (resp.getErrorMessage() != null) {
+ Assert.assertTrue(resp.getErrorMessage().contains("org.apache.hadoop.security.AccessControlException"));
+ }
+ }
+
+
+ /**
+ * Tests whether the warehouse directory is writable by the current user (as defined by Hadoop)
+ */
+ @Test
+ public void testWarehouseIsWritable() throws Exception {
+ Path top = new Path(whPath, "_foobarbaz12_");
+ try {
+ whFs.mkdirs(top);
+ } finally {
+ whFs.delete(top, true);
+ }
+ }
+
+ @Test
+ public void testShowDatabases() throws Exception {
+ exec("CREATE DATABASE doo");
+ exec("SHOW DATABASES");
+
+ whFs.setPermission(whPath, perm300); //revoke r
+ execFail("SHOW DATABASES");
+ }
+
+ @Test
+ public void testDatabaseOps() throws Exception {
+ exec("SHOW TABLES");
+ exec("SHOW TABLE EXTENDED LIKE foo1");
+
+ whFs.setPermission(whPath, perm700);
+ exec("CREATE DATABASE doo");
+ exec("DESCRIBE DATABASE doo");
+ exec("USE doo");
+ exec("SHOW TABLES");
+ exec("SHOW TABLE EXTENDED LIKE foo1");
+ exec("DROP DATABASE doo");
+
+ //custom location
+ Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
+ whFs.mkdirs(dbPath, perm700);
+ exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
+ exec("DESCRIBE DATABASE doo2", dbPath.toUri());
+ exec("USE doo2");
+ exec("SHOW TABLES");
+ exec("SHOW TABLE EXTENDED LIKE foo1");
+ exec("DROP DATABASE doo2", dbPath.toUri());
+
+ //custom non-existing location
+ exec("CREATE DATABASE doo3 LOCATION '%s/subpath'", dbPath.toUri());
+ }
+
+ @Test
+ public void testCreateDatabaseFail1() throws Exception {
+ whFs.setPermission(whPath, perm500);
+ execFail("CREATE DATABASE doo"); //in the default location
+
+ whFs.setPermission(whPath, perm555);
+ execFail("CREATE DATABASE doo2");
+ }
+
+ @Test
+ public void testCreateDatabaseFail2() throws Exception {
+ //custom location
+ Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
+
+ whFs.mkdirs(dbPath, perm700);
+ whFs.setPermission(dbPath, perm500);
+ execFail("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
+ }
+
+ @Test
+ public void testDropDatabaseFail1() throws Exception {
+ whFs.setPermission(whPath, perm700);
+ exec("CREATE DATABASE doo"); //in the default location
+
+ whFs.setPermission(getDbPath("doo"), perm500); //revoke write
+ execFail("DROP DATABASE doo");
+ }
+
+ @Test
+ public void testDropDatabaseFail2() throws Exception {
+ //custom location
+ Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
+
+ whFs.mkdirs(dbPath, perm700);
+ exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
+
+ whFs.setPermission(dbPath, perm500);
+ execFail("DROP DATABASE doo2");
+ }
+
+ @Test
+ public void testDescSwitchDatabaseFail() throws Exception {
+ whFs.setPermission(whPath, perm700);
+ exec("CREATE DATABASE doo");
+ whFs.setPermission(getDbPath("doo"), perm300); //revoke read
+ execFail("DESCRIBE DATABASE doo");
+ execFail("USE doo");
+
+ //custom location
+ Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
+ whFs.mkdirs(dbPath, perm700);
+ exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
+ whFs.mkdirs(dbPath, perm300); //revoke read
+ execFail("DESCRIBE DATABASE doo2", dbPath.toUri());
+ execFail("USE doo2");
+ }
+
+ @Test
+ public void testShowTablesFail() throws Exception {
+ whFs.setPermission(whPath, perm700);
+ exec("CREATE DATABASE doo");
+ exec("USE doo");
+ whFs.setPermission(getDbPath("doo"), perm300); //revoke read
+ execFail("SHOW TABLES");
+ execFail("SHOW TABLE EXTENDED LIKE foo1");
+ }
+
+ @Test
+ public void testTableOps() throws Exception {
+ //default db
+ exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+ exec("DESCRIBE foo1");
+ exec("DROP TABLE foo1");
+
+ //default db custom location
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ whFs.mkdirs(tablePath, perm700);
+ exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+ exec("DESCRIBE foo2");
+ exec("DROP TABLE foo2");
+
+ //default db custom non existing location
+ exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
+ exec("DESCRIBE foo3");
+ exec("DROP TABLE foo3");
+
+ //non default db
+ exec("CREATE DATABASE doo");
+ exec("USE doo");
+
+ exec("CREATE TABLE foo4 (foo INT) STORED AS RCFILE");
+ exec("DESCRIBE foo4");
+ exec("DROP TABLE foo4");
+
+ //non-default db custom location
+ tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ whFs.mkdirs(tablePath, perm700);
+ exec("CREATE EXTERNAL TABLE foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+ exec("DESCRIBE foo5");
+ exec("DROP TABLE foo5");
+
+ //non-default db custom non existing location
+ exec("CREATE EXTERNAL TABLE foo6 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
+ exec("DESCRIBE foo6");
+ exec("DROP TABLE foo6");
+
+ exec("DROP TABLE IF EXISTS foo_non_exists");
+
+ exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+ exec("DESCRIBE EXTENDED foo1");
+ exec("DESCRIBE FORMATTED foo1");
+ exec("DESCRIBE foo1.foo");
+
+ //deep non-existing path for the table
+ tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ whFs.mkdirs(tablePath, perm700);
+ exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s/a/a/a/'", tablePath);
+ }
+
+ @Test
+ public void testCreateTableFail1() throws Exception {
+ //default db
+ whFs.mkdirs(whPath, perm500); //revoke w
+ execFail("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+ }
+
+ @Test
+ public void testCreateTableFail2() throws Exception {
+ //default db custom location
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ whFs.mkdirs(tablePath, perm500);
+ execFail("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+
+ //default db custom non existing location
+ execFail("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
+ }
+
+ @Test
+ public void testCreateTableFail3() throws Exception {
+ //non default db
+ exec("CREATE DATABASE doo");
+ whFs.setPermission(getDbPath("doo"), perm500);
+
+ execFail("CREATE TABLE doo.foo4 (foo INT) STORED AS RCFILE");
+
+ //non-default db custom location, permission to write to tablePath, but not on db path
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ whFs.mkdirs(tablePath, perm700);
+ exec("USE doo");
+ execFail("CREATE EXTERNAL TABLE foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+ }
+
+ @Test
+ public void testCreateTableFail4() throws Exception {
+ //non default db
+ exec("CREATE DATABASE doo");
+
+ //non-default db custom location
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ whFs.mkdirs(tablePath, perm500);
+ execFail("CREATE EXTERNAL TABLE doo.foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+
+ //non-default db custom non existing location
+ execFail("CREATE EXTERNAL TABLE doo.foo6 (foo INT) STORED AS RCFILE LOCATION '%s/a/a/a/'", tablePath);
+ }
+
+ @Test
+ public void testDropTableFail1() throws Exception {
+ //default db
+ exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+ whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke w
+ execFail("DROP TABLE foo1");
+ }
+
+ @Test
+ public void testDropTableFail2() throws Exception {
+ //default db custom location
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+ whFs.mkdirs(tablePath, perm500);
+ execFail("DROP TABLE foo2");
+ }
+
+ @Test
+ public void testDropTableFail4() throws Exception {
+ //non default db
+ exec("CREATE DATABASE doo");
+
+ //non-default db custom location
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+
+ exec("CREATE EXTERNAL TABLE doo.foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+ whFs.mkdirs(tablePath, perm500);
+ exec("USE doo"); //There is no DROP TABLE doo.foo5 support in Hive
+ execFail("DROP TABLE foo5");
+ }
+
+ @Test
+ public void testDescTableFail() throws Exception {
+ //default db
+ exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+ whFs.mkdirs(getTablePath("default", "foo1"), perm300); //revoke read
+ execFail("DESCRIBE foo1");
+
+ //default db custom location
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ whFs.mkdirs(tablePath, perm700);
+ exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+ whFs.mkdirs(tablePath, perm300); //revoke read
+ execFail("DESCRIBE foo2");
+ }
+
+ @Test
+ public void testAlterTableRename() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+ exec("ALTER TABLE foo1 RENAME TO foo2");
+
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+ exec("ALTER TABLE foo3 RENAME TO foo4");
+ }
+
+ @Test
+ public void testAlterTableRenameFail() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+ whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke write
+ execFail("ALTER TABLE foo1 RENAME TO foo2");
+
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+ whFs.mkdirs(tablePath, perm500); //revoke write
+ execFail("ALTER TABLE foo3 RENAME TO foo4");
+ }
+
+ @Test
+ public void testAlterTableRelocate() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ exec("ALTER TABLE foo1 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+
+ tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
+ exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'",
+ tablePath.makeQualified(whFs));
+ tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
+ exec("ALTER TABLE foo3 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+ }
+
+ @Test
+ public void testAlterTableRelocateFail() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+ Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+ whFs.mkdirs(tablePath, perm500); //revoke write
+ execFail("ALTER TABLE foo1 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+
+ //dont have access to new table loc
+ tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
+ exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'",
+ tablePath.makeQualified(whFs));
+ tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
+ whFs.mkdirs(tablePath, perm500); //revoke write
+ execFail("ALTER TABLE foo3 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+
+ //have access to new table loc, but not old table loc
+ tablePath = new Path(whPath, new Random().nextInt() + "/mytable3");
+ exec("CREATE EXTERNAL TABLE foo4 (foo INT) STORED AS RCFILE LOCATION '%s'",
+ tablePath.makeQualified(whFs));
+ whFs.mkdirs(tablePath, perm500); //revoke write
+ tablePath = new Path(whPath, new Random().nextInt() + "/mytable3");
+ execFail("ALTER TABLE foo4 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+ }
+
+ @Test
+ public void testAlterTable() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+ exec("ALTER TABLE foo1 SET TBLPROPERTIES ('foo'='bar')");
+ exec("ALTER TABLE foo1 SET SERDEPROPERTIES ('foo'='bar')");
+ exec("ALTER TABLE foo1 ADD COLUMNS (foo2 INT)");
+ }
+
+ @Test
+ public void testAddDropPartition() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+ exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
+ exec("ALTER TABLE foo1 ADD IF NOT EXISTS PARTITION (b='2010-10-10')");
+ String relPath = new Random().nextInt() + "/mypart";
+ exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-11') LOCATION '%s'", relPath);
+
+ exec("ALTER TABLE foo1 PARTITION (b='2010-10-10') SET FILEFORMAT RCFILE");
+
+ exec("ALTER TABLE foo1 PARTITION (b='2010-10-10') SET FILEFORMAT INPUTFORMAT "
+ + "'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT "
+ + "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver "
+ + "'mydriver' outputdriver 'yourdriver'");
+
+ exec("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
+ exec("ALTER TABLE foo1 DROP PARTITION (b='2010-10-11')");
+ }
+
+ @Test
+ public void testAddPartitionFail1() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+ whFs.mkdirs(getTablePath("default", "foo1"), perm500);
+ execFail("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
+ }
+
+ @Test
+ public void testAddPartitionFail2() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+ String relPath = new Random().nextInt() + "/mypart";
+ Path partPath = new Path(getTablePath("default", "foo1"), relPath);
+ whFs.mkdirs(partPath, perm500);
+ exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10') LOCATION '%s'", partPath);
+ }
+
+ @Test
+ public void testDropPartitionFail1() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+ exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
+ whFs.mkdirs(getPartPath("b=2010-10-10", "default", "foo1"), perm500);
+ execFail("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
+ }
+
+ @Test
+ public void testDropPartitionFail2() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+ String relPath = new Random().nextInt() + "/mypart";
+ Path partPath = new Path(getTablePath("default", "foo1"), relPath);
+ whFs.mkdirs(partPath, perm700);
+ exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10') LOCATION '%s'", partPath);
+ whFs.mkdirs(partPath, perm500); //revoke write
+ execFail("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
+ }
+
+ @Test
+ public void testAlterTableFail() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (boo STRING) STORED AS TEXTFILE");
+ whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke write
+ execFail("ALTER TABLE foo1 SET TBLPROPERTIES ('foo'='bar')");
+ execFail("ALTER TABLE foo1 SET SERDEPROPERTIES ('foo'='bar')");
+ execFail("ALTER TABLE foo1 ADD COLUMNS (foo2 INT)");
+ }
+
+ @Test
+ public void testShowTables() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (boo STRING) STORED AS TEXTFILE");
+ exec("SHOW PARTITIONS foo1");
+
+ whFs.mkdirs(getTablePath("default", "foo1"), perm300); //revoke read
+ execFail("SHOW PARTITIONS foo1");
+ }
+
+ @Test
+ public void testAlterTablePartRename() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
+ Path loc = new Path(whPath, new Random().nextInt() + "/mypart");
+ exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", loc);
+ exec("ALTER TABLE foo1 PARTITION (b='2010-10-16') RENAME TO PARTITION (b='2010-10-17')");
+ }
+
+ @Test
+ public void testAlterTablePartRenameFail() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
+ Path loc = new Path(whPath, new Random().nextInt() + "/mypart");
+ exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", loc);
+ whFs.setPermission(loc, perm500); //revoke w
+ execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') RENAME TO PARTITION (b='2010-10-17')");
+ }
+
+ @Test
+ public void testAlterTablePartRelocate() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
+ exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16')");
+ Path partPath = new Path(whPath, new Random().nextInt() + "/mypart");
+ exec("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", partPath.makeQualified(whFs));
+ }
+
+ @Test
+ public void testAlterTablePartRelocateFail() throws Exception {
+ exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
+
+ Path oldLoc = new Path(whPath, new Random().nextInt() + "/mypart");
+ Path newLoc = new Path(whPath, new Random().nextInt() + "/mypart2");
+
+ exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", oldLoc);
+ whFs.mkdirs(oldLoc, perm500);
+ execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", newLoc.makeQualified(whFs));
+ whFs.mkdirs(oldLoc, perm700);
+ whFs.mkdirs(newLoc, perm500);
+ execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", newLoc.makeQualified(whFs));
+ }
+
}
Modified: incubator/hcatalog/trunk/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevision.java
URL: http://svn.apache.org/viewvc/incubator/hcatalog/trunk/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevision.java?rev=1383152&r1=1383151&r2=1383152&view=diff
==============================================================================
--- incubator/hcatalog/trunk/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevision.java (original)
+++ incubator/hcatalog/trunk/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevision.java Mon Sep 10 23:28:55 2012
@@ -35,383 +35,382 @@ import java.util.Collections;
import java.util.BitSet;
public class StoreFamilyRevision implements org.apache.thrift.TBase<StoreFamilyRevision, StoreFamilyRevision._Fields>, java.io.Serializable, Cloneable {
- private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("StoreFamilyRevision");
+ private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("StoreFamilyRevision");
- private static final org.apache.thrift.protocol.TField REVISION_FIELD_DESC = new org.apache.thrift.protocol.TField("revision", org.apache.thrift.protocol.TType.I64, (short)1);
- private static final org.apache.thrift.protocol.TField TIMESTAMP_FIELD_DESC = new org.apache.thrift.protocol.TField("timestamp", org.apache.thrift.protocol.TType.I64, (short)2);
+ private static final org.apache.thrift.protocol.TField REVISION_FIELD_DESC = new org.apache.thrift.protocol.TField("revision", org.apache.thrift.protocol.TType.I64, (short) 1);
+ private static final org.apache.thrift.protocol.TField TIMESTAMP_FIELD_DESC = new org.apache.thrift.protocol.TField("timestamp", org.apache.thrift.protocol.TType.I64, (short) 2);
- public long revision; // required
- public long timestamp; // required
+ public long revision; // required
+ public long timestamp; // required
- /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
- public enum _Fields implements org.apache.thrift.TFieldIdEnum {
- REVISION((short)1, "revision"),
- TIMESTAMP((short)2, "timestamp");
+ /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+ public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+ REVISION((short) 1, "revision"),
+ TIMESTAMP((short) 2, "timestamp");
+
+ private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+ static {
+ for (_Fields field : EnumSet.allOf(_Fields.class)) {
+ byName.put(field.getFieldName(), field);
+ }
+ }
+
+ /**
+ * Find the _Fields constant that matches fieldId, or null if its not found.
+ */
+ public static _Fields findByThriftId(int fieldId) {
+ switch (fieldId) {
+ case 1: // REVISION
+ return REVISION;
+ case 2: // TIMESTAMP
+ return TIMESTAMP;
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Find the _Fields constant that matches fieldId, throwing an exception
+ * if it is not found.
+ */
+ public static _Fields findByThriftIdOrThrow(int fieldId) {
+ _Fields fields = findByThriftId(fieldId);
+ if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+ return fields;
+ }
+
+ /**
+ * Find the _Fields constant that matches name, or null if its not found.
+ */
+ public static _Fields findByName(String name) {
+ return byName.get(name);
+ }
+
+ private final short _thriftId;
+ private final String _fieldName;
+
+ _Fields(short thriftId, String fieldName) {
+ _thriftId = thriftId;
+ _fieldName = fieldName;
+ }
+
+ public short getThriftFieldId() {
+ return _thriftId;
+ }
+
+ public String getFieldName() {
+ return _fieldName;
+ }
+ }
+
+ // isset id assignments
+ private static final int __REVISION_ISSET_ID = 0;
+ private static final int __TIMESTAMP_ISSET_ID = 1;
+ private BitSet __isset_bit_vector = new BitSet(2);
- private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+ public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
static {
- for (_Fields field : EnumSet.allOf(_Fields.class)) {
- byName.put(field.getFieldName(), field);
- }
+ Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+ tmpMap.put(_Fields.REVISION, new org.apache.thrift.meta_data.FieldMetaData("revision", org.apache.thrift.TFieldRequirementType.DEFAULT,
+ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+ tmpMap.put(_Fields.TIMESTAMP, new org.apache.thrift.meta_data.FieldMetaData("timestamp", org.apache.thrift.TFieldRequirementType.DEFAULT,
+ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+ metaDataMap = Collections.unmodifiableMap(tmpMap);
+ org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(StoreFamilyRevision.class, metaDataMap);
+ }
+
+ public StoreFamilyRevision() {
+ }
+
+ public StoreFamilyRevision(
+ long revision,
+ long timestamp) {
+ this();
+ this.revision = revision;
+ setRevisionIsSet(true);
+ this.timestamp = timestamp;
+ setTimestampIsSet(true);
}
/**
- * Find the _Fields constant that matches fieldId, or null if its not found.
+ * Performs a deep copy on <i>other</i>.
*/
- public static _Fields findByThriftId(int fieldId) {
- switch(fieldId) {
- case 1: // REVISION
- return REVISION;
- case 2: // TIMESTAMP
- return TIMESTAMP;
- default:
- return null;
- }
+ public StoreFamilyRevision(StoreFamilyRevision other) {
+ __isset_bit_vector.clear();
+ __isset_bit_vector.or(other.__isset_bit_vector);
+ this.revision = other.revision;
+ this.timestamp = other.timestamp;
}
- /**
- * Find the _Fields constant that matches fieldId, throwing an exception
- * if it is not found.
- */
- public static _Fields findByThriftIdOrThrow(int fieldId) {
- _Fields fields = findByThriftId(fieldId);
- if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
- return fields;
+ public StoreFamilyRevision deepCopy() {
+ return new StoreFamilyRevision(this);
}
- /**
- * Find the _Fields constant that matches name, or null if its not found.
- */
- public static _Fields findByName(String name) {
- return byName.get(name);
+ @Override
+ public void clear() {
+ setRevisionIsSet(false);
+ this.revision = 0;
+ setTimestampIsSet(false);
+ this.timestamp = 0;
}
- private final short _thriftId;
- private final String _fieldName;
+ public long getRevision() {
+ return this.revision;
+ }
- _Fields(short thriftId, String fieldName) {
- _thriftId = thriftId;
- _fieldName = fieldName;
- }
-
- public short getThriftFieldId() {
- return _thriftId;
- }
-
- public String getFieldName() {
- return _fieldName;
- }
- }
-
- // isset id assignments
- private static final int __REVISION_ISSET_ID = 0;
- private static final int __TIMESTAMP_ISSET_ID = 1;
- private BitSet __isset_bit_vector = new BitSet(2);
-
- public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
- static {
- Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
- tmpMap.put(_Fields.REVISION, new org.apache.thrift.meta_data.FieldMetaData("revision", org.apache.thrift.TFieldRequirementType.DEFAULT,
- new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
- tmpMap.put(_Fields.TIMESTAMP, new org.apache.thrift.meta_data.FieldMetaData("timestamp", org.apache.thrift.TFieldRequirementType.DEFAULT,
- new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
- metaDataMap = Collections.unmodifiableMap(tmpMap);
- org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(StoreFamilyRevision.class, metaDataMap);
- }
-
- public StoreFamilyRevision() {
- }
-
- public StoreFamilyRevision(
- long revision,
- long timestamp)
- {
- this();
- this.revision = revision;
- setRevisionIsSet(true);
- this.timestamp = timestamp;
- setTimestampIsSet(true);
- }
-
- /**
- * Performs a deep copy on <i>other</i>.
- */
- public StoreFamilyRevision(StoreFamilyRevision other) {
- __isset_bit_vector.clear();
- __isset_bit_vector.or(other.__isset_bit_vector);
- this.revision = other.revision;
- this.timestamp = other.timestamp;
- }
-
- public StoreFamilyRevision deepCopy() {
- return new StoreFamilyRevision(this);
- }
-
- @Override
- public void clear() {
- setRevisionIsSet(false);
- this.revision = 0;
- setTimestampIsSet(false);
- this.timestamp = 0;
- }
-
- public long getRevision() {
- return this.revision;
- }
-
- public StoreFamilyRevision setRevision(long revision) {
- this.revision = revision;
- setRevisionIsSet(true);
- return this;
- }
-
- public void unsetRevision() {
- __isset_bit_vector.clear(__REVISION_ISSET_ID);
- }
-
- /** Returns true if field revision is set (has been assigned a value) and false otherwise */
- public boolean isSetRevision() {
- return __isset_bit_vector.get(__REVISION_ISSET_ID);
- }
-
- public void setRevisionIsSet(boolean value) {
- __isset_bit_vector.set(__REVISION_ISSET_ID, value);
- }
-
- public long getTimestamp() {
- return this.timestamp;
- }
-
- public StoreFamilyRevision setTimestamp(long timestamp) {
- this.timestamp = timestamp;
- setTimestampIsSet(true);
- return this;
- }
-
- public void unsetTimestamp() {
- __isset_bit_vector.clear(__TIMESTAMP_ISSET_ID);
- }
-
- /** Returns true if field timestamp is set (has been assigned a value) and false otherwise */
- public boolean isSetTimestamp() {
- return __isset_bit_vector.get(__TIMESTAMP_ISSET_ID);
- }
-
- public void setTimestampIsSet(boolean value) {
- __isset_bit_vector.set(__TIMESTAMP_ISSET_ID, value);
- }
-
- public void setFieldValue(_Fields field, Object value) {
- switch (field) {
- case REVISION:
- if (value == null) {
- unsetRevision();
- } else {
- setRevision((Long)value);
- }
- break;
-
- case TIMESTAMP:
- if (value == null) {
- unsetTimestamp();
- } else {
- setTimestamp((Long)value);
- }
- break;
-
- }
- }
-
- public Object getFieldValue(_Fields field) {
- switch (field) {
- case REVISION:
- return Long.valueOf(getRevision());
-
- case TIMESTAMP:
- return Long.valueOf(getTimestamp());
-
- }
- throw new IllegalStateException();
- }
-
- /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
- public boolean isSet(_Fields field) {
- if (field == null) {
- throw new IllegalArgumentException();
- }
-
- switch (field) {
- case REVISION:
- return isSetRevision();
- case TIMESTAMP:
- return isSetTimestamp();
- }
- throw new IllegalStateException();
- }
-
- @Override
- public boolean equals(Object that) {
- if (that == null)
- return false;
- if (that instanceof StoreFamilyRevision)
- return this.equals((StoreFamilyRevision)that);
- return false;
- }
-
- public boolean equals(StoreFamilyRevision that) {
- if (that == null)
- return false;
-
- boolean this_present_revision = true;
- boolean that_present_revision = true;
- if (this_present_revision || that_present_revision) {
- if (!(this_present_revision && that_present_revision))
- return false;
- if (this.revision != that.revision)
- return false;
+ public StoreFamilyRevision setRevision(long revision) {
+ this.revision = revision;
+ setRevisionIsSet(true);
+ return this;
}
- boolean this_present_timestamp = true;
- boolean that_present_timestamp = true;
- if (this_present_timestamp || that_present_timestamp) {
- if (!(this_present_timestamp && that_present_timestamp))
- return false;
- if (this.timestamp != that.timestamp)
- return false;
+ public void unsetRevision() {
+ __isset_bit_vector.clear(__REVISION_ISSET_ID);
+ }
+
+ /** Returns true if field revision is set (has been assigned a value) and false otherwise */
+ public boolean isSetRevision() {
+ return __isset_bit_vector.get(__REVISION_ISSET_ID);
+ }
+
+ public void setRevisionIsSet(boolean value) {
+ __isset_bit_vector.set(__REVISION_ISSET_ID, value);
+ }
+
+ public long getTimestamp() {
+ return this.timestamp;
+ }
+
+ public StoreFamilyRevision setTimestamp(long timestamp) {
+ this.timestamp = timestamp;
+ setTimestampIsSet(true);
+ return this;
+ }
+
+ public void unsetTimestamp() {
+ __isset_bit_vector.clear(__TIMESTAMP_ISSET_ID);
+ }
+
+ /** Returns true if field timestamp is set (has been assigned a value) and false otherwise */
+ public boolean isSetTimestamp() {
+ return __isset_bit_vector.get(__TIMESTAMP_ISSET_ID);
+ }
+
+ public void setTimestampIsSet(boolean value) {
+ __isset_bit_vector.set(__TIMESTAMP_ISSET_ID, value);
+ }
+
+ public void setFieldValue(_Fields field, Object value) {
+ switch (field) {
+ case REVISION:
+ if (value == null) {
+ unsetRevision();
+ } else {
+ setRevision((Long) value);
+ }
+ break;
+
+ case TIMESTAMP:
+ if (value == null) {
+ unsetTimestamp();
+ } else {
+ setTimestamp((Long) value);
+ }
+ break;
+
+ }
}
- return true;
- }
+ public Object getFieldValue(_Fields field) {
+ switch (field) {
+ case REVISION:
+ return Long.valueOf(getRevision());
+
+ case TIMESTAMP:
+ return Long.valueOf(getTimestamp());
+
+ }
+ throw new IllegalStateException();
+ }
+
+ /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+ public boolean isSet(_Fields field) {
+ if (field == null) {
+ throw new IllegalArgumentException();
+ }
+
+ switch (field) {
+ case REVISION:
+ return isSetRevision();
+ case TIMESTAMP:
+ return isSetTimestamp();
+ }
+ throw new IllegalStateException();
+ }
+
+ @Override
+ public boolean equals(Object that) {
+ if (that == null)
+ return false;
+ if (that instanceof StoreFamilyRevision)
+ return this.equals((StoreFamilyRevision) that);
+ return false;
+ }
- @Override
- public int hashCode() {
- return 0;
- }
-
- public int compareTo(StoreFamilyRevision other) {
- if (!getClass().equals(other.getClass())) {
- return getClass().getName().compareTo(other.getClass().getName());
- }
-
- int lastComparison = 0;
- StoreFamilyRevision typedOther = (StoreFamilyRevision)other;
-
- lastComparison = Boolean.valueOf(isSetRevision()).compareTo(typedOther.isSetRevision());
- if (lastComparison != 0) {
- return lastComparison;
- }
- if (isSetRevision()) {
- lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.revision, typedOther.revision);
- if (lastComparison != 0) {
- return lastComparison;
- }
- }
- lastComparison = Boolean.valueOf(isSetTimestamp()).compareTo(typedOther.isSetTimestamp());
- if (lastComparison != 0) {
- return lastComparison;
- }
- if (isSetTimestamp()) {
- lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.timestamp, typedOther.timestamp);
- if (lastComparison != 0) {
- return lastComparison;
- }
- }
- return 0;
- }
-
- public _Fields fieldForId(int fieldId) {
- return _Fields.findByThriftId(fieldId);
- }
-
- public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
- org.apache.thrift.protocol.TField field;
- iprot.readStructBegin();
- while (true)
- {
- field = iprot.readFieldBegin();
- if (field.type == org.apache.thrift.protocol.TType.STOP) {
- break;
- }
- switch (field.id) {
- case 1: // REVISION
- if (field.type == org.apache.thrift.protocol.TType.I64) {
- this.revision = iprot.readI64();
- setRevisionIsSet(true);
- } else {
- org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
- }
- break;
- case 2: // TIMESTAMP
- if (field.type == org.apache.thrift.protocol.TType.I64) {
- this.timestamp = iprot.readI64();
- setTimestampIsSet(true);
- } else {
- org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
- }
- break;
- default:
- org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
- }
- iprot.readFieldEnd();
- }
- iprot.readStructEnd();
-
- // check for required fields of primitive type, which can't be checked in the validate method
- validate();
- }
-
- public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
- validate();
-
- oprot.writeStructBegin(STRUCT_DESC);
- oprot.writeFieldBegin(REVISION_FIELD_DESC);
- oprot.writeI64(this.revision);
- oprot.writeFieldEnd();
- oprot.writeFieldBegin(TIMESTAMP_FIELD_DESC);
- oprot.writeI64(this.timestamp);
- oprot.writeFieldEnd();
- oprot.writeFieldStop();
- oprot.writeStructEnd();
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder("StoreFamilyRevision(");
- boolean first = true;
-
- sb.append("revision:");
- sb.append(this.revision);
- first = false;
- if (!first) sb.append(", ");
- sb.append("timestamp:");
- sb.append(this.timestamp);
- first = false;
- sb.append(")");
- return sb.toString();
- }
-
- public void validate() throws org.apache.thrift.TException {
- // check for required fields
- }
-
- private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
- try {
- write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
- } catch (org.apache.thrift.TException te) {
- throw new java.io.IOException(te);
- }
- }
-
- private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
- try {
- // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
- __isset_bit_vector = new BitSet(1);
- read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
- } catch (org.apache.thrift.TException te) {
- throw new java.io.IOException(te);
+ public boolean equals(StoreFamilyRevision that) {
+ if (that == null)
+ return false;
+
+ boolean this_present_revision = true;
+ boolean that_present_revision = true;
+ if (this_present_revision || that_present_revision) {
+ if (!(this_present_revision && that_present_revision))
+ return false;
+ if (this.revision != that.revision)
+ return false;
+ }
+
+ boolean this_present_timestamp = true;
+ boolean that_present_timestamp = true;
+ if (this_present_timestamp || that_present_timestamp) {
+ if (!(this_present_timestamp && that_present_timestamp))
+ return false;
+ if (this.timestamp != that.timestamp)
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return 0;
+ }
+
+ public int compareTo(StoreFamilyRevision other) {
+ if (!getClass().equals(other.getClass())) {
+ return getClass().getName().compareTo(other.getClass().getName());
+ }
+
+ int lastComparison = 0;
+ StoreFamilyRevision typedOther = (StoreFamilyRevision) other;
+
+ lastComparison = Boolean.valueOf(isSetRevision()).compareTo(typedOther.isSetRevision());
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ if (isSetRevision()) {
+ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.revision, typedOther.revision);
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ }
+ lastComparison = Boolean.valueOf(isSetTimestamp()).compareTo(typedOther.isSetTimestamp());
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ if (isSetTimestamp()) {
+ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.timestamp, typedOther.timestamp);
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ }
+ return 0;
+ }
+
+ public _Fields fieldForId(int fieldId) {
+ return _Fields.findByThriftId(fieldId);
+ }
+
+ public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+ org.apache.thrift.protocol.TField field;
+ iprot.readStructBegin();
+ while (true) {
+ field = iprot.readFieldBegin();
+ if (field.type == org.apache.thrift.protocol.TType.STOP) {
+ break;
+ }
+ switch (field.id) {
+ case 1: // REVISION
+ if (field.type == org.apache.thrift.protocol.TType.I64) {
+ this.revision = iprot.readI64();
+ setRevisionIsSet(true);
+ } else {
+ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
+ }
+ break;
+ case 2: // TIMESTAMP
+ if (field.type == org.apache.thrift.protocol.TType.I64) {
+ this.timestamp = iprot.readI64();
+ setTimestampIsSet(true);
+ } else {
+ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
+ }
+ break;
+ default:
+ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
+ }
+ iprot.readFieldEnd();
+ }
+ iprot.readStructEnd();
+
+ // check for required fields of primitive type, which can't be checked in the validate method
+ validate();
+ }
+
+ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+ validate();
+
+ oprot.writeStructBegin(STRUCT_DESC);
+ oprot.writeFieldBegin(REVISION_FIELD_DESC);
+ oprot.writeI64(this.revision);
+ oprot.writeFieldEnd();
+ oprot.writeFieldBegin(TIMESTAMP_FIELD_DESC);
+ oprot.writeI64(this.timestamp);
+ oprot.writeFieldEnd();
+ oprot.writeFieldStop();
+ oprot.writeStructEnd();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("StoreFamilyRevision(");
+ boolean first = true;
+
+ sb.append("revision:");
+ sb.append(this.revision);
+ first = false;
+ if (!first) sb.append(", ");
+ sb.append("timestamp:");
+ sb.append(this.timestamp);
+ first = false;
+ sb.append(")");
+ return sb.toString();
+ }
+
+ public void validate() throws org.apache.thrift.TException {
+ // check for required fields
+ }
+
+ private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+ try {
+ write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+ } catch (org.apache.thrift.TException te) {
+ throw new java.io.IOException(te);
+ }
+ }
+
+ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+ try {
+ // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
+ __isset_bit_vector = new BitSet(1);
+ read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+ } catch (org.apache.thrift.TException te) {
+ throw new java.io.IOException(te);
+ }
}
- }
}