use of org.apache.accumulo.core.security.Authorizations in project accumulo by apache.
the class ConditionalWriterIT method testBatch.
@Test
public void testBatch() throws Exception {
try (AccumuloClient client = Accumulo.newClient().from(getClientProps()).build()) {
String tableName = getUniqueNames(1)[0];
client.tableOperations().create(tableName);
client.securityOperations().changeUserAuthorizations(getAdminPrincipal(), new Authorizations("A", "B"));
ColumnVisibility cvab = new ColumnVisibility("A|B");
ArrayList<ConditionalMutation> mutations = new ArrayList<>();
ConditionalMutation cm0 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cvab));
cm0.put("name", "last", cvab, "doe");
cm0.put("name", "first", cvab, "john");
cm0.put("tx", "seq", cvab, "1");
mutations.add(cm0);
ConditionalMutation cm1 = new ConditionalMutation("59056", new Condition("tx", "seq").setVisibility(cvab));
cm1.put("name", "last", cvab, "doe");
cm1.put("name", "first", cvab, "jane");
cm1.put("tx", "seq", cvab, "1");
mutations.add(cm1);
ConditionalMutation cm2 = new ConditionalMutation("19059", new Condition("tx", "seq").setVisibility(cvab));
cm2.put("name", "last", cvab, "doe");
cm2.put("name", "first", cvab, "jack");
cm2.put("tx", "seq", cvab, "1");
mutations.add(cm2);
try (ConditionalWriter cw = client.createConditionalWriter(tableName, new ConditionalWriterConfig().setAuthorizations(new Authorizations("A")));
Scanner scanner = client.createScanner(tableName, new Authorizations("A"))) {
Iterator<Result> results = cw.write(mutations.iterator());
int count = 0;
while (results.hasNext()) {
Result result = results.next();
assertEquals(Status.ACCEPTED, result.getStatus());
count++;
}
assertEquals(3, count);
scanner.fetchColumn("tx", "seq");
for (String row : new String[] { "99006", "59056", "19059" }) {
scanner.setRange(new Range(row));
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
assertEquals("1", entry.getValue().toString());
}
TreeSet<Text> splits = new TreeSet<>();
splits.add(new Text("7"));
splits.add(new Text("3"));
client.tableOperations().addSplits(tableName, splits);
mutations.clear();
ConditionalMutation cm3 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cvab).setValue("1"));
cm3.put("name", "last", cvab, "Doe");
cm3.put("tx", "seq", cvab, "2");
mutations.add(cm3);
ConditionalMutation cm4 = new ConditionalMutation("59056", new Condition("tx", "seq").setVisibility(cvab));
cm4.put("name", "last", cvab, "Doe");
cm4.put("tx", "seq", cvab, "1");
mutations.add(cm4);
ConditionalMutation cm5 = new ConditionalMutation("19059", new Condition("tx", "seq").setVisibility(cvab).setValue("2"));
cm5.put("name", "last", cvab, "Doe");
cm5.put("tx", "seq", cvab, "3");
mutations.add(cm5);
results = cw.write(mutations.iterator());
int accepted = 0;
int rejected = 0;
while (results.hasNext()) {
Result result = results.next();
if (new String(result.getMutation().getRow()).equals("99006")) {
assertEquals(Status.ACCEPTED, result.getStatus());
accepted++;
} else {
assertEquals(Status.REJECTED, result.getStatus());
rejected++;
}
}
assertEquals("Expected only one accepted conditional mutation", 1, accepted);
assertEquals("Expected two rejected conditional mutations", 2, rejected);
for (String row : new String[] { "59056", "19059" }) {
scanner.setRange(new Range(row));
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
assertEquals("1", entry.getValue().toString());
}
scanner.setRange(new Range("99006"));
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
assertEquals("2", entry.getValue().toString());
scanner.clearColumns();
scanner.fetchColumn("name", "last");
entry = Iterables.getOnlyElement(scanner);
assertEquals("Doe", entry.getValue().toString());
}
}
}
use of org.apache.accumulo.core.security.Authorizations in project accumulo by apache.
the class ConditionalWriterIT method testFields.
@Test
public void testFields() throws Exception {
try (AccumuloClient client1 = Accumulo.newClient().from(getClientProps()).build()) {
String tableName = getUniqueNames(1)[0];
ClusterUser user1 = getUser(0);
String user = user1.getPrincipal();
if (saslEnabled()) {
// The token is pointless for kerberos
client1.securityOperations().createLocalUser(user, null);
} else {
client1.securityOperations().createLocalUser(user, new PasswordToken(user1.getPassword()));
}
Authorizations auths = new Authorizations("A", "B");
client1.securityOperations().changeUserAuthorizations(user, auths);
client1.securityOperations().grantSystemPermission(user, SystemPermission.CREATE_TABLE);
try (AccumuloClient client2 = Accumulo.newClient().from(client1.properties()).as(user, user1.getToken()).build()) {
client2.tableOperations().create(tableName);
try (ConditionalWriter cw = client2.createConditionalWriter(tableName, new ConditionalWriterConfig().setAuthorizations(auths));
Scanner scanner = client2.createScanner(tableName, auths)) {
ColumnVisibility cva = new ColumnVisibility("A");
ColumnVisibility cvb = new ColumnVisibility("B");
ConditionalMutation cm0 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cva));
cm0.put("name", "last", cva, "doe");
cm0.put("name", "first", cva, "john");
cm0.put("tx", "seq", cva, "1");
assertEquals(Status.ACCEPTED, cw.write(cm0).getStatus());
scanner.setRange(new Range("99006"));
// TODO verify all columns
scanner.fetchColumn("tx", "seq");
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
assertEquals("1", entry.getValue().toString());
long ts = entry.getKey().getTimestamp();
// test wrong colf
ConditionalMutation cm1 = new ConditionalMutation("99006", new Condition("txA", "seq").setVisibility(cva).setValue("1"));
cm1.put("name", "last", cva, "Doe");
cm1.put("name", "first", cva, "John");
cm1.put("tx", "seq", cva, "2");
assertEquals(Status.REJECTED, cw.write(cm1).getStatus());
// test wrong colq
ConditionalMutation cm2 = new ConditionalMutation("99006", new Condition("tx", "seqA").setVisibility(cva).setValue("1"));
cm2.put("name", "last", cva, "Doe");
cm2.put("name", "first", cva, "John");
cm2.put("tx", "seq", cva, "2");
assertEquals(Status.REJECTED, cw.write(cm2).getStatus());
// test wrong colv
ConditionalMutation cm3 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cvb).setValue("1"));
cm3.put("name", "last", cva, "Doe");
cm3.put("name", "first", cva, "John");
cm3.put("tx", "seq", cva, "2");
assertEquals(Status.REJECTED, cw.write(cm3).getStatus());
// test wrong timestamp
ConditionalMutation cm4 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cva).setTimestamp(ts + 1).setValue("1"));
cm4.put("name", "last", cva, "Doe");
cm4.put("name", "first", cva, "John");
cm4.put("tx", "seq", cva, "2");
assertEquals(Status.REJECTED, cw.write(cm4).getStatus());
// test wrong timestamp
ConditionalMutation cm5 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cva).setTimestamp(ts - 1).setValue("1"));
cm5.put("name", "last", cva, "Doe");
cm5.put("name", "first", cva, "John");
cm5.put("tx", "seq", cva, "2");
assertEquals(Status.REJECTED, cw.write(cm5).getStatus());
// ensure no updates were made
entry = Iterables.getOnlyElement(scanner);
assertEquals("1", entry.getValue().toString());
// set all columns correctly
ConditionalMutation cm6 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cva).setTimestamp(ts).setValue("1"));
cm6.put("name", "last", cva, "Doe");
cm6.put("name", "first", cva, "John");
cm6.put("tx", "seq", cva, "2");
assertEquals(Status.ACCEPTED, cw.write(cm6).getStatus());
entry = Iterables.getOnlyElement(scanner);
assertEquals("2", entry.getValue().toString());
}
}
}
}
use of org.apache.accumulo.core.security.Authorizations in project accumulo by apache.
the class ConditionalWriterIT method testTableAndConditionIterators.
@Test
public void testTableAndConditionIterators() throws Exception {
// test w/ table that has iterators configured
try (AccumuloClient client = Accumulo.newClient().from(getClientProps()).build()) {
String tableName = getUniqueNames(1)[0];
IteratorSetting aiConfig1 = new IteratorSetting(30, "AI1", AddingIterator.class);
aiConfig1.addOption("amount", "2");
IteratorSetting aiConfig2 = new IteratorSetting(35, "MI1", MultiplyingIterator.class);
aiConfig2.addOption("amount", "3");
IteratorSetting aiConfig3 = new IteratorSetting(40, "AI2", AddingIterator.class);
aiConfig3.addOption("amount", "5");
client.tableOperations().create(tableName);
try (BatchWriter bw = client.createBatchWriter(tableName)) {
Mutation m = new Mutation("ACCUMULO-1000");
m.put("count", "comments", "6");
bw.addMutation(m);
m = new Mutation("ACCUMULO-1001");
m.put("count", "comments", "7");
bw.addMutation(m);
m = new Mutation("ACCUMULO-1002");
m.put("count", "comments", "8");
bw.addMutation(m);
}
client.tableOperations().attachIterator(tableName, aiConfig1, EnumSet.of(IteratorScope.scan));
client.tableOperations().offline(tableName, true);
client.tableOperations().online(tableName, true);
try (ConditionalWriter cw = client.createConditionalWriter(tableName);
Scanner scanner = client.createScanner(tableName, new Authorizations())) {
ConditionalMutation cm6 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setValue("8"));
cm6.put("count", "comments", "7");
assertEquals(Status.ACCEPTED, cw.write(cm6).getStatus());
scanner.setRange(new Range("ACCUMULO-1000"));
scanner.fetchColumn("count", "comments");
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
assertEquals("9", entry.getValue().toString());
ConditionalMutation cm7 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(aiConfig2).setValue("27"));
cm7.put("count", "comments", "8");
assertEquals(Status.ACCEPTED, cw.write(cm7).getStatus());
entry = Iterables.getOnlyElement(scanner);
assertEquals("10", entry.getValue().toString());
ConditionalMutation cm8 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(aiConfig2, aiConfig3).setValue("35"));
cm8.put("count", "comments", "9");
assertEquals(Status.ACCEPTED, cw.write(cm8).getStatus());
entry = Iterables.getOnlyElement(scanner);
assertEquals("11", entry.getValue().toString());
ConditionalMutation cm3 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(aiConfig2).setValue("33"));
cm3.put("count", "comments", "3");
ConditionalMutation cm4 = new ConditionalMutation("ACCUMULO-1001", new Condition("count", "comments").setIterators(aiConfig3).setValue("14"));
cm4.put("count", "comments", "3");
ConditionalMutation cm5 = new ConditionalMutation("ACCUMULO-1002", new Condition("count", "comments").setIterators(aiConfig3).setValue("10"));
cm5.put("count", "comments", "3");
Iterator<Result> results = cw.write(Arrays.asList(cm3, cm4, cm5).iterator());
Map<String, Status> actual = new HashMap<>();
while (results.hasNext()) {
Result result = results.next();
String k = new String(result.getMutation().getRow());
assertFalse("Did not expect to see multiple results for the row: " + k, actual.containsKey(k));
actual.put(k, result.getStatus());
}
Map<String, Status> expected = new HashMap<>();
expected.put("ACCUMULO-1000", Status.ACCEPTED);
expected.put("ACCUMULO-1001", Status.ACCEPTED);
expected.put("ACCUMULO-1002", Status.REJECTED);
assertEquals(expected, actual);
}
}
}
use of org.apache.accumulo.core.security.Authorizations in project accumulo by apache.
the class ConditionalWriterIT method testIterators.
@Test
public void testIterators() throws Exception {
try (AccumuloClient client = Accumulo.newClient().from(getClientProps()).build()) {
String tableName = getUniqueNames(1)[0];
client.tableOperations().create(tableName, new NewTableConfiguration().withoutDefaultIterators());
try (BatchWriter bw = client.createBatchWriter(tableName)) {
Mutation m = new Mutation("ACCUMULO-1000");
m.put("count", "comments", "1");
bw.addMutation(m);
bw.addMutation(m);
bw.addMutation(m);
m = new Mutation("ACCUMULO-1001");
m.put("count2", "comments", "1");
bw.addMutation(m);
bw.addMutation(m);
m = new Mutation("ACCUMULO-1002");
m.put("count2", "comments", "1");
bw.addMutation(m);
bw.addMutation(m);
}
IteratorSetting iterConfig = new IteratorSetting(10, SummingCombiner.class);
SummingCombiner.setEncodingType(iterConfig, Type.STRING);
SummingCombiner.setColumns(iterConfig, Collections.singletonList(new IteratorSetting.Column("count")));
IteratorSetting iterConfig2 = new IteratorSetting(10, SummingCombiner.class);
SummingCombiner.setEncodingType(iterConfig2, Type.STRING);
SummingCombiner.setColumns(iterConfig2, Collections.singletonList(new IteratorSetting.Column("count2", "comments")));
IteratorSetting iterConfig3 = new IteratorSetting(5, VersioningIterator.class);
VersioningIterator.setMaxVersions(iterConfig3, 1);
try (Scanner scanner = client.createScanner(tableName, new Authorizations())) {
scanner.addScanIterator(iterConfig);
scanner.setRange(new Range("ACCUMULO-1000"));
scanner.fetchColumn("count", "comments");
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
assertEquals("3", entry.getValue().toString());
try (ConditionalWriter cw = client.createConditionalWriter(tableName)) {
ConditionalMutation cm0 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setValue("3"));
cm0.put("count", "comments", "1");
assertEquals(Status.REJECTED, cw.write(cm0).getStatus());
entry = Iterables.getOnlyElement(scanner);
assertEquals("3", entry.getValue().toString());
ConditionalMutation cm1 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(iterConfig).setValue("3"));
cm1.put("count", "comments", "1");
assertEquals(Status.ACCEPTED, cw.write(cm1).getStatus());
entry = Iterables.getOnlyElement(scanner);
assertEquals("4", entry.getValue().toString());
ConditionalMutation cm2 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setValue("4"));
cm2.put("count", "comments", "1");
assertEquals(Status.REJECTED, cw.write(cm1).getStatus());
entry = Iterables.getOnlyElement(scanner);
assertEquals("4", entry.getValue().toString());
// run test with multiple iterators passed in same batch and condition with two iterators
ConditionalMutation cm3 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(iterConfig).setValue("4"));
cm3.put("count", "comments", "1");
ConditionalMutation cm4 = new ConditionalMutation("ACCUMULO-1001", new Condition("count2", "comments").setIterators(iterConfig2).setValue("2"));
cm4.put("count2", "comments", "1");
ConditionalMutation cm5 = new ConditionalMutation("ACCUMULO-1002", new Condition("count2", "comments").setIterators(iterConfig2, iterConfig3).setValue("2"));
cm5.put("count2", "comments", "1");
Iterator<Result> results = cw.write(Arrays.asList(cm3, cm4, cm5).iterator());
Map<String, Status> actual = new HashMap<>();
while (results.hasNext()) {
Result result = results.next();
String k = new String(result.getMutation().getRow());
assertFalse("Did not expect to see multiple results for the row: " + k, actual.containsKey(k));
actual.put(k, result.getStatus());
}
Map<String, Status> expected = new HashMap<>();
expected.put("ACCUMULO-1000", Status.ACCEPTED);
expected.put("ACCUMULO-1001", Status.ACCEPTED);
expected.put("ACCUMULO-1002", Status.REJECTED);
assertEquals(expected, actual);
}
}
}
}
use of org.apache.accumulo.core.security.Authorizations in project accumulo by apache.
the class MultiTableBatchWriterIT method testTableRenameNewWriters.
@Test
public void testTableRenameNewWriters() throws Exception {
try {
final String[] names = getUniqueNames(4);
final String table1 = names[0], table2 = names[1];
final String newTable1 = names[2], newTable2 = names[3];
TableOperations tops = accumuloClient.tableOperations();
tops.create(table1);
tops.create(table2);
BatchWriter bw1 = mtbw.getBatchWriter(table1), bw2 = mtbw.getBatchWriter(table2);
Mutation m1 = new Mutation("foo");
m1.put("col1", "", "val1");
m1.put("col2", "", "val2");
bw1.addMutation(m1);
bw2.addMutation(m1);
tops.rename(table1, newTable1);
// MTBW is still caching this name to the correct table, but we should invalidate its cache
// after seeing the rename
assertThrows("Should not be able to find this table", TableNotFoundException.class, () -> mtbw.getBatchWriter(table1));
tops.rename(table2, newTable2);
assertThrows("Should not be able to find this table", TableNotFoundException.class, () -> mtbw.getBatchWriter(table2));
bw1 = mtbw.getBatchWriter(newTable1);
bw2 = mtbw.getBatchWriter(newTable2);
Mutation m2 = new Mutation("bar");
m2.put("col1", "", "val1");
m2.put("col2", "", "val2");
bw1.addMutation(m2);
bw2.addMutation(m2);
mtbw.close();
Map<Entry<String, String>, String> expectations = new HashMap<>();
expectations.put(Maps.immutableEntry("foo", "col1"), "val1");
expectations.put(Maps.immutableEntry("foo", "col2"), "val2");
expectations.put(Maps.immutableEntry("bar", "col1"), "val1");
expectations.put(Maps.immutableEntry("bar", "col2"), "val2");
for (String table : Arrays.asList(newTable1, newTable2)) {
try (Scanner s = accumuloClient.createScanner(table, new Authorizations())) {
s.setRange(new Range());
Map<Entry<String, String>, String> actual = new HashMap<>();
for (Entry<Key, Value> entry : s) {
actual.put(Maps.immutableEntry(entry.getKey().getRow().toString(), entry.getKey().getColumnFamily().toString()), entry.getValue().toString());
}
assertEquals("Differing results for " + table, expectations, actual);
}
}
} finally {
if (mtbw != null) {
mtbw.close();
}
}
}
Aggregations