use of io.cdap.cdap.spi.metadata.MetadataMutation.Create in project cdap by caskdata.
the class MetadataStorageTest method testAsyncMutations.
@Test
public void testAsyncMutations() throws Exception {
MetadataStorage mds = getMetadataStorage();
MetadataEntity entity = ofDataset(DEFAULT_NAMESPACE, "entity");
// get metadata for non-existing entity
verifyMetadataAsync(mds, entity, Metadata.EMPTY);
// drop metadata for non-existing entity succeeds
MetadataChange change = mds.apply(new Drop(entity), ASYNC);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, Metadata.EMPTY), change);
verifyMetadataAsync(mds, entity, Metadata.EMPTY);
// remove metadata for non-existing entity succeeds
mds.apply(new Remove(entity, ImmutableSet.of(new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), new ScopedNameOfKind(MetadataKind.TAG, USER, "ut1"), new ScopedNameOfKind(PROPERTY, SYSTEM, "sp2"), new ScopedNameOfKind(PROPERTY, USER, "up2"))), ASYNC);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, Metadata.EMPTY), change);
verifyMetadataAsync(mds, entity, Metadata.EMPTY);
// update metadata for non-existing entity creates it
Metadata metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "a"), new ScopedName(USER, "b")), ImmutableMap.of(new ScopedName(SYSTEM, "p"), "v", new ScopedName(USER, "k"), "v1"));
change = mds.apply(new Update(entity, metadata), ASYNC);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, metadata), change);
verifyMetadataAsync(mds, entity, metadata);
// test that update is idempotent
change = mds.apply(new Update(entity, metadata), ASYNC);
Assert.assertEquals(new MetadataChange(entity, metadata, metadata), change);
verifyMetadataAsync(mds, entity, metadata);
// create metadata replaces existing metadata
Metadata previousMetadata = metadata;
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(USER, "ut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "sv1", new ScopedName(SYSTEM, "sp2"), "sv2", new ScopedName(USER, "up1"), "uv1", new ScopedName(USER, "up2"), "uv2"));
MetadataMutation create = new Create(entity, metadata, Collections.emptyMap());
change = mds.apply(create, ASYNC);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
// verify the metadata with variations of scope and kind
verifyMetadataAsync(mds, entity, metadata);
// verify the metadata with a select subset of tags and properties
verifyMetadataSelectionAsync(mds, entity, metadata, ImmutableSet.of(new ScopedNameOfKind(PROPERTY, SYSTEM, "sp1"), new ScopedNameOfKind(PROPERTY, SYSTEM, "nosuch"), new ScopedNameOfKind(PROPERTY, USER, "up2"), new ScopedNameOfKind(PROPERTY, USER, "nosuch"), new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "nosuch"), new ScopedNameOfKind(MetadataKind.TAG, USER, "ut1"), new ScopedNameOfKind(MetadataKind.TAG, USER, "nosuch")));
// verify that a non-matching set tags and properties returns empty metadata
verifyMetadataSelectionAsync(mds, entity, metadata, ImmutableSet.of(new ScopedNameOfKind(PROPERTY, SYSTEM, "nosuch"), new ScopedNameOfKind(MetadataKind.TAG, USER, "nosuch")));
// replace the system metadata with directives, user metadata should remain unchanged
Metadata recreatedMetadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "nst0")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(SYSTEM, "nsp0"), "sv0"));
MetadataMutation recreate = new Create(entity, recreatedMetadata, ImmutableMap.of(new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), MetadataDirective.KEEP, new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st2"), MetadataDirective.PRESERVE, new ScopedNameOfKind(PROPERTY, SYSTEM, "sp1"), MetadataDirective.PRESERVE, new ScopedNameOfKind(PROPERTY, SYSTEM, "sp2"), MetadataDirective.KEEP));
previousMetadata = metadata;
// this is the new metadata according to directives
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(SYSTEM, "nst0"), new ScopedName(USER, "ut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "sv1", new ScopedName(SYSTEM, "sp2"), "sv2", new ScopedName(SYSTEM, "nsp0"), "sv0", new ScopedName(USER, "up1"), "uv1", new ScopedName(USER, "up2"), "uv2"));
change = mds.apply(recreate, ASYNC);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
verifyMetadataAsync(mds, entity, metadata);
// replace the metadata with directives
recreatedMetadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "nst1"), new ScopedName(USER, "nut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(SYSTEM, "nsp2"), "sv2", new ScopedName(USER, "up3"), "uv3"));
recreate = new Create(entity, recreatedMetadata, ImmutableMap.of(new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), MetadataDirective.KEEP, new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st2"), MetadataDirective.PRESERVE, new ScopedNameOfKind(PROPERTY, SYSTEM, "sp1"), MetadataDirective.PRESERVE, new ScopedNameOfKind(PROPERTY, SYSTEM, "sp2"), MetadataDirective.KEEP, new ScopedNameOfKind(PROPERTY, USER, "up2"), MetadataDirective.PRESERVE));
previousMetadata = metadata;
// this is the new metadata according to directives
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(SYSTEM, "nst1"), new ScopedName(USER, "nut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "sv1", new ScopedName(SYSTEM, "sp2"), "sv2", new ScopedName(SYSTEM, "nsp2"), "sv2", new ScopedName(USER, "up2"), "uv2", new ScopedName(USER, "up3"), "uv3"));
change = mds.apply(recreate, ASYNC);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
verifyMetadataAsync(mds, entity, metadata);
// update some tags and properties
MetadataMutation update = new Update(entity, new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "ast1"), new ScopedName(USER, "aut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(SYSTEM, "nsp2"), "nsv2", new ScopedName(USER, "up2"), "nuv2", new ScopedName(USER, "up3"), "uv3")));
// verify new metadata after update
previousMetadata = metadata;
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "ast1"), new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(SYSTEM, "nst1"), new ScopedName(USER, "aut1"), new ScopedName(USER, "nut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(SYSTEM, "sp2"), "sv2", new ScopedName(SYSTEM, "nsp2"), "nsv2", new ScopedName(USER, "up2"), "nuv2", new ScopedName(USER, "up3"), "uv3"));
change = mds.apply(update, ASYNC);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
verifyMetadataAsync(mds, entity, metadata);
// test that update is idempotent
change = mds.apply(update, ASYNC);
Assert.assertEquals(new MetadataChange(entity, metadata, metadata), change);
verifyMetadataAsync(mds, entity, metadata);
// remove some tags and properties
MetadataMutation remove = new Remove(entity, ImmutableSet.of(new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st2"), new ScopedNameOfKind(MetadataKind.TAG, USER, "nut1"), new ScopedNameOfKind(MetadataKind.TAG, USER, "nosuch"), new ScopedNameOfKind(PROPERTY, SYSTEM, "sp2"), new ScopedNameOfKind(PROPERTY, SYSTEM, "nsp2"), new ScopedNameOfKind(PROPERTY, USER, "up2")));
previousMetadata = metadata;
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "ast1"), new ScopedName(SYSTEM, "nst1"), new ScopedName(USER, "aut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(USER, "up3"), "uv3"));
change = mds.apply(remove, ASYNC);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
verifyMetadataAsync(mds, entity, metadata);
// test that remove is idemtpotent
change = mds.apply(remove, ASYNC);
Assert.assertEquals(new MetadataChange(entity, metadata, metadata), change);
verifyMetadataAsync(mds, entity, metadata);
// drop all metadata for the entity
change = mds.apply(new Drop(entity), ASYNC);
Assert.assertEquals(new MetadataChange(entity, metadata, Metadata.EMPTY), change);
verifyMetadataAsync(mds, entity, Metadata.EMPTY);
// drop is idempotent
change = mds.apply(new Drop(entity), ASYNC);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, Metadata.EMPTY), change);
verifyMetadataAsync(mds, entity, Metadata.EMPTY);
}
use of io.cdap.cdap.spi.metadata.MetadataMutation.Create in project cdap by caskdata.
the class MetadataStorageTest method testSortedSearchAndPagination.
@Test
public void testSortedSearchAndPagination() throws IOException {
MetadataStorage mds = getMetadataStorage();
// create 10 unique random entity ids with random creation times
NoDupRandom random = new NoDupRandom();
List<MetadataEntity> entities = new ArrayList<>();
for (int i = 0; i < 10; i++) {
entities.add(ofDataset("myns", "ds" + String.valueOf(random.nextInt(1000))));
}
long creationTime = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(60);
List<MetadataRecord> records = entities.stream().map(entity -> new MetadataRecord(entity, new Metadata(SYSTEM, props(MetadataConstants.CREATION_TIME_KEY, String.valueOf(creationTime + random.nextInt(1000000)), MetadataConstants.ENTITY_NAME_KEY, entity.getValue(entity.getType()))))).collect(Collectors.toList());
// index all entities
mds.batch(records.stream().map(record -> new MetadataMutation.Update(record.getEntity(), record.getMetadata())).collect(Collectors.toList()), MutationOptions.DEFAULT);
testSortedSearch(mds, records, ENTITY_NAME_KEY);
testSortedSearch(mds, records, CREATION_TIME_KEY);
// clean up
mds.batch(entities.stream().map(Drop::new).collect(Collectors.toList()), MutationOptions.DEFAULT);
}
use of io.cdap.cdap.spi.metadata.MetadataMutation.Create in project cdap by caskdata.
the class MetadataStorageTest method testBatchConcurrency.
@Test
public void testBatchConcurrency() throws IOException {
// T threads
int numThreads = 10;
// N entities
int numEntities = 20;
MetadataStorage mds = getMetadataStorage();
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
CompletionService<List<MetadataChange>> completionService = new ExecutorCompletionService<>(executor);
// Set up N entities with T tags (one to be removed per thread)
Set<String> allRTags = IntStream.range(0, numThreads).mapToObj(t -> "r" + t).collect(Collectors.toSet());
Map<Integer, MetadataEntity> entities = IntStream.range(0, numEntities).boxed().collect(Collectors.toMap(i -> i, i -> MetadataEntity.ofDataset("myds" + i)));
mds.batch(entities.values().stream().map(entity -> new Update(entity, new Metadata(USER, allRTags))).collect(Collectors.toList()), MutationOptions.DEFAULT);
// Generate a random but conflicting set of batches of mutations, one for each thread.
// Construct the expected results for each entity along with the mutations
// Also, because some threads will perform a Create, create a set of directives to preserve all other tags
Map<Integer, Set<String>> expected = IntStream.range(0, numEntities).boxed().collect(Collectors.toMap(i -> i, i -> new HashSet<>(allRTags)));
Map<Integer, List<MetadataMutation>> mutations = IntStream.range(0, numThreads).boxed().collect(Collectors.toMap(i -> i, i -> new ArrayList<>()));
Map<ScopedNameOfKind, MetadataDirective> directives = new HashMap<>();
Random rand = new Random(System.currentTimeMillis());
IntStream.range(0, numThreads).forEach(t -> {
directives.put(new ScopedNameOfKind(TAG, USER, "t" + t), MetadataDirective.KEEP);
directives.put(new ScopedNameOfKind(TAG, USER, "r" + t), MetadataDirective.KEEP);
directives.put(new ScopedNameOfKind(TAG, USER, "c" + t), MetadataDirective.KEEP);
IntStream.range(0, numEntities).forEach(e -> {
int random = rand.nextInt(100);
if (random < 30) {
expected.get(e).add("t" + t);
mutations.get(t).add(new Update(entities.get(e), new Metadata(USER, tags("t" + t))));
} else if (random < 60) {
expected.get(e).add("c" + t);
mutations.get(t).add(new Create(entities.get(e), new Metadata(USER, tags("c" + t)), directives));
} else if (random < 90) {
expected.get(e).remove("r" + t);
mutations.get(t).add(new Remove(entities.get(e), Collections.singleton(new ScopedNameOfKind(TAG, USER, "r" + t))));
}
});
});
// submit all tasks and wait for their completion
IntStream.range(0, numThreads).forEach(t -> completionService.submit(() -> mds.batch(mutations.get(t), MutationOptions.DEFAULT)));
IntStream.range(0, numThreads).forEach(t -> {
try {
completionService.take();
} catch (InterruptedException e) {
throw Throwables.propagate(e);
}
});
// validate that all "r" tags were removed and all "c" and "t" tags were added
IntStream.range(0, numEntities).forEach(e -> {
try {
Assert.assertEquals("For entity " + entities.get(e), expected.get(e), mds.read(new Read(entities.get(e))).getTags(USER));
} catch (Exception ex) {
throw Throwables.propagate(ex);
}
});
// clean up
mds.batch(entities.values().stream().map(Drop::new).collect(Collectors.toList()), MutationOptions.DEFAULT);
}
use of io.cdap.cdap.spi.metadata.MetadataMutation.Create in project cdap by caskdata.
the class MetadataStorageTest method testUpdateDropConflictInBatch.
/**
* See {@link #testUpdateDropConflict()} for a description. The difference in this test is that
* we issue batches of mutations over a collection of entities. The same assumptions apply,
* however, for each entity.
*/
@Test
@Category(SlowTests.class)
public void testUpdateDropConflictInBatch() throws IOException {
int numTests = 10;
int numThreads = 2;
int numEntities = 20;
MetadataStorage mds = getMetadataStorage();
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
CompletionService<List<MetadataChange>> completionService = new ExecutorCompletionService<>(executor);
Map<Integer, MetadataEntity> entities = IntStream.range(0, numEntities).boxed().collect(Collectors.toMap(i -> i, i -> MetadataEntity.ofDataset("myds" + i)));
List<MetadataMutation> creates = entities.values().stream().map(e -> new Create(e, new Metadata(USER, tags("a")), Collections.emptyMap())).collect(Collectors.toList());
Random rand = new Random(System.currentTimeMillis());
IntStream.range(0, numTests).forEach(x -> {
try {
mds.batch(creates, MutationOptions.DEFAULT);
Map<Integer, List<MetadataMutation>> mutations = IntStream.range(0, numThreads).boxed().collect(Collectors.toMap(i -> i, i -> new ArrayList<>()));
IntStream.range(0, numEntities).forEach(e -> {
// ensure that at least one thread attempts to drop this entity
int dropThread = rand.nextInt(numThreads);
IntStream.range(0, numThreads).forEach(t -> {
if (t == dropThread || rand.nextInt(100) < 50) {
mutations.get(t).add(new Drop(entities.get(e)));
} else {
mutations.get(t).add(new Update(entities.get(e), new Metadata(USER, tags("b"))));
}
});
});
IntStream.range(0, numThreads).forEach(t -> completionService.submit(() -> mds.batch(mutations.get(t), MutationOptions.DEFAULT)));
IntStream.range(0, numThreads).forEach(t -> {
try {
completionService.take();
} catch (InterruptedException e) {
throw Throwables.propagate(e);
}
});
IntStream.range(0, numEntities).forEach(e -> {
try {
// each entity is either dropped then updated (and then it has tag "b" only)
// or it first update and then dropped (and then it has empty metadata)
Assert.assertTrue(ImmutableSet.of(Metadata.EMPTY, new Metadata(USER, tags("b"))).contains(mds.read(new Read(entities.get(e)))));
} catch (Exception ex) {
throw Throwables.propagate(ex);
}
});
} catch (Exception e) {
throw Throwables.propagate(e);
}
});
mds.batch(entities.values().stream().map(Drop::new).collect(Collectors.toList()), MutationOptions.DEFAULT);
}
use of io.cdap.cdap.spi.metadata.MetadataMutation.Create in project cdap by caskdata.
the class MetadataStorageTest method testMutations.
@Test
public void testMutations() throws IOException {
MetadataStorage mds = getMetadataStorage();
MetadataEntity entity = ofDataset(DEFAULT_NAMESPACE, "entity");
// get metadata for non-existing entity
verifyMetadata(mds, entity, Metadata.EMPTY);
// drop metadata for non-existing entity succeeds
MetadataChange change = mds.apply(new Drop(entity), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, Metadata.EMPTY), change);
verifyMetadata(mds, entity, Metadata.EMPTY);
// remove metadata for non-existing entity succeeds
mds.apply(new Remove(entity, ImmutableSet.of(new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), new ScopedNameOfKind(MetadataKind.TAG, USER, "ut1"), new ScopedNameOfKind(PROPERTY, SYSTEM, "sp2"), new ScopedNameOfKind(PROPERTY, USER, "up2"))), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, Metadata.EMPTY), change);
verifyMetadata(mds, entity, Metadata.EMPTY);
// update metadata for non-existing entity creates it
Metadata metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "a"), new ScopedName(USER, "b")), ImmutableMap.of(new ScopedName(SYSTEM, "p"), "v", new ScopedName(USER, "k"), "v1"));
change = mds.apply(new Update(entity, metadata), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, metadata), change);
verifyMetadata(mds, entity, metadata);
// test that update is idempotent
change = mds.apply(new Update(entity, metadata), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, metadata, metadata), change);
verifyMetadata(mds, entity, metadata);
// create metadata replaces existing metadata
Metadata previousMetadata = metadata;
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(USER, "ut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "sv1", new ScopedName(SYSTEM, "sp2"), "sv2", new ScopedName(USER, "up1"), "uv1", new ScopedName(USER, "up2"), "uv2"));
MetadataMutation create = new Create(entity, metadata, Collections.emptyMap());
change = mds.apply(create, MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
// verify the metadata with variations of scope and kind
verifyMetadata(mds, entity, metadata);
// verify the metadata with a select subset of tags and properties
verifyMetadataSelection(mds, entity, metadata, ImmutableSet.of(new ScopedNameOfKind(PROPERTY, SYSTEM, "sp1"), new ScopedNameOfKind(PROPERTY, SYSTEM, "nosuch"), new ScopedNameOfKind(PROPERTY, USER, "up2"), new ScopedNameOfKind(PROPERTY, USER, "nosuch"), new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "nosuch"), new ScopedNameOfKind(MetadataKind.TAG, USER, "ut1"), new ScopedNameOfKind(MetadataKind.TAG, USER, "nosuch")));
// verify that a non-matching set tags and properties returns empty metadata
verifyMetadataSelection(mds, entity, metadata, ImmutableSet.of(new ScopedNameOfKind(PROPERTY, SYSTEM, "nosuch"), new ScopedNameOfKind(MetadataKind.TAG, USER, "nosuch")));
// replace the system metadata with directives, user metadata should remain unchanged
Metadata recreatedMetadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "nst0")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(SYSTEM, "nsp0"), "sv0"));
MetadataMutation recreate = new Create(entity, recreatedMetadata, ImmutableMap.of(new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), MetadataDirective.KEEP, new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st2"), MetadataDirective.PRESERVE, new ScopedNameOfKind(PROPERTY, SYSTEM, "sp1"), MetadataDirective.PRESERVE, new ScopedNameOfKind(PROPERTY, SYSTEM, "sp2"), MetadataDirective.KEEP));
previousMetadata = metadata;
// this is the new metadata according to directives
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(SYSTEM, "nst0"), new ScopedName(USER, "ut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "sv1", new ScopedName(SYSTEM, "sp2"), "sv2", new ScopedName(SYSTEM, "nsp0"), "sv0", new ScopedName(USER, "up1"), "uv1", new ScopedName(USER, "up2"), "uv2"));
change = mds.apply(recreate, MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
verifyMetadata(mds, entity, metadata);
// replace the metadata with directives
recreatedMetadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "nst1"), new ScopedName(USER, "nut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(SYSTEM, "nsp2"), "sv2", new ScopedName(USER, "up3"), "uv3"));
recreate = new Create(entity, recreatedMetadata, ImmutableMap.of(new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), MetadataDirective.KEEP, new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st2"), MetadataDirective.PRESERVE, new ScopedNameOfKind(PROPERTY, SYSTEM, "sp1"), MetadataDirective.PRESERVE, new ScopedNameOfKind(PROPERTY, SYSTEM, "sp2"), MetadataDirective.KEEP, new ScopedNameOfKind(PROPERTY, USER, "up2"), MetadataDirective.PRESERVE));
previousMetadata = metadata;
// this is the new metadata according to directives
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(SYSTEM, "nst1"), new ScopedName(USER, "nut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "sv1", new ScopedName(SYSTEM, "sp2"), "sv2", new ScopedName(SYSTEM, "nsp2"), "sv2", new ScopedName(USER, "up2"), "uv2", new ScopedName(USER, "up3"), "uv3"));
change = mds.apply(recreate, MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
verifyMetadata(mds, entity, metadata);
// update some tags and properties
MetadataMutation update = new Update(entity, new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "ast1"), new ScopedName(USER, "aut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(SYSTEM, "nsp2"), "nsv2", new ScopedName(USER, "up2"), "nuv2", new ScopedName(USER, "up3"), "uv3")));
// verify new metadata after update
previousMetadata = metadata;
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "ast1"), new ScopedName(SYSTEM, "st1"), new ScopedName(SYSTEM, "st2"), new ScopedName(SYSTEM, "nst1"), new ScopedName(USER, "aut1"), new ScopedName(USER, "nut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(SYSTEM, "sp2"), "sv2", new ScopedName(SYSTEM, "nsp2"), "nsv2", new ScopedName(USER, "up2"), "nuv2", new ScopedName(USER, "up3"), "uv3"));
change = mds.apply(update, MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
verifyMetadata(mds, entity, metadata);
// test that update is idempotent
change = mds.apply(update, MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, metadata, metadata), change);
verifyMetadata(mds, entity, metadata);
// remove some tags and properties
MetadataMutation remove = new Remove(entity, ImmutableSet.of(new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st1"), new ScopedNameOfKind(MetadataKind.TAG, SYSTEM, "st2"), new ScopedNameOfKind(MetadataKind.TAG, USER, "nut1"), new ScopedNameOfKind(MetadataKind.TAG, USER, "nosuch"), new ScopedNameOfKind(PROPERTY, SYSTEM, "sp2"), new ScopedNameOfKind(PROPERTY, SYSTEM, "nsp2"), new ScopedNameOfKind(PROPERTY, USER, "up2")));
previousMetadata = metadata;
metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "ast1"), new ScopedName(SYSTEM, "nst1"), new ScopedName(USER, "aut1")), ImmutableMap.of(new ScopedName(SYSTEM, "sp1"), "nsv1", new ScopedName(USER, "up3"), "uv3"));
change = mds.apply(remove, MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, previousMetadata, metadata), change);
verifyMetadata(mds, entity, metadata);
// test that remove is idemtpotent
change = mds.apply(remove, MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, metadata, metadata), change);
verifyMetadata(mds, entity, metadata);
// drop all metadata for the entity
change = mds.apply(new Drop(entity), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, metadata, Metadata.EMPTY), change);
verifyMetadata(mds, entity, Metadata.EMPTY);
// drop is idempotent
change = mds.apply(new Drop(entity), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, Metadata.EMPTY), change);
verifyMetadata(mds, entity, Metadata.EMPTY);
}
Aggregations