http://git-wip-us.apache.org/repos/asf/accumulo/blob/01ae5b85/test/src/test/java/org/apache/accumulo/test/MultiTableRecoveryIT.java ---------------------------------------------------------------------- diff --git a/test/src/test/java/org/apache/accumulo/test/MultiTableRecoveryIT.java b/test/src/test/java/org/apache/accumulo/test/MultiTableRecoveryIT.java deleted file mode 100644 index 37e4957..0000000 --- a/test/src/test/java/org/apache/accumulo/test/MultiTableRecoveryIT.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.accumulo.test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.Map.Entry; -import java.util.Random; -import java.util.concurrent.atomic.AtomicBoolean; - -import org.apache.accumulo.core.client.BatchWriter; -import org.apache.accumulo.core.client.Connector; -import org.apache.accumulo.core.client.Scanner; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Mutation; -import org.apache.accumulo.core.data.Value; -import org.apache.accumulo.core.metadata.MetadataTable; -import org.apache.accumulo.core.security.Authorizations; -import org.apache.accumulo.core.util.UtilWaitThread; -import org.apache.accumulo.minicluster.ServerType; -import org.apache.accumulo.minicluster.impl.MiniAccumuloConfigImpl; -import org.apache.accumulo.test.functional.ConfigurableMacBase; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.RawLocalFileSystem; -import org.junit.Test; - -import com.google.common.collect.Iterators; - -public class MultiTableRecoveryIT extends ConfigurableMacBase { - - @Override - protected void configure(MiniAccumuloConfigImpl cfg, Configuration hadoopCoreSite) { - cfg.setProperty(Property.INSTANCE_ZK_TIMEOUT, "5s"); - - // use raw local file system so walogs sync and flush will work - hadoopCoreSite.set("fs.file.impl", RawLocalFileSystem.class.getName()); - } - - @Test(timeout = 4 * 60 * 1000) - public void testRecoveryOverMultipleTables() throws Exception { - final int N = 3; - final Connector c = getConnector(); - final String[] tables = getUniqueNames(N); - final BatchWriter[] writers = new BatchWriter[N]; - final byte[][] values = new byte[N][]; - int i = 0; - System.out.println("Creating tables"); - for (String tableName : tables) { - c.tableOperations().create(tableName); - values[i] = Integer.toString(i).getBytes(); - writers[i] = c.createBatchWriter(tableName, null); - i++; - } - System.out.println("Creating agitator"); - final AtomicBoolean stop = new AtomicBoolean(false); - final Thread agitator = agitator(stop); - agitator.start(); - System.out.println("writing"); - final Random random = new Random(); - for (i = 0; i < 1_000_000; i++) { - // make non-negative avoiding Math.abs, because that can still be negative - long randomRow = random.nextLong() & Long.MAX_VALUE; - assertTrue(randomRow >= 0); - final int table = (int) (randomRow % N); - final Mutation m = new Mutation(Long.toHexString(randomRow)); - m.put(new byte[0], new byte[0], values[table]); - writers[table].addMutation(m); - if (i % 10_000 == 0) { - System.out.println("flushing"); - for (int w = 0; w < N; w++) { - writers[w].flush(); - } - } - } - System.out.println("closing"); - for (int w = 0; w < N; w++) { - writers[w].close(); - } - System.out.println("stopping the agitator"); - stop.set(true); - agitator.join(); - System.out.println("checking the data"); - long count = 0; - for (int w = 0; w < N; w++) { - Scanner scanner = c.createScanner(tables[w], Authorizations.EMPTY); - for (Entry<Key,Value> entry : scanner) { - int value = Integer.parseInt(entry.getValue().toString()); - assertEquals(w, value); - count++; - } - scanner.close(); - } - assertEquals(1_000_000, count); - } - - private Thread agitator(final AtomicBoolean stop) { - return new Thread() { - @Override - public void run() { - try { - int i = 0; - while (!stop.get()) { - UtilWaitThread.sleep(10 * 1000); - System.out.println("Restarting"); - getCluster().getClusterControl().stop(ServerType.TABLET_SERVER); - getCluster().start(); - // read the metadata table to know everything is back up - Iterators.size(getConnector().createScanner(MetadataTable.NAME, Authorizations.EMPTY).iterator()); - i++; - } - System.out.println("Restarted " + i + " times"); - } catch (Exception ex) { - log.error("{}", ex.getMessage(), ex); - } - } - }; - } -}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/01ae5b85/test/src/test/java/org/apache/accumulo/test/NamespacesIT.java ---------------------------------------------------------------------- diff --git a/test/src/test/java/org/apache/accumulo/test/NamespacesIT.java b/test/src/test/java/org/apache/accumulo/test/NamespacesIT.java deleted file mode 100644 index 0ecdd0d..0000000 --- a/test/src/test/java/org/apache/accumulo/test/NamespacesIT.java +++ /dev/null @@ -1,1362 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.accumulo.test; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; - -import org.apache.accumulo.cluster.ClusterUser; -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.BatchWriter; -import org.apache.accumulo.core.client.BatchWriterConfig; -import org.apache.accumulo.core.client.Connector; -import org.apache.accumulo.core.client.IteratorSetting; -import org.apache.accumulo.core.client.MutationsRejectedException; -import org.apache.accumulo.core.client.NamespaceExistsException; -import org.apache.accumulo.core.client.NamespaceNotEmptyException; -import org.apache.accumulo.core.client.NamespaceNotFoundException; -import org.apache.accumulo.core.client.Scanner; -import org.apache.accumulo.core.client.TableExistsException; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.client.admin.NamespaceOperations; -import org.apache.accumulo.core.client.admin.NewTableConfiguration; -import org.apache.accumulo.core.client.admin.TableOperations; -import org.apache.accumulo.core.client.impl.Namespaces; -import org.apache.accumulo.core.client.impl.Tables; -import org.apache.accumulo.core.client.impl.thrift.TableOperation; -import org.apache.accumulo.core.client.impl.thrift.TableOperationExceptionType; -import org.apache.accumulo.core.client.impl.thrift.ThriftTableOperationException; -import org.apache.accumulo.core.client.security.SecurityErrorCode; -import org.apache.accumulo.core.client.security.tokens.PasswordToken; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Mutation; -import org.apache.accumulo.core.data.Range; -import org.apache.accumulo.core.data.Value; -import org.apache.accumulo.core.iterators.Filter; -import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope; -import org.apache.accumulo.core.iterators.SortedKeyValueIterator; -import org.apache.accumulo.core.iterators.user.VersioningIterator; -import org.apache.accumulo.core.metadata.MetadataTable; -import org.apache.accumulo.core.metadata.RootTable; -import org.apache.accumulo.core.security.Authorizations; -import org.apache.accumulo.core.security.NamespacePermission; -import org.apache.accumulo.core.security.SystemPermission; -import org.apache.accumulo.core.security.TablePermission; -import org.apache.accumulo.core.util.UtilWaitThread; -import org.apache.accumulo.examples.simple.constraints.NumericValueConstraint; -import org.apache.accumulo.harness.AccumuloClusterHarness; -import org.apache.hadoop.io.Text; -import org.junit.After; -import org.junit.Assume; -import org.junit.Before; -import org.junit.Test; - -// Testing default namespace configuration with inheritance requires altering the system state and restoring it back to normal -// Punt on this for now and just let it use a minicluster. -public class NamespacesIT extends AccumuloClusterHarness { - - private Connector c; - private String namespace; - - @Override - public int defaultTimeoutSeconds() { - return 60; - } - - @Before - public void setupConnectorAndNamespace() throws Exception { - Assume.assumeTrue(ClusterType.MINI == getClusterType()); - - // prepare a unique namespace and get a new root connector for each test - c = getConnector(); - namespace = "ns_" + getUniqueNames(1)[0]; - } - - @After - public void swingMjölnir() throws Exception { - if (null == c) { - return; - } - // clean up any added tables, namespaces, and users, after each test - for (String t : c.tableOperations().list()) - if (!Tables.qualify(t).getFirst().equals(Namespaces.ACCUMULO_NAMESPACE)) - c.tableOperations().delete(t); - assertEquals(3, c.tableOperations().list().size()); - for (String n : c.namespaceOperations().list()) - if (!n.equals(Namespaces.ACCUMULO_NAMESPACE) && !n.equals(Namespaces.DEFAULT_NAMESPACE)) - c.namespaceOperations().delete(n); - assertEquals(2, c.namespaceOperations().list().size()); - for (String u : c.securityOperations().listLocalUsers()) - if (!getAdminPrincipal().equals(u)) - c.securityOperations().dropLocalUser(u); - assertEquals(1, c.securityOperations().listLocalUsers().size()); - } - - @Test - public void checkReservedNamespaces() throws Exception { - assertEquals(c.namespaceOperations().defaultNamespace(), Namespaces.DEFAULT_NAMESPACE); - assertEquals(c.namespaceOperations().systemNamespace(), Namespaces.ACCUMULO_NAMESPACE); - } - - @Test - public void checkBuiltInNamespaces() throws Exception { - assertTrue(c.namespaceOperations().exists(Namespaces.DEFAULT_NAMESPACE)); - assertTrue(c.namespaceOperations().exists(Namespaces.ACCUMULO_NAMESPACE)); - } - - @Test - public void createTableInDefaultNamespace() throws Exception { - String tableName = "1"; - c.tableOperations().create(tableName); - assertTrue(c.tableOperations().exists(tableName)); - } - - @Test(expected = AccumuloException.class) - public void createTableInAccumuloNamespace() throws Exception { - String tableName = Namespaces.ACCUMULO_NAMESPACE + ".1"; - assertFalse(c.tableOperations().exists(tableName)); - c.tableOperations().create(tableName); // should fail - } - - @Test(expected = AccumuloSecurityException.class) - public void deleteDefaultNamespace() throws Exception { - c.namespaceOperations().delete(Namespaces.DEFAULT_NAMESPACE); // should fail - } - - @Test(expected = AccumuloSecurityException.class) - public void deleteAccumuloNamespace() throws Exception { - c.namespaceOperations().delete(Namespaces.ACCUMULO_NAMESPACE); // should fail - } - - @Test - public void createTableInMissingNamespace() throws Exception { - String t = namespace + ".1"; - assertFalse(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(t)); - try { - c.tableOperations().create(t); - fail(); - } catch (AccumuloException e) { - assertEquals(NamespaceNotFoundException.class.getName(), e.getCause().getClass().getName()); - assertFalse(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(t)); - } - } - - @Test - public void createAndDeleteNamespace() throws Exception { - String t1 = namespace + ".1"; - String t2 = namespace + ".2"; - assertFalse(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(t1)); - assertFalse(c.tableOperations().exists(t2)); - try { - c.namespaceOperations().delete(namespace); - } catch (NamespaceNotFoundException e) {} - try { - c.tableOperations().delete(t1); - } catch (TableNotFoundException e) { - assertEquals(NamespaceNotFoundException.class.getName(), e.getCause().getClass().getName()); - } - c.namespaceOperations().create(namespace); - assertTrue(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(t1)); - assertFalse(c.tableOperations().exists(t2)); - c.tableOperations().create(t1); - assertTrue(c.namespaceOperations().exists(namespace)); - assertTrue(c.tableOperations().exists(t1)); - assertFalse(c.tableOperations().exists(t2)); - c.tableOperations().create(t2); - assertTrue(c.namespaceOperations().exists(namespace)); - assertTrue(c.tableOperations().exists(t1)); - assertTrue(c.tableOperations().exists(t2)); - c.tableOperations().delete(t1); - assertTrue(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(t1)); - assertTrue(c.tableOperations().exists(t2)); - c.tableOperations().delete(t2); - assertTrue(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(t1)); - assertFalse(c.tableOperations().exists(t2)); - c.namespaceOperations().delete(namespace); - assertFalse(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(t1)); - assertFalse(c.tableOperations().exists(t2)); - } - - @Test(expected = NamespaceNotEmptyException.class) - public void deleteNonEmptyNamespace() throws Exception { - String tableName1 = namespace + ".1"; - assertFalse(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(tableName1)); - c.namespaceOperations().create(namespace); - c.tableOperations().create(tableName1); - assertTrue(c.namespaceOperations().exists(namespace)); - assertTrue(c.tableOperations().exists(tableName1)); - c.namespaceOperations().delete(namespace); // should fail - } - - @Test - public void verifyPropertyInheritance() throws Exception { - String t0 = "0"; - String t1 = namespace + ".1"; - String t2 = namespace + ".2"; - - String k = Property.TABLE_SCAN_MAXMEM.getKey(); - String v = "42K"; - - assertFalse(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(t1)); - assertFalse(c.tableOperations().exists(t2)); - c.namespaceOperations().create(namespace); - c.tableOperations().create(t1); - c.tableOperations().create(t0); - assertTrue(c.namespaceOperations().exists(namespace)); - assertTrue(c.tableOperations().exists(t1)); - assertTrue(c.tableOperations().exists(t0)); - - // verify no property - assertFalse(checkNamespaceHasProp(namespace, k, v)); - assertFalse(checkTableHasProp(t1, k, v)); - assertFalse(checkNamespaceHasProp(Namespaces.DEFAULT_NAMESPACE, k, v)); - assertFalse(checkTableHasProp(t0, k, v)); - - // set property and verify - c.namespaceOperations().setProperty(namespace, k, v); - assertTrue(checkNamespaceHasProp(namespace, k, v)); - assertTrue(checkTableHasProp(t1, k, v)); - assertFalse(checkNamespaceHasProp(Namespaces.DEFAULT_NAMESPACE, k, v)); - assertFalse(checkTableHasProp(t0, k, v)); - - // add a new table to namespace and verify - assertFalse(c.tableOperations().exists(t2)); - c.tableOperations().create(t2); - assertTrue(c.tableOperations().exists(t2)); - assertTrue(checkNamespaceHasProp(namespace, k, v)); - assertTrue(checkTableHasProp(t1, k, v)); - assertTrue(checkTableHasProp(t2, k, v)); - assertFalse(checkNamespaceHasProp(Namespaces.DEFAULT_NAMESPACE, k, v)); - assertFalse(checkTableHasProp(t0, k, v)); - - // remove property and verify - c.namespaceOperations().removeProperty(namespace, k); - assertFalse(checkNamespaceHasProp(namespace, k, v)); - assertFalse(checkTableHasProp(t1, k, v)); - assertFalse(checkTableHasProp(t2, k, v)); - assertFalse(checkNamespaceHasProp(Namespaces.DEFAULT_NAMESPACE, k, v)); - assertFalse(checkTableHasProp(t0, k, v)); - - // set property on default namespace and verify - c.namespaceOperations().setProperty(Namespaces.DEFAULT_NAMESPACE, k, v); - assertFalse(checkNamespaceHasProp(namespace, k, v)); - assertFalse(checkTableHasProp(t1, k, v)); - assertFalse(checkTableHasProp(t2, k, v)); - assertTrue(checkNamespaceHasProp(Namespaces.DEFAULT_NAMESPACE, k, v)); - assertTrue(checkTableHasProp(t0, k, v)); - - // test that table properties override namespace properties - String k2 = Property.TABLE_FILE_MAX.getKey(); - String v2 = "42"; - String table_v2 = "13"; - - // set new property on some - c.namespaceOperations().setProperty(namespace, k2, v2); - c.tableOperations().setProperty(t2, k2, table_v2); - assertTrue(checkNamespaceHasProp(namespace, k2, v2)); - assertTrue(checkTableHasProp(t1, k2, v2)); - assertTrue(checkTableHasProp(t2, k2, table_v2)); - - c.tableOperations().delete(t1); - c.tableOperations().delete(t2); - c.tableOperations().delete(t0); - c.namespaceOperations().delete(namespace); - } - - @Test - public void verifyIteratorInheritance() throws Exception { - String t1 = namespace + ".1"; - c.namespaceOperations().create(namespace); - c.tableOperations().create(t1); - String iterName = namespace + "_iter"; - - BatchWriter bw = c.createBatchWriter(t1, new BatchWriterConfig()); - Mutation m = new Mutation("r"); - m.put("a", "b", new Value("abcde".getBytes())); - bw.addMutation(m); - bw.flush(); - bw.close(); - - IteratorSetting setting = new IteratorSetting(250, iterName, SimpleFilter.class.getName()); - - // verify can see inserted entry - Scanner s = c.createScanner(t1, Authorizations.EMPTY); - assertTrue(s.iterator().hasNext()); - assertFalse(c.namespaceOperations().listIterators(namespace).containsKey(iterName)); - assertFalse(c.tableOperations().listIterators(t1).containsKey(iterName)); - - // verify entry is filtered out (also, verify conflict checking API) - c.namespaceOperations().checkIteratorConflicts(namespace, setting, EnumSet.allOf(IteratorScope.class)); - c.namespaceOperations().attachIterator(namespace, setting); - UtilWaitThread.sleep(2 * 1000); - try { - c.namespaceOperations().checkIteratorConflicts(namespace, setting, EnumSet.allOf(IteratorScope.class)); - fail(); - } catch (AccumuloException e) { - assertEquals(IllegalArgumentException.class.getName(), e.getCause().getClass().getName()); - } - IteratorSetting setting2 = c.namespaceOperations().getIteratorSetting(namespace, setting.getName(), IteratorScope.scan); - assertEquals(setting, setting2); - assertTrue(c.namespaceOperations().listIterators(namespace).containsKey(iterName)); - assertTrue(c.tableOperations().listIterators(t1).containsKey(iterName)); - s = c.createScanner(t1, Authorizations.EMPTY); - assertFalse(s.iterator().hasNext()); - - // verify can see inserted entry again - c.namespaceOperations().removeIterator(namespace, setting.getName(), EnumSet.allOf(IteratorScope.class)); - UtilWaitThread.sleep(2 * 1000); - assertFalse(c.namespaceOperations().listIterators(namespace).containsKey(iterName)); - assertFalse(c.tableOperations().listIterators(t1).containsKey(iterName)); - s = c.createScanner(t1, Authorizations.EMPTY); - assertTrue(s.iterator().hasNext()); - } - - @Test - public void cloneTable() throws Exception { - String namespace2 = namespace + "_clone"; - String t1 = namespace + ".1"; - String t2 = namespace + ".2"; - String t3 = namespace2 + ".2"; - String k1 = Property.TABLE_FILE_MAX.getKey(); - String k2 = Property.TABLE_FILE_REPLICATION.getKey(); - String k1v1 = "55"; - String k1v2 = "66"; - String k2v1 = "5"; - String k2v2 = "6"; - - c.namespaceOperations().create(namespace); - c.tableOperations().create(t1); - assertTrue(c.tableOperations().exists(t1)); - assertFalse(c.namespaceOperations().exists(namespace2)); - assertFalse(c.tableOperations().exists(t2)); - assertFalse(c.tableOperations().exists(t3)); - - try { - // try to clone before namespace exists - c.tableOperations().clone(t1, t3, false, null, null); // should fail - fail(); - } catch (AccumuloException e) { - assertEquals(NamespaceNotFoundException.class.getName(), e.getCause().getClass().getName()); - } - - // try to clone before when target tables exist - c.namespaceOperations().create(namespace2); - c.tableOperations().create(t2); - c.tableOperations().create(t3); - for (String t : Arrays.asList(t2, t3)) { - try { - c.tableOperations().clone(t1, t, false, null, null); // should fail - fail(); - } catch (TableExistsException e) { - c.tableOperations().delete(t); - } - } - - assertTrue(c.tableOperations().exists(t1)); - assertTrue(c.namespaceOperations().exists(namespace2)); - assertFalse(c.tableOperations().exists(t2)); - assertFalse(c.tableOperations().exists(t3)); - - // set property with different values in two namespaces and a separate property with different values on the table and both namespaces - assertFalse(checkNamespaceHasProp(namespace, k1, k1v1)); - assertFalse(checkNamespaceHasProp(namespace2, k1, k1v2)); - assertFalse(checkTableHasProp(t1, k1, k1v1)); - assertFalse(checkTableHasProp(t1, k1, k1v2)); - assertFalse(checkNamespaceHasProp(namespace, k2, k2v1)); - assertFalse(checkNamespaceHasProp(namespace2, k2, k2v1)); - assertFalse(checkTableHasProp(t1, k2, k2v1)); - assertFalse(checkTableHasProp(t1, k2, k2v2)); - c.namespaceOperations().setProperty(namespace, k1, k1v1); - c.namespaceOperations().setProperty(namespace2, k1, k1v2); - c.namespaceOperations().setProperty(namespace, k2, k2v1); - c.namespaceOperations().setProperty(namespace2, k2, k2v1); - c.tableOperations().setProperty(t1, k2, k2v2); - assertTrue(checkNamespaceHasProp(namespace, k1, k1v1)); - assertTrue(checkNamespaceHasProp(namespace2, k1, k1v2)); - assertTrue(checkTableHasProp(t1, k1, k1v1)); - assertFalse(checkTableHasProp(t1, k1, k1v2)); - assertTrue(checkNamespaceHasProp(namespace, k2, k2v1)); - assertTrue(checkNamespaceHasProp(namespace2, k2, k2v1)); - assertFalse(checkTableHasProp(t1, k2, k2v1)); - assertTrue(checkTableHasProp(t1, k2, k2v2)); - - // clone twice, once in same namespace, once in another - for (String t : Arrays.asList(t2, t3)) - c.tableOperations().clone(t1, t, false, null, null); - - assertTrue(c.namespaceOperations().exists(namespace2)); - assertTrue(c.tableOperations().exists(t1)); - assertTrue(c.tableOperations().exists(t2)); - assertTrue(c.tableOperations().exists(t3)); - - // verify the properties got transferred - assertTrue(checkTableHasProp(t1, k1, k1v1)); - assertTrue(checkTableHasProp(t2, k1, k1v1)); - assertTrue(checkTableHasProp(t3, k1, k1v2)); - assertTrue(checkTableHasProp(t1, k2, k2v2)); - assertTrue(checkTableHasProp(t2, k2, k2v2)); - assertTrue(checkTableHasProp(t3, k2, k2v2)); - } - - @Test - public void renameNamespaceWithTable() throws Exception { - String namespace2 = namespace + "_renamed"; - String t1 = namespace + ".t"; - String t2 = namespace2 + ".t"; - - c.namespaceOperations().create(namespace); - c.tableOperations().create(t1); - assertTrue(c.namespaceOperations().exists(namespace)); - assertTrue(c.tableOperations().exists(t1)); - assertFalse(c.namespaceOperations().exists(namespace2)); - assertFalse(c.tableOperations().exists(t2)); - - String namespaceId = c.namespaceOperations().namespaceIdMap().get(namespace); - String tableId = c.tableOperations().tableIdMap().get(t1); - - c.namespaceOperations().rename(namespace, namespace2); - assertFalse(c.namespaceOperations().exists(namespace)); - assertFalse(c.tableOperations().exists(t1)); - assertTrue(c.namespaceOperations().exists(namespace2)); - assertTrue(c.tableOperations().exists(t2)); - - // verify id's didn't change - String namespaceId2 = c.namespaceOperations().namespaceIdMap().get(namespace2); - String tableId2 = c.tableOperations().tableIdMap().get(t2); - - assertEquals(namespaceId, namespaceId2); - assertEquals(tableId, tableId2); - } - - @Test - public void verifyConstraintInheritance() throws Exception { - String t1 = namespace + ".1"; - c.namespaceOperations().create(namespace); - c.tableOperations().create(t1, new NewTableConfiguration().withoutDefaultIterators()); - String constraintClassName = NumericValueConstraint.class.getName(); - - assertFalse(c.namespaceOperations().listConstraints(namespace).containsKey(constraintClassName)); - assertFalse(c.tableOperations().listConstraints(t1).containsKey(constraintClassName)); - - c.namespaceOperations().addConstraint(namespace, constraintClassName); - assertTrue(c.namespaceOperations().listConstraints(namespace).containsKey(constraintClassName)); - assertTrue(c.tableOperations().listConstraints(t1).containsKey(constraintClassName)); - int num = c.namespaceOperations().listConstraints(namespace).get(constraintClassName); - assertEquals(num, (int) c.tableOperations().listConstraints(t1).get(constraintClassName)); - // doesn't take effect immediately, needs time to propagate to tserver's ZooKeeper cache - UtilWaitThread.sleep(250); - - Mutation m1 = new Mutation("r1"); - Mutation m2 = new Mutation("r2"); - Mutation m3 = new Mutation("r3"); - m1.put("a", "b", new Value("abcde".getBytes(UTF_8))); - m2.put("e", "f", new Value("123".getBytes(UTF_8))); - m3.put("c", "d", new Value("zyxwv".getBytes(UTF_8))); - BatchWriter bw = c.createBatchWriter(t1, new BatchWriterConfig()); - bw.addMutations(Arrays.asList(m1, m2, m3)); - try { - bw.close(); - fail(); - } catch (MutationsRejectedException e) { - assertEquals(1, e.getConstraintViolationSummaries().size()); - assertEquals(2, e.getConstraintViolationSummaries().get(0).getNumberOfViolatingMutations()); - } - c.namespaceOperations().removeConstraint(namespace, num); - assertFalse(c.namespaceOperations().listConstraints(namespace).containsKey(constraintClassName)); - assertFalse(c.tableOperations().listConstraints(t1).containsKey(constraintClassName)); - // doesn't take effect immediately, needs time to propagate to tserver's ZooKeeper cache - UtilWaitThread.sleep(250); - - bw = c.createBatchWriter(t1, new BatchWriterConfig()); - bw.addMutations(Arrays.asList(m1, m2, m3)); - bw.close(); - } - - @Test - public void renameTable() throws Exception { - String namespace2 = namespace + "_renamed"; - String t1 = namespace + ".1"; - String t2 = namespace2 + ".2"; - String t3 = namespace + ".3"; - String t4 = namespace + ".4"; - String t5 = "5"; - - c.namespaceOperations().create(namespace); - c.namespaceOperations().create(namespace2); - - assertTrue(c.namespaceOperations().exists(namespace)); - assertTrue(c.namespaceOperations().exists(namespace2)); - assertFalse(c.tableOperations().exists(t1)); - assertFalse(c.tableOperations().exists(t2)); - assertFalse(c.tableOperations().exists(t3)); - assertFalse(c.tableOperations().exists(t4)); - assertFalse(c.tableOperations().exists(t5)); - - c.tableOperations().create(t1); - - try { - c.tableOperations().rename(t1, t2); - fail(); - } catch (AccumuloException e) { - // this is expected, because we don't allow renames across namespaces - assertEquals(ThriftTableOperationException.class.getName(), e.getCause().getClass().getName()); - assertEquals(TableOperation.RENAME, ((ThriftTableOperationException) e.getCause()).getOp()); - assertEquals(TableOperationExceptionType.INVALID_NAME, ((ThriftTableOperationException) e.getCause()).getType()); - } - - try { - c.tableOperations().rename(t1, t5); - fail(); - } catch (AccumuloException e) { - // this is expected, because we don't allow renames across namespaces - assertEquals(ThriftTableOperationException.class.getName(), e.getCause().getClass().getName()); - assertEquals(TableOperation.RENAME, ((ThriftTableOperationException) e.getCause()).getOp()); - assertEquals(TableOperationExceptionType.INVALID_NAME, ((ThriftTableOperationException) e.getCause()).getType()); - } - - assertTrue(c.tableOperations().exists(t1)); - assertFalse(c.tableOperations().exists(t2)); - assertFalse(c.tableOperations().exists(t3)); - assertFalse(c.tableOperations().exists(t4)); - assertFalse(c.tableOperations().exists(t5)); - - // fully qualified rename - c.tableOperations().rename(t1, t3); - assertFalse(c.tableOperations().exists(t1)); - assertFalse(c.tableOperations().exists(t2)); - assertTrue(c.tableOperations().exists(t3)); - assertFalse(c.tableOperations().exists(t4)); - assertFalse(c.tableOperations().exists(t5)); - } - - private void loginAs(ClusterUser user) throws IOException { - user.getToken(); - } - - /** - * Tests new Namespace permissions as well as modifications to Table permissions because of namespaces. Checks each permission to first make sure the user - * doesn't have permission to perform the action, then root grants them the permission and we check to make sure they could perform the action. - */ - @Test - public void testPermissions() throws Exception { - ClusterUser user1 = getUser(0), user2 = getUser(1), root = getAdminUser(); - String u1 = user1.getPrincipal(); - String u2 = user2.getPrincipal(); - PasswordToken pass = (null != user1.getPassword() ? new PasswordToken(user1.getPassword()) : null); - - String n1 = namespace; - String t1 = n1 + ".1"; - String t2 = n1 + ".2"; - String t3 = n1 + ".3"; - - String n2 = namespace + "_2"; - - loginAs(root); - c.namespaceOperations().create(n1); - c.tableOperations().create(t1); - - c.securityOperations().createLocalUser(u1, pass); - - loginAs(user1); - Connector user1Con = c.getInstance().getConnector(u1, user1.getToken()); - - try { - user1Con.tableOperations().create(t2); - fail(); - } catch (AccumuloSecurityException e) { - expectPermissionDenied(e); - } - - loginAs(root); - c.securityOperations().grantNamespacePermission(u1, n1, NamespacePermission.CREATE_TABLE); - loginAs(user1); - user1Con.tableOperations().create(t2); - loginAs(root); - assertTrue(c.tableOperations().list().contains(t2)); - c.securityOperations().revokeNamespacePermission(u1, n1, NamespacePermission.CREATE_TABLE); - - loginAs(user1); - try { - user1Con.tableOperations().delete(t1); - fail(); - } catch (AccumuloSecurityException e) { - expectPermissionDenied(e); - } - - loginAs(root); - c.securityOperations().grantNamespacePermission(u1, n1, NamespacePermission.DROP_TABLE); - loginAs(user1); - user1Con.tableOperations().delete(t1); - loginAs(root); - assertTrue(!c.tableOperations().list().contains(t1)); - c.securityOperations().revokeNamespacePermission(u1, n1, NamespacePermission.DROP_TABLE); - - c.tableOperations().create(t3); - BatchWriter bw = c.createBatchWriter(t3, null); - Mutation m = new Mutation("row"); - m.put("cf", "cq", "value"); - bw.addMutation(m); - bw.close(); - - loginAs(user1); - Iterator<Entry<Key,Value>> i = user1Con.createScanner(t3, new Authorizations()).iterator(); - try { - i.next(); - fail(); - } catch (RuntimeException e) { - assertEquals(AccumuloSecurityException.class.getName(), e.getCause().getClass().getName()); - expectPermissionDenied((AccumuloSecurityException) e.getCause()); - } - - loginAs(user1); - m = new Mutation(u1); - m.put("cf", "cq", "turtles"); - bw = user1Con.createBatchWriter(t3, null); - try { - bw.addMutation(m); - bw.close(); - fail(); - } catch (MutationsRejectedException e) { - assertEquals(1, e.getSecurityErrorCodes().size()); - assertEquals(1, e.getSecurityErrorCodes().entrySet().iterator().next().getValue().size()); - switch (e.getSecurityErrorCodes().entrySet().iterator().next().getValue().iterator().next()) { - case PERMISSION_DENIED: - break; - default: - fail(); - } - } - - loginAs(root); - c.securityOperations().grantNamespacePermission(u1, n1, NamespacePermission.READ); - loginAs(user1); - i = user1Con.createScanner(t3, new Authorizations()).iterator(); - assertTrue(i.hasNext()); - loginAs(root); - c.securityOperations().revokeNamespacePermission(u1, n1, NamespacePermission.READ); - c.securityOperations().grantNamespacePermission(u1, n1, NamespacePermission.WRITE); - - loginAs(user1); - m = new Mutation(u1); - m.put("cf", "cq", "turtles"); - bw = user1Con.createBatchWriter(t3, null); - bw.addMutation(m); - bw.close(); - loginAs(root); - c.securityOperations().revokeNamespacePermission(u1, n1, NamespacePermission.WRITE); - - loginAs(user1); - try { - user1Con.tableOperations().setProperty(t3, Property.TABLE_FILE_MAX.getKey(), "42"); - fail(); - } catch (AccumuloSecurityException e) { - expectPermissionDenied(e); - } - - loginAs(root); - c.securityOperations().grantNamespacePermission(u1, n1, NamespacePermission.ALTER_TABLE); - loginAs(user1); - user1Con.tableOperations().setProperty(t3, Property.TABLE_FILE_MAX.getKey(), "42"); - user1Con.tableOperations().removeProperty(t3, Property.TABLE_FILE_MAX.getKey()); - loginAs(root); - c.securityOperations().revokeNamespacePermission(u1, n1, NamespacePermission.ALTER_TABLE); - - loginAs(user1); - try { - user1Con.namespaceOperations().setProperty(n1, Property.TABLE_FILE_MAX.getKey(), "55"); - fail(); - } catch (AccumuloSecurityException e) { - expectPermissionDenied(e); - } - - loginAs(root); - c.securityOperations().grantNamespacePermission(u1, n1, NamespacePermission.ALTER_NAMESPACE); - loginAs(user1); - user1Con.namespaceOperations().setProperty(n1, Property.TABLE_FILE_MAX.getKey(), "42"); - user1Con.namespaceOperations().removeProperty(n1, Property.TABLE_FILE_MAX.getKey()); - loginAs(root); - c.securityOperations().revokeNamespacePermission(u1, n1, NamespacePermission.ALTER_NAMESPACE); - - loginAs(root); - c.securityOperations().createLocalUser(u2, (root.getPassword() == null ? null : new PasswordToken(user2.getPassword()))); - loginAs(user1); - try { - user1Con.securityOperations().grantNamespacePermission(u2, n1, NamespacePermission.ALTER_NAMESPACE); - fail(); - } catch (AccumuloSecurityException e) { - expectPermissionDenied(e); - } - - loginAs(root); - c.securityOperations().grantNamespacePermission(u1, n1, NamespacePermission.GRANT); - loginAs(user1); - user1Con.securityOperations().grantNamespacePermission(u2, n1, NamespacePermission.ALTER_NAMESPACE); - user1Con.securityOperations().revokeNamespacePermission(u2, n1, NamespacePermission.ALTER_NAMESPACE); - loginAs(root); - c.securityOperations().revokeNamespacePermission(u1, n1, NamespacePermission.GRANT); - - loginAs(user1); - try { - user1Con.namespaceOperations().create(n2); - fail(); - } catch (AccumuloSecurityException e) { - expectPermissionDenied(e); - } - - loginAs(root); - c.securityOperations().grantSystemPermission(u1, SystemPermission.CREATE_NAMESPACE); - loginAs(user1); - user1Con.namespaceOperations().create(n2); - loginAs(root); - c.securityOperations().revokeSystemPermission(u1, SystemPermission.CREATE_NAMESPACE); - - c.securityOperations().revokeNamespacePermission(u1, n2, NamespacePermission.DROP_NAMESPACE); - loginAs(user1); - try { - user1Con.namespaceOperations().delete(n2); - fail(); - } catch (AccumuloSecurityException e) { - expectPermissionDenied(e); - } - - loginAs(root); - c.securityOperations().grantSystemPermission(u1, SystemPermission.DROP_NAMESPACE); - loginAs(user1); - user1Con.namespaceOperations().delete(n2); - loginAs(root); - c.securityOperations().revokeSystemPermission(u1, SystemPermission.DROP_NAMESPACE); - - loginAs(user1); - try { - user1Con.namespaceOperations().setProperty(n1, Property.TABLE_FILE_MAX.getKey(), "33"); - fail(); - } catch (AccumuloSecurityException e) { - expectPermissionDenied(e); - } - - loginAs(root); - c.securityOperations().grantSystemPermission(u1, SystemPermission.ALTER_NAMESPACE); - loginAs(user1); - user1Con.namespaceOperations().setProperty(n1, Property.TABLE_FILE_MAX.getKey(), "33"); - user1Con.namespaceOperations().removeProperty(n1, Property.TABLE_FILE_MAX.getKey()); - loginAs(root); - c.securityOperations().revokeSystemPermission(u1, SystemPermission.ALTER_NAMESPACE); - } - - @Test - public void verifySystemPropertyInheritance() throws Exception { - String t1 = "1"; - String t2 = namespace + "." + t1; - c.tableOperations().create(t1); - c.namespaceOperations().create(namespace); - c.tableOperations().create(t2); - - // verify iterator inheritance - _verifySystemPropertyInheritance(t1, t2, Property.TABLE_ITERATOR_PREFIX.getKey() + "scan.sum", "20," + SimpleFilter.class.getName(), false); - - // verify constraint inheritance - _verifySystemPropertyInheritance(t1, t2, Property.TABLE_CONSTRAINT_PREFIX.getKey() + "42", NumericValueConstraint.class.getName(), false); - - // verify other inheritance - _verifySystemPropertyInheritance(t1, t2, Property.TABLE_LOCALITY_GROUP_PREFIX.getKey() + "dummy", "dummy", true); - } - - private void _verifySystemPropertyInheritance(String defaultNamespaceTable, String namespaceTable, String k, String v, boolean systemNamespaceShouldInherit) - throws Exception { - // nobody should have any of these properties yet - assertFalse(c.instanceOperations().getSystemConfiguration().containsValue(v)); - assertFalse(checkNamespaceHasProp(Namespaces.ACCUMULO_NAMESPACE, k, v)); - assertFalse(checkTableHasProp(RootTable.NAME, k, v)); - assertFalse(checkTableHasProp(MetadataTable.NAME, k, v)); - assertFalse(checkNamespaceHasProp(Namespaces.DEFAULT_NAMESPACE, k, v)); - assertFalse(checkTableHasProp(defaultNamespaceTable, k, v)); - assertFalse(checkNamespaceHasProp(namespace, k, v)); - assertFalse(checkTableHasProp(namespaceTable, k, v)); - - // set the filter, verify that accumulo namespace is the only one unaffected - c.instanceOperations().setProperty(k, v); - // doesn't take effect immediately, needs time to propagate to tserver's ZooKeeper cache - UtilWaitThread.sleep(250); - assertTrue(c.instanceOperations().getSystemConfiguration().containsValue(v)); - assertEquals(systemNamespaceShouldInherit, checkNamespaceHasProp(Namespaces.ACCUMULO_NAMESPACE, k, v)); - assertEquals(systemNamespaceShouldInherit, checkTableHasProp(RootTable.NAME, k, v)); - assertEquals(systemNamespaceShouldInherit, checkTableHasProp(MetadataTable.NAME, k, v)); - assertTrue(checkNamespaceHasProp(Namespaces.DEFAULT_NAMESPACE, k, v)); - assertTrue(checkTableHasProp(defaultNamespaceTable, k, v)); - assertTrue(checkNamespaceHasProp(namespace, k, v)); - assertTrue(checkTableHasProp(namespaceTable, k, v)); - - // verify it is no longer inherited - c.instanceOperations().removeProperty(k); - // doesn't take effect immediately, needs time to propagate to tserver's ZooKeeper cache - UtilWaitThread.sleep(250); - assertFalse(c.instanceOperations().getSystemConfiguration().containsValue(v)); - assertFalse(checkNamespaceHasProp(Namespaces.ACCUMULO_NAMESPACE, k, v)); - assertFalse(checkTableHasProp(RootTable.NAME, k, v)); - assertFalse(checkTableHasProp(MetadataTable.NAME, k, v)); - assertFalse(checkNamespaceHasProp(Namespaces.DEFAULT_NAMESPACE, k, v)); - assertFalse(checkTableHasProp(defaultNamespaceTable, k, v)); - assertFalse(checkNamespaceHasProp(namespace, k, v)); - assertFalse(checkTableHasProp(namespaceTable, k, v)); - } - - @Test - public void listNamespaces() throws Exception { - SortedSet<String> namespaces = c.namespaceOperations().list(); - Map<String,String> map = c.namespaceOperations().namespaceIdMap(); - assertEquals(2, namespaces.size()); - assertEquals(2, map.size()); - assertTrue(namespaces.contains(Namespaces.ACCUMULO_NAMESPACE)); - assertTrue(namespaces.contains(Namespaces.DEFAULT_NAMESPACE)); - assertFalse(namespaces.contains(namespace)); - assertEquals(Namespaces.ACCUMULO_NAMESPACE_ID, map.get(Namespaces.ACCUMULO_NAMESPACE)); - assertEquals(Namespaces.DEFAULT_NAMESPACE_ID, map.get(Namespaces.DEFAULT_NAMESPACE)); - assertNull(map.get(namespace)); - - c.namespaceOperations().create(namespace); - namespaces = c.namespaceOperations().list(); - map = c.namespaceOperations().namespaceIdMap(); - assertEquals(3, namespaces.size()); - assertEquals(3, map.size()); - assertTrue(namespaces.contains(Namespaces.ACCUMULO_NAMESPACE)); - assertTrue(namespaces.contains(Namespaces.DEFAULT_NAMESPACE)); - assertTrue(namespaces.contains(namespace)); - assertEquals(Namespaces.ACCUMULO_NAMESPACE_ID, map.get(Namespaces.ACCUMULO_NAMESPACE)); - assertEquals(Namespaces.DEFAULT_NAMESPACE_ID, map.get(Namespaces.DEFAULT_NAMESPACE)); - assertNotNull(map.get(namespace)); - - c.namespaceOperations().delete(namespace); - namespaces = c.namespaceOperations().list(); - map = c.namespaceOperations().namespaceIdMap(); - assertEquals(2, namespaces.size()); - assertEquals(2, map.size()); - assertTrue(namespaces.contains(Namespaces.ACCUMULO_NAMESPACE)); - assertTrue(namespaces.contains(Namespaces.DEFAULT_NAMESPACE)); - assertFalse(namespaces.contains(namespace)); - assertEquals(Namespaces.ACCUMULO_NAMESPACE_ID, map.get(Namespaces.ACCUMULO_NAMESPACE)); - assertEquals(Namespaces.DEFAULT_NAMESPACE_ID, map.get(Namespaces.DEFAULT_NAMESPACE)); - assertNull(map.get(namespace)); - } - - @Test - public void loadClass() throws Exception { - assertTrue(c.namespaceOperations().testClassLoad(Namespaces.DEFAULT_NAMESPACE, VersioningIterator.class.getName(), SortedKeyValueIterator.class.getName())); - assertFalse(c.namespaceOperations().testClassLoad(Namespaces.DEFAULT_NAMESPACE, "dummy", SortedKeyValueIterator.class.getName())); - try { - c.namespaceOperations().testClassLoad(namespace, "dummy", "dummy"); - fail(); - } catch (NamespaceNotFoundException e) { - // expected, ignore - } - } - - @Test - public void testModifyingPermissions() throws Exception { - String tableName = namespace + ".modify"; - c.namespaceOperations().create(namespace); - c.tableOperations().create(tableName); - assertTrue(c.securityOperations().hasTablePermission(c.whoami(), tableName, TablePermission.READ)); - c.securityOperations().revokeTablePermission(c.whoami(), tableName, TablePermission.READ); - assertFalse(c.securityOperations().hasTablePermission(c.whoami(), tableName, TablePermission.READ)); - c.securityOperations().grantTablePermission(c.whoami(), tableName, TablePermission.READ); - assertTrue(c.securityOperations().hasTablePermission(c.whoami(), tableName, TablePermission.READ)); - c.tableOperations().delete(tableName); - - try { - c.securityOperations().hasTablePermission(c.whoami(), tableName, TablePermission.READ); - fail(); - } catch (Exception e) { - if (!(e instanceof AccumuloSecurityException) || !((AccumuloSecurityException) e).getSecurityErrorCode().equals(SecurityErrorCode.TABLE_DOESNT_EXIST)) - throw new Exception("Has permission resulted in " + e.getClass().getName(), e); - } - - try { - c.securityOperations().grantTablePermission(c.whoami(), tableName, TablePermission.READ); - fail(); - } catch (Exception e) { - if (!(e instanceof AccumuloSecurityException) || !((AccumuloSecurityException) e).getSecurityErrorCode().equals(SecurityErrorCode.TABLE_DOESNT_EXIST)) - throw new Exception("Has permission resulted in " + e.getClass().getName(), e); - } - - try { - c.securityOperations().revokeTablePermission(c.whoami(), tableName, TablePermission.READ); - fail(); - } catch (Exception e) { - if (!(e instanceof AccumuloSecurityException) || !((AccumuloSecurityException) e).getSecurityErrorCode().equals(SecurityErrorCode.TABLE_DOESNT_EXIST)) - throw new Exception("Has permission resulted in " + e.getClass().getName(), e); - } - - assertTrue(c.securityOperations().hasNamespacePermission(c.whoami(), namespace, NamespacePermission.READ)); - c.securityOperations().revokeNamespacePermission(c.whoami(), namespace, NamespacePermission.READ); - assertFalse(c.securityOperations().hasNamespacePermission(c.whoami(), namespace, NamespacePermission.READ)); - c.securityOperations().grantNamespacePermission(c.whoami(), namespace, NamespacePermission.READ); - assertTrue(c.securityOperations().hasNamespacePermission(c.whoami(), namespace, NamespacePermission.READ)); - - c.namespaceOperations().delete(namespace); - - try { - c.securityOperations().hasTablePermission(c.whoami(), tableName, TablePermission.READ); - fail(); - } catch (Exception e) { - if (!(e instanceof AccumuloSecurityException) || !((AccumuloSecurityException) e).getSecurityErrorCode().equals(SecurityErrorCode.TABLE_DOESNT_EXIST)) - throw new Exception("Has permission resulted in " + e.getClass().getName(), e); - } - - try { - c.securityOperations().grantTablePermission(c.whoami(), tableName, TablePermission.READ); - fail(); - } catch (Exception e) { - if (!(e instanceof AccumuloSecurityException) || !((AccumuloSecurityException) e).getSecurityErrorCode().equals(SecurityErrorCode.TABLE_DOESNT_EXIST)) - throw new Exception("Has permission resulted in " + e.getClass().getName(), e); - } - - try { - c.securityOperations().revokeTablePermission(c.whoami(), tableName, TablePermission.READ); - fail(); - } catch (Exception e) { - if (!(e instanceof AccumuloSecurityException) || !((AccumuloSecurityException) e).getSecurityErrorCode().equals(SecurityErrorCode.TABLE_DOESNT_EXIST)) - throw new Exception("Has permission resulted in " + e.getClass().getName(), e); - } - - try { - c.securityOperations().hasNamespacePermission(c.whoami(), namespace, NamespacePermission.READ); - fail(); - } catch (Exception e) { - if (!(e instanceof AccumuloSecurityException) || !((AccumuloSecurityException) e).getSecurityErrorCode().equals(SecurityErrorCode.NAMESPACE_DOESNT_EXIST)) - throw new Exception("Has permission resulted in " + e.getClass().getName(), e); - } - - try { - c.securityOperations().grantNamespacePermission(c.whoami(), namespace, NamespacePermission.READ); - fail(); - } catch (Exception e) { - if (!(e instanceof AccumuloSecurityException) || !((AccumuloSecurityException) e).getSecurityErrorCode().equals(SecurityErrorCode.NAMESPACE_DOESNT_EXIST)) - throw new Exception("Has permission resulted in " + e.getClass().getName(), e); - } - - try { - c.securityOperations().revokeNamespacePermission(c.whoami(), namespace, NamespacePermission.READ); - fail(); - } catch (Exception e) { - if (!(e instanceof AccumuloSecurityException) || !((AccumuloSecurityException) e).getSecurityErrorCode().equals(SecurityErrorCode.NAMESPACE_DOESNT_EXIST)) - throw new Exception("Has permission resulted in " + e.getClass().getName(), e); - } - - } - - @Test - public void verifyTableOperationsExceptions() throws Exception { - String tableName = namespace + ".1"; - IteratorSetting setting = new IteratorSetting(200, VersioningIterator.class); - Text a = new Text("a"); - Text z = new Text("z"); - TableOperations ops = c.tableOperations(); - - // this one doesn't throw an exception, so don't fail; just check that it works - assertFalse(ops.exists(tableName)); - - // table operations that should throw an AccumuloException caused by NamespaceNotFoundException - int numRun = 0; - ACCUMULOEXCEPTIONS_NAMESPACENOTFOUND: for (int i = 0;; ++i) - try { - switch (i) { - case 0: - ops.create(tableName); - fail(); - break; - case 1: - ops.create("a"); - ops.clone("a", tableName, true, Collections.<String,String> emptyMap(), Collections.<String> emptySet()); - fail(); - break; - case 2: - ops.importTable(tableName, System.getProperty("user.dir") + "/target"); - fail(); - break; - default: - // break out of infinite loop - assertEquals(3, i); // check test integrity - assertEquals(3, numRun); // check test integrity - break ACCUMULOEXCEPTIONS_NAMESPACENOTFOUND; - } - } catch (Exception e) { - numRun++; - if (!(e instanceof AccumuloException) || !(e.getCause() instanceof NamespaceNotFoundException)) - throw new Exception("Case " + i + " resulted in " + e.getClass().getName(), e); - } - - // table operations that should throw an AccumuloException caused by a TableNotFoundException caused by a NamespaceNotFoundException - // these are here because we didn't declare TableNotFoundException in the API :( - numRun = 0; - ACCUMULOEXCEPTIONS_TABLENOTFOUND: for (int i = 0;; ++i) - try { - switch (i) { - case 0: - ops.removeConstraint(tableName, 0); - fail(); - break; - case 1: - ops.removeProperty(tableName, "a"); - fail(); - break; - case 2: - ops.setProperty(tableName, "a", "b"); - fail(); - break; - default: - // break out of infinite loop - assertEquals(3, i); // check test integrity - assertEquals(3, numRun); // check test integrity - break ACCUMULOEXCEPTIONS_TABLENOTFOUND; - } - } catch (Exception e) { - numRun++; - if (!(e instanceof AccumuloException) || !(e.getCause() instanceof TableNotFoundException) - || !(e.getCause().getCause() instanceof NamespaceNotFoundException)) - throw new Exception("Case " + i + " resulted in " + e.getClass().getName(), e); - } - - // table operations that should throw a TableNotFoundException caused by NamespaceNotFoundException - numRun = 0; - TABLENOTFOUNDEXCEPTIONS: for (int i = 0;; ++i) - try { - switch (i) { - case 0: - ops.addConstraint(tableName, NumericValueConstraint.class.getName()); - fail(); - break; - case 1: - ops.addSplits(tableName, new TreeSet<Text>()); - fail(); - break; - case 2: - ops.attachIterator(tableName, setting); - fail(); - break; - case 3: - ops.cancelCompaction(tableName); - fail(); - break; - case 4: - ops.checkIteratorConflicts(tableName, setting, EnumSet.allOf(IteratorScope.class)); - fail(); - break; - case 5: - ops.clearLocatorCache(tableName); - fail(); - break; - case 6: - ops.clone(tableName, "2", true, Collections.<String,String> emptyMap(), Collections.<String> emptySet()); - fail(); - break; - case 7: - ops.compact(tableName, a, z, true, true); - fail(); - break; - case 8: - ops.delete(tableName); - fail(); - break; - case 9: - ops.deleteRows(tableName, a, z); - fail(); - break; - case 10: - ops.splitRangeByTablets(tableName, new Range(), 10); - fail(); - break; - case 11: - ops.exportTable(tableName, namespace + "_dir"); - fail(); - break; - case 12: - ops.flush(tableName, a, z, true); - fail(); - break; - case 13: - ops.getDiskUsage(Collections.singleton(tableName)); - fail(); - break; - case 14: - ops.getIteratorSetting(tableName, "a", IteratorScope.scan); - fail(); - break; - case 15: - ops.getLocalityGroups(tableName); - fail(); - break; - case 16: - ops.getMaxRow(tableName, Authorizations.EMPTY, a, true, z, true); - fail(); - break; - case 17: - ops.getProperties(tableName); - fail(); - break; - case 18: - ops.importDirectory(tableName, "", "", false); - fail(); - break; - case 19: - ops.testClassLoad(tableName, VersioningIterator.class.getName(), SortedKeyValueIterator.class.getName()); - fail(); - break; - case 20: - ops.listConstraints(tableName); - fail(); - break; - case 21: - ops.listIterators(tableName); - fail(); - break; - case 22: - ops.listSplits(tableName); - fail(); - break; - case 23: - ops.merge(tableName, a, z); - fail(); - break; - case 24: - ops.offline(tableName, true); - fail(); - break; - case 25: - ops.online(tableName, true); - fail(); - break; - case 26: - ops.removeIterator(tableName, "a", EnumSet.of(IteratorScope.scan)); - fail(); - break; - case 27: - ops.rename(tableName, tableName + "2"); - fail(); - break; - case 28: - ops.setLocalityGroups(tableName, Collections.<String,Set<Text>> emptyMap()); - fail(); - break; - default: - // break out of infinite loop - assertEquals(29, i); // check test integrity - assertEquals(29, numRun); // check test integrity - break TABLENOTFOUNDEXCEPTIONS; - } - } catch (Exception e) { - numRun++; - if (!(e instanceof TableNotFoundException) || !(e.getCause() instanceof NamespaceNotFoundException)) - throw new Exception("Case " + i + " resulted in " + e.getClass().getName(), e); - } - } - - @Test - public void verifyNamespaceOperationsExceptions() throws Exception { - IteratorSetting setting = new IteratorSetting(200, VersioningIterator.class); - NamespaceOperations ops = c.namespaceOperations(); - - // this one doesn't throw an exception, so don't fail; just check that it works - assertFalse(ops.exists(namespace)); - - // namespace operations that should throw a NamespaceNotFoundException - int numRun = 0; - NAMESPACENOTFOUND: for (int i = 0;; ++i) - try { - switch (i) { - case 0: - ops.addConstraint(namespace, NumericValueConstraint.class.getName()); - fail(); - break; - case 1: - ops.attachIterator(namespace, setting); - fail(); - break; - case 2: - ops.checkIteratorConflicts(namespace, setting, EnumSet.of(IteratorScope.scan)); - fail(); - break; - case 3: - ops.delete(namespace); - fail(); - break; - case 4: - ops.getIteratorSetting(namespace, "thing", IteratorScope.scan); - fail(); - break; - case 5: - ops.getProperties(namespace); - fail(); - break; - case 6: - ops.listConstraints(namespace); - fail(); - break; - case 7: - ops.listIterators(namespace); - fail(); - break; - case 8: - ops.removeConstraint(namespace, 1); - fail(); - break; - case 9: - ops.removeIterator(namespace, "thing", EnumSet.allOf(IteratorScope.class)); - fail(); - break; - case 10: - ops.removeProperty(namespace, "a"); - fail(); - break; - case 11: - ops.rename(namespace, namespace + "2"); - fail(); - break; - case 12: - ops.setProperty(namespace, "k", "v"); - fail(); - break; - case 13: - ops.testClassLoad(namespace, VersioningIterator.class.getName(), SortedKeyValueIterator.class.getName()); - fail(); - break; - default: - // break out of infinite loop - assertEquals(14, i); // check test integrity - assertEquals(14, numRun); // check test integrity - break NAMESPACENOTFOUND; - } - } catch (Exception e) { - numRun++; - if (!(e instanceof NamespaceNotFoundException)) - throw new Exception("Case " + i + " resulted in " + e.getClass().getName(), e); - } - - // namespace operations that should throw a NamespaceExistsException - numRun = 0; - NAMESPACEEXISTS: for (int i = 0;; ++i) - try { - switch (i) { - case 0: - ops.create(namespace + "0"); - ops.create(namespace + "0"); // should fail here - fail(); - break; - case 1: - ops.create(namespace + i + "_1"); - ops.create(namespace + i + "_2"); - ops.rename(namespace + i + "_1", namespace + i + "_2"); // should fail here - fail(); - break; - case 2: - ops.create(Namespaces.DEFAULT_NAMESPACE); - fail(); - break; - case 3: - ops.create(Namespaces.ACCUMULO_NAMESPACE); - fail(); - break; - case 4: - ops.create(namespace + i + "_1"); - ops.rename(namespace + i + "_1", Namespaces.DEFAULT_NAMESPACE); // should fail here - fail(); - break; - case 5: - ops.create(namespace + i + "_1"); - ops.rename(namespace + i + "_1", Namespaces.ACCUMULO_NAMESPACE); // should fail here - fail(); - break; - default: - // break out of infinite loop - assertEquals(6, i); // check test integrity - assertEquals(6, numRun); // check test integrity - break NAMESPACEEXISTS; - } - } catch (Exception e) { - numRun++; - if (!(e instanceof NamespaceExistsException)) - throw new Exception("Case " + i + " resulted in " + e.getClass().getName(), e); - } - } - - private boolean checkTableHasProp(String t, String propKey, String propVal) { - return checkHasProperty(t, propKey, propVal, true); - } - - private boolean checkNamespaceHasProp(String n, String propKey, String propVal) { - return checkHasProperty(n, propKey, propVal, false); - } - - private boolean checkHasProperty(String name, String propKey, String propVal, boolean nameIsTable) { - try { - Iterable<Entry<String,String>> iterable = nameIsTable ? c.tableOperations().getProperties(name) : c.namespaceOperations().getProperties(name); - for (Entry<String,String> e : iterable) - if (propKey.equals(e.getKey())) - return propVal.equals(e.getValue()); - return false; - } catch (Exception e) { - fail(); - return false; - } - } - - public static class SimpleFilter extends Filter { - @Override - public boolean accept(Key k, Value v) { - if (k.getColumnFamily().toString().equals("a")) - return false; - return true; - } - } - - private void expectPermissionDenied(AccumuloSecurityException sec) { - assertEquals(sec.getSecurityErrorCode().getClass(), SecurityErrorCode.class); - switch (sec.getSecurityErrorCode()) { - case PERMISSION_DENIED: - break; - default: - fail(); - } - } - -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/01ae5b85/test/src/test/java/org/apache/accumulo/test/RecoveryCompactionsAreFlushesIT.java ---------------------------------------------------------------------- diff --git a/test/src/test/java/org/apache/accumulo/test/RecoveryCompactionsAreFlushesIT.java b/test/src/test/java/org/apache/accumulo/test/RecoveryCompactionsAreFlushesIT.java deleted file mode 100644 index 60b3cf7..0000000 --- a/test/src/test/java/org/apache/accumulo/test/RecoveryCompactionsAreFlushesIT.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.accumulo.test; - -import java.util.Map.Entry; - -import org.apache.accumulo.cluster.ClusterControl; -import org.apache.accumulo.core.client.BatchWriter; -import org.apache.accumulo.core.client.BatchWriterConfig; -import org.apache.accumulo.core.client.Connector; -import org.apache.accumulo.core.client.Scanner; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Mutation; -import org.apache.accumulo.core.data.Value; -import org.apache.accumulo.core.metadata.MetadataTable; -import org.apache.accumulo.core.metadata.schema.MetadataSchema; -import org.apache.accumulo.core.security.Authorizations; -import org.apache.accumulo.harness.AccumuloClusterHarness; -import org.apache.accumulo.minicluster.ServerType; -import org.apache.accumulo.minicluster.impl.MiniAccumuloConfigImpl; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.RawLocalFileSystem; -import org.junit.Assert; -import org.junit.Test; - -import com.google.common.collect.Iterators; - -// Accumulo3010 -public class RecoveryCompactionsAreFlushesIT extends AccumuloClusterHarness { - - @Override - public int defaultTimeoutSeconds() { - return 60; - } - - @Override - public void configureMiniCluster(MiniAccumuloConfigImpl cfg, Configuration hadoopCoreSite) { - cfg.setNumTservers(1); - cfg.setProperty(Property.INSTANCE_ZK_TIMEOUT, "5s"); - // file system supports recovery - hadoopCoreSite.set("fs.file.impl", RawLocalFileSystem.class.getName()); - } - - @Test - public void test() throws Exception { - // create a table - String tableName = getUniqueNames(1)[0]; - Connector c = getConnector(); - c.tableOperations().create(tableName); - c.tableOperations().setProperty(tableName, Property.TABLE_MAJC_RATIO.getKey(), "100"); - c.tableOperations().setProperty(tableName, Property.TABLE_FILE_MAX.getKey(), "3"); - // create 3 flush files - BatchWriter bw = c.createBatchWriter(tableName, new BatchWriterConfig()); - Mutation m = new Mutation("a"); - m.put("b", "c", new Value("v".getBytes())); - for (int i = 0; i < 3; i++) { - bw.addMutation(m); - bw.flush(); - c.tableOperations().flush(tableName, null, null, true); - } - // create an unsaved mutation - bw.addMutation(m); - bw.close(); - - ClusterControl control = cluster.getClusterControl(); - - // kill the tablet servers - control.stopAllServers(ServerType.TABLET_SERVER); - - // recover - control.startAllServers(ServerType.TABLET_SERVER); - - // ensure the table is readable - Iterators.size(c.createScanner(tableName, Authorizations.EMPTY).iterator()); - - // ensure that the recovery was not a merging minor compaction - Scanner s = c.createScanner(MetadataTable.NAME, Authorizations.EMPTY); - s.fetchColumnFamily(MetadataSchema.TabletsSection.DataFileColumnFamily.NAME); - for (Entry<Key,Value> entry : s) { - String filename = entry.getKey().getColumnQualifier().toString(); - String parts[] = filename.split("/"); - Assert.assertFalse(parts[parts.length - 1].startsWith("M")); - } - } - -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/01ae5b85/test/src/test/java/org/apache/accumulo/test/RewriteTabletDirectoriesIT.java ---------------------------------------------------------------------- diff --git a/test/src/test/java/org/apache/accumulo/test/RewriteTabletDirectoriesIT.java b/test/src/test/java/org/apache/accumulo/test/RewriteTabletDirectoriesIT.java deleted file mode 100644 index b3f8959..0000000 --- a/test/src/test/java/org/apache/accumulo/test/RewriteTabletDirectoriesIT.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.accumulo.test; - -import static org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.ServerColumnFamily.DIRECTORY_COLUMN; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.util.Collections; -import java.util.Map.Entry; -import java.util.SortedSet; -import java.util.TreeSet; - -import org.apache.accumulo.core.client.BatchScanner; -import org.apache.accumulo.core.client.BatchWriter; -import org.apache.accumulo.core.client.Connector; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Mutation; -import org.apache.accumulo.core.data.Value; -import org.apache.accumulo.core.metadata.MetadataTable; -import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection; -import org.apache.accumulo.core.security.Authorizations; -import org.apache.accumulo.core.security.TablePermission; -import org.apache.accumulo.minicluster.impl.MiniAccumuloConfigImpl; -import org.apache.accumulo.server.init.Initialize; -import org.apache.accumulo.server.util.Admin; -import org.apache.accumulo.server.util.RandomizeVolumes; -import org.apache.accumulo.test.functional.ConfigurableMacBase; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.fs.RawLocalFileSystem; -import org.apache.hadoop.io.Text; -import org.junit.Test; - -// ACCUMULO-3263 -public class RewriteTabletDirectoriesIT extends ConfigurableMacBase { - - @Override - public int defaultTimeoutSeconds() { - return 4 * 60; - } - - private Path v1, v2; - - @Override - public void configure(MiniAccumuloConfigImpl cfg, Configuration hadoopCoreSite) { - File baseDir = cfg.getDir(); - File volDirBase = new File(baseDir, "volumes"); - File v1f = new File(volDirBase, "v1"); - File v2f = new File(volDirBase, "v2"); - v1 = new Path("file://" + v1f.getAbsolutePath()); - v2 = new Path("file://" + v2f.getAbsolutePath()); - - // Use a VolumeChooser which should be more fair - cfg.setProperty(Property.GENERAL_VOLUME_CHOOSER, FairVolumeChooser.class.getName()); - // Run MAC on two locations in the local file system - cfg.setProperty(Property.INSTANCE_VOLUMES, v1.toString()); - hadoopCoreSite.set("fs.file.impl", RawLocalFileSystem.class.getName()); - super.configure(cfg, hadoopCoreSite); - } - - @Test - public void test() throws Exception { - Connector c = getConnector(); - c.securityOperations().grantTablePermission(c.whoami(), MetadataTable.NAME, TablePermission.WRITE); - final String tableName = getUniqueNames(1)[0]; - c.tableOperations().create(tableName); - - // Write some data to a table and add some splits - BatchWriter bw = c.createBatchWriter(tableName, null); - final SortedSet<Text> splits = new TreeSet<Text>(); - for (String split : "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z".split(",")) { - splits.add(new Text(split)); - Mutation m = new Mutation(new Text(split)); - m.put(new byte[] {}, new byte[] {}, new byte[] {}); - bw.addMutation(m); - } - bw.close(); - c.tableOperations().addSplits(tableName, splits); - - BatchScanner scanner = c.createBatchScanner(MetadataTable.NAME, Authorizations.EMPTY, 1); - DIRECTORY_COLUMN.fetch(scanner); - String tableId = c.tableOperations().tableIdMap().get(tableName); - assertNotNull("TableID for " + tableName + " was null", tableId); - scanner.setRanges(Collections.singletonList(TabletsSection.getRange(tableId))); - // verify the directory entries are all on v1, make a few entries relative - bw = c.createBatchWriter(MetadataTable.NAME, null); - int count = 0; - for (Entry<Key,Value> entry : scanner) { - assertTrue("Expected " + entry.getValue() + " to contain " + v1, entry.getValue().toString().contains(v1.toString())); - count++; - if (count % 2 == 0) { - String parts[] = entry.getValue().toString().split("/"); - Key key = entry.getKey(); - Mutation m = new Mutation(key.getRow()); - m.put(key.getColumnFamily(), key.getColumnQualifier(), new Value((Path.SEPARATOR + parts[parts.length - 1]).getBytes())); - bw.addMutation(m); - } - } - bw.close(); - assertEquals(splits.size() + 1, count); - - // This should fail: only one volume - assertEquals(1, cluster.exec(RandomizeVolumes.class, "-z", cluster.getZooKeepers(), "-i", c.getInstance().getInstanceName(), "-t", tableName).waitFor()); - - cluster.stop(); - - // add the 2nd volume - Configuration conf = new Configuration(false); - conf.addResource(new Path(cluster.getConfig().getConfDir().toURI().toString(), "accumulo-site.xml")); - conf.set(Property.INSTANCE_VOLUMES.getKey(), v1.toString() + "," + v2.toString()); - BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(new File(cluster.getConfig().getConfDir(), "accumulo-site.xml"))); - conf.writeXml(fos); - fos.close(); - - // initialize volume - assertEquals(0, cluster.exec(Initialize.class, "--add-volumes").waitFor()); - cluster.start(); - c = getConnector(); - - // change the directory entries - assertEquals(0, cluster.exec(Admin.class, "randomizeVolumes", "-t", tableName).waitFor()); - - // verify a more equal sharing - int v1Count = 0, v2Count = 0; - for (Entry<Key,Value> entry : scanner) { - if (entry.getValue().toString().contains(v1.toString())) { - v1Count++; - } - if (entry.getValue().toString().contains(v2.toString())) { - v2Count++; - } - } - - log.info("Count for volume1: " + v1Count); - log.info("Count for volume2: " + v2Count); - - assertEquals(splits.size() + 1, v1Count + v2Count); - // a fair chooser will differ by less than count(volumes) - assertTrue("Expected the number of files to differ between volumes by less than 10. " + v1Count + " " + v2Count, Math.abs(v1Count - v2Count) < 2); - // verify we can read the old data - count = 0; - for (Entry<Key,Value> entry : c.createScanner(tableName, Authorizations.EMPTY)) { - assertTrue("Found unexpected entry in table: " + entry, splits.contains(entry.getKey().getRow())); - count++; - } - assertEquals(splits.size(), count); - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/01ae5b85/test/src/test/java/org/apache/accumulo/test/ScanIteratorIT.java ---------------------------------------------------------------------- diff --git a/test/src/test/java/org/apache/accumulo/test/ScanIteratorIT.java b/test/src/test/java/org/apache/accumulo/test/ScanIteratorIT.java deleted file mode 100644 index 00ac235..0000000 --- a/test/src/test/java/org/apache/accumulo/test/ScanIteratorIT.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.accumulo.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Collections; -import java.util.Map; - -import org.apache.accumulo.cluster.ClusterUser; -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.BatchScanner; -import org.apache.accumulo.core.client.BatchWriter; -import org.apache.accumulo.core.client.BatchWriterConfig; -import org.apache.accumulo.core.client.ClientConfiguration; -import org.apache.accumulo.core.client.ClientConfiguration.ClientProperty; -import org.apache.accumulo.core.client.Connector; -import org.apache.accumulo.core.client.IteratorSetting; -import org.apache.accumulo.core.client.MutationsRejectedException; -import org.apache.accumulo.core.client.Scanner; -import org.apache.accumulo.core.client.ScannerBase; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.client.security.tokens.PasswordToken; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Mutation; -import org.apache.accumulo.core.data.Range; -import org.apache.accumulo.core.data.Value; -import org.apache.accumulo.core.security.Authorizations; -import org.apache.accumulo.core.security.TablePermission; -import org.apache.accumulo.harness.AccumuloClusterHarness; -import org.apache.accumulo.minicluster.impl.MiniAccumuloConfigImpl; -import org.apache.accumulo.test.functional.AuthsIterator; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.io.Text; -import org.apache.hadoop.security.UserGroupInformation; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ScanIteratorIT extends AccumuloClusterHarness { - private static final Logger log = LoggerFactory.getLogger(ScanIteratorIT.class); - - @Override - public void configureMiniCluster(MiniAccumuloConfigImpl cfg, Configuration hadoopCoreSite) { - cfg.setNumTservers(1); - } - - @Override - protected int defaultTimeoutSeconds() { - return 60; - } - - private Connector connector; - private String tableName; - private String user; - private boolean saslEnabled; - - @Before - public void setup() throws Exception { - connector = getConnector(); - tableName = getUniqueNames(1)[0]; - - connector.tableOperations().create(tableName); - ClientConfiguration clientConfig = cluster.getClientConfig(); - ClusterUser clusterUser = getUser(0); - user = clusterUser.getPrincipal(); - PasswordToken userToken; - if (clientConfig.getBoolean(ClientProperty.INSTANCE_RPC_SASL_ENABLED.getKey(), false)) { - userToken = null; - saslEnabled = true; - } else { - userToken = new PasswordToken(clusterUser.getPassword()); - saslEnabled = false; - } - if (connector.securityOperations().listLocalUsers().contains(user)) { - log.info("Dropping {}", user); - connector.securityOperations().dropLocalUser(user); - } - connector.securityOperations().createLocalUser(user, userToken); - connector.securityOperations().grantTablePermission(user, tableName, TablePermission.READ); - connector.securityOperations().grantTablePermission(user, tableName, TablePermission.WRITE); - connector.securityOperations().changeUserAuthorizations(user, AuthsIterator.AUTHS); - } - - @After - public void tearDown() throws Exception { - if (null != user) { - if (saslEnabled) { - ClusterUser rootUser = getAdminUser(); - UserGroupInformation.loginUserFromKeytab(rootUser.getPrincipal(), rootUser.getKeytab().getAbsolutePath()); - } - connector.securityOperations().dropLocalUser(user); - } - } - - @Test - public void testAuthsPresentInIteratorEnvironment() throws Exception { - runTest(AuthsIterator.AUTHS, false); - } - - @Test - public void testAuthsNotPresentInIteratorEnvironment() throws Exception { - runTest(new Authorizations("B"), true); - } - - @Test - public void testEmptyAuthsInIteratorEnvironment() throws Exception { - runTest(Authorizations.EMPTY, true); - } - - private void runTest(ScannerBase scanner, Authorizations auths, boolean shouldFail) throws AccumuloSecurityException, AccumuloException, - TableNotFoundException { - int count = 0; - for (Map.Entry<Key,Value> entry : scanner) { - assertEquals(shouldFail ? AuthsIterator.FAIL : AuthsIterator.SUCCESS, entry.getKey().getRow().toString()); - count++; - } - - assertEquals(1, count); - } - - private void runTest(Authorizations auths, boolean shouldFail) throws Exception { - ClusterUser clusterUser = getUser(0); - Connector userC = getCluster().getConnector(clusterUser.getPrincipal(), clusterUser.getToken()); - writeTestMutation(userC); - - IteratorSetting setting = new IteratorSetting(10, AuthsIterator.class); - - Scanner scanner = userC.createScanner(tableName, auths); - scanner.addScanIterator(setting); - - BatchScanner batchScanner = userC.createBatchScanner(tableName, auths, 1); - batchScanner.setRanges(Collections.singleton(new Range("1"))); - batchScanner.addScanIterator(setting); - - runTest(scanner, auths, shouldFail); - runTest(batchScanner, auths, shouldFail); - - scanner.close(); - batchScanner.close(); - } - - private void writeTestMutation(Connector userC) throws TableNotFoundException, MutationsRejectedException { - BatchWriter batchWriter = userC.createBatchWriter(tableName, new BatchWriterConfig()); - Mutation m = new Mutation("1"); - m.put(new Text("2"), new Text("3"), new Value("".getBytes())); - batchWriter.addMutation(m); - batchWriter.flush(); - batchWriter.close(); - - } - -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/01ae5b85/test/src/test/java/org/apache/accumulo/test/ShellConfigIT.java ---------------------------------------------------------------------- diff --git a/test/src/test/java/org/apache/accumulo/test/ShellConfigIT.java b/test/src/test/java/org/apache/accumulo/test/ShellConfigIT.java deleted file mode 100644 index 4f83668..0000000 --- a/test/src/test/java/org/apache/accumulo/test/ShellConfigIT.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.accumulo.test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.nio.charset.StandardCharsets; - -import org.apache.accumulo.core.client.Connector; -import org.apache.accumulo.core.client.security.tokens.AuthenticationToken; -import org.apache.accumulo.core.client.security.tokens.KerberosToken; -import org.apache.accumulo.core.client.security.tokens.PasswordToken; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.harness.AccumuloClusterHarness; -import org.apache.accumulo.harness.conf.StandaloneAccumuloClusterConfiguration; -import org.apache.accumulo.minicluster.impl.MiniAccumuloClusterImpl; -import org.apache.accumulo.test.ShellServerIT.TestShell; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class ShellConfigIT extends AccumuloClusterHarness { - @Override - public int defaultTimeoutSeconds() { - return 30; - } - - private String origPropValue; - - @Before - public void checkProperty() throws Exception { - Connector conn = getConnector(); - // TABLE_VOLUME_CHOOSER is a valid property that can be updated in ZK, whereas the crypto properties are not. - // This lets us run this test more generically rather than forcibly needing to update some property in accumulo-site.xml - origPropValue = conn.instanceOperations().getSystemConfiguration().get(Property.TABLE_VOLUME_CHOOSER.getKey()); - conn.instanceOperations().setProperty(Property.TABLE_VOLUME_CHOOSER.getKey(), FairVolumeChooser.class.getName()); - } - - @After - public void resetProperty() throws Exception { - if (null != origPropValue) { - Connector conn = getConnector(); - conn.instanceOperations().setProperty(Property.TABLE_VOLUME_CHOOSER.getKey(), origPropValue); - } - } - - @Test - public void experimentalPropTest() throws Exception { - // ensure experimental props do not show up in config output unless set - - AuthenticationToken token = getAdminToken(); - File clientConfFile = null; - switch (getClusterType()) { - case MINI: - MiniAccumuloClusterImpl mac = (MiniAccumuloClusterImpl) getCluster(); - clientConfFile = mac.getConfig().getClientConfFile(); - break; - case STANDALONE: - StandaloneAccumuloClusterConfiguration standaloneConf = (StandaloneAccumuloClusterConfiguration) getClusterConfiguration(); - clientConfFile = standaloneConf.getClientConfFile(); - break; - default: - Assert.fail("Unknown cluster type"); - } - - Assert.assertNotNull(clientConfFile); - - TestShell ts = null; - if (token instanceof PasswordToken) { - String passwd = new String(((PasswordToken) token).getPassword(), StandardCharsets.UTF_8); - ts = new TestShell(getAdminPrincipal(), passwd, getCluster().getInstanceName(), getCluster().getZooKeepers(), clientConfFile); - } else if (token instanceof KerberosToken) { - ts = new TestShell(getAdminPrincipal(), null, getCluster().getInstanceName(), getCluster().getZooKeepers(), clientConfFile); - } else { - Assert.fail("Unknown token type"); - } - - assertTrue(Property.TABLE_VOLUME_CHOOSER.isExperimental()); - assertTrue(Property.CRYPTO_CIPHER_ALGORITHM_NAME.isExperimental()); - - String configOutput = ts.exec("config"); - - assertTrue(configOutput.contains(Property.TABLE_VOLUME_CHOOSER.getKey())); - assertFalse(configOutput.contains(Property.CRYPTO_CIPHER_ALGORITHM_NAME.getKey())); - } -}