use of co.cask.cdap.api.plugin.PluginClass in project cdap by caskdata.
the class ArtifactRepositoryTest method testMacroPlugin.
@Test
public void testMacroPlugin() throws Exception {
File pluginDir = TMP_FOLDER.newFolder();
addPluginArtifact();
SortedMap<ArtifactDescriptor, Set<PluginClass>> plugins = getPlugins();
copyArtifacts(pluginDir, plugins);
// set up test macro evaluator's substitutions
Map<String, String> propertySubstitutions = ImmutableMap.<String, String>builder().put("expansiveHostname", "${hostname}/${path}:${port}").put("hostname", "${one}").put("path", "${two}").put("port", "${three}").put("one", "${host${hostScopeMacro}}").put("hostScopeMacro", "-local").put("host-local", "${l}${o}${c}${a}${l}${hostSuffix}").put("l", "l").put("o", "o").put("c", "c").put("a", "a").put("hostSuffix", "host").put("two", "${filename${fileTypeMacro}}").put("three", "${firstPortDigit}${secondPortDigit}").put("filename", "index").put("fileTypeMacro", "-html").put("filename-html", "index.html").put("filename-php", "index.php").put("firstPortDigit", "8").put("secondPortDigit", "0").put("aBoolean", "true").put("aByte", "101").put("aChar", "k").put("aDouble", "64.0").put("aFloat", "52.0").put("anInt", "42").put("aLong", "32").put("aShort", "81").build();
// Instantiate the plugins and execute them
try (PluginInstantiator instantiator = new PluginInstantiator(cConf, appClassLoader, pluginDir)) {
for (Map.Entry<ArtifactDescriptor, Set<PluginClass>> entry : plugins.entrySet()) {
for (PluginClass pluginClass : entry.getValue()) {
Plugin pluginInfo = new Plugin(new ArrayList<ArtifactId>(), entry.getKey().getArtifactId(), pluginClass, PluginProperties.builder().add("class.name", TEST_EMPTY_CLASS).add("nullableLongFlag", "10").add("host", "${expansiveHostname}").add("aBoolean", "${aBoolean}").add("aByte", "${aByte}").add("aChar", "${aChar}").add("aDouble", "${aDouble}").add("anInt", "${anInt}").add("aFloat", "${aFloat}").add("aLong", "${aLong}").add("aShort", "${aShort}").build());
TestMacroEvaluator testMacroEvaluator = new TestMacroEvaluator(propertySubstitutions, new HashMap<String, String>());
Callable<String> plugin = instantiator.newInstance(pluginInfo, testMacroEvaluator);
Assert.assertEquals("localhost/index.html:80,true,101,k,64.0,52.0,42,32,81", plugin.call());
String pluginId = "5";
PluginContext pluginContext = new DefaultPluginContext(instantiator, NamespaceId.DEFAULT.app("abc").worker("w"), ImmutableMap.of(pluginId, pluginInfo));
PluginProperties resolvedProperties = pluginContext.getPluginProperties(pluginId, testMacroEvaluator);
Map<String, String> expected = new HashMap<>();
expected.put("class.name", TEST_EMPTY_CLASS);
expected.put("nullableLongFlag", "10");
expected.put("host", "localhost/index.html:80");
expected.put("aBoolean", "true");
expected.put("aByte", "101");
expected.put("aChar", "k");
expected.put("aDouble", "64.0");
expected.put("anInt", "42");
expected.put("aFloat", "52.0");
expected.put("aLong", "32");
expected.put("aShort", "81");
Assert.assertEquals(expected, resolvedProperties.getProperties());
}
}
}
}
use of co.cask.cdap.api.plugin.PluginClass in project cdap by caskdata.
the class ArtifactStoreTest method testPluginParentInclusiveExclusiveVersions.
@Test
public void testPluginParentInclusiveExclusiveVersions() throws Exception {
// write artifacts that extend:
// parent-[1.0.0,1.0.0] -- only visible by parent-1.0.0
Id.Artifact id1 = Id.Artifact.from(Id.Namespace.DEFAULT, "plugins", "0.0.1");
Set<ArtifactRange> parentArtifacts = ImmutableSet.of(new ArtifactRange(NamespaceId.DEFAULT.getNamespace(), "parent", new ArtifactVersion("1.0.0"), true, new ArtifactVersion("1.0.0"), true));
List<PluginClass> plugins = ImmutableList.of(new PluginClass("typeA", "plugin1", "", "c.c.c.plugin1", "cfg", ImmutableMap.<String, PluginPropertyField>of()));
ArtifactMeta meta = new ArtifactMeta(ArtifactClasses.builder().addPlugins(plugins).build(), parentArtifacts);
writeArtifact(id1, meta, "some contents");
// parent-[2.0.0,2.0.1) -- only visible by parent-2.0.0
Id.Artifact id2 = Id.Artifact.from(Id.Namespace.DEFAULT, "plugins", "0.0.2");
parentArtifacts = ImmutableSet.of(new ArtifactRange(NamespaceId.DEFAULT.getNamespace(), "parent", new ArtifactVersion("2.0.0"), true, new ArtifactVersion("2.0.1"), false));
plugins = ImmutableList.of(new PluginClass("typeA", "plugin2", "", "c.c.c.plugin2", "cfg", ImmutableMap.<String, PluginPropertyField>of()));
meta = new ArtifactMeta(ArtifactClasses.builder().addPlugins(plugins).build(), parentArtifacts);
writeArtifact(id2, meta, "some contents");
// parent-(3.0.0,3.0.1] -- only visible by parent-3.0.1
Id.Artifact id3 = Id.Artifact.from(Id.Namespace.DEFAULT, "plugins", "0.0.3");
parentArtifacts = ImmutableSet.of(new ArtifactRange(NamespaceId.DEFAULT.getNamespace(), "parent", new ArtifactVersion("3.0.0"), false, new ArtifactVersion("3.0.1"), true));
plugins = ImmutableList.of(new PluginClass("typeA", "plugin3", "", "c.c.c.plugin3", "cfg", ImmutableMap.<String, PluginPropertyField>of()));
meta = new ArtifactMeta(ArtifactClasses.builder().addPlugins(plugins).build(), parentArtifacts);
writeArtifact(id3, meta, "some contents");
// parent-(4.0.0,4.0.2) -- only visible by parent-4.0.1
Id.Artifact id4 = Id.Artifact.from(Id.Namespace.DEFAULT, "plugins", "0.0.4");
parentArtifacts = ImmutableSet.of(new ArtifactRange(NamespaceId.DEFAULT.getNamespace(), "parent", new ArtifactVersion("4.0.0"), false, new ArtifactVersion("4.0.2"), false));
plugins = ImmutableList.of(new PluginClass("typeA", "plugin4", "", "c.c.c.plugin4", "cfg", ImmutableMap.<String, PluginPropertyField>of()));
meta = new ArtifactMeta(ArtifactClasses.builder().addPlugins(plugins).build(), parentArtifacts);
writeArtifact(id4, meta, "some contents");
ArtifactMeta parentMeta = new ArtifactMeta(ArtifactClasses.builder().build());
// check parent-1.0.0 has plugin1 but parent-0.0.9 does not and 1.0.1 does not
Id.Artifact parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "0.0.9");
writeArtifact(parentId, parentMeta, "content");
Assert.assertTrue(artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).isEmpty());
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "1.0.1");
writeArtifact(parentId, parentMeta, "content");
Assert.assertTrue(artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).isEmpty());
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "1.0.0");
writeArtifact(parentId, parentMeta, "content");
Assert.assertEquals(1, artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).size());
// check parent-2.0.0 has plugin2 but parent-1.9.9 does not and 2.0.1 does not
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "1.9.9");
writeArtifact(parentId, parentMeta, "content");
Assert.assertTrue(artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).isEmpty());
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "2.0.1");
writeArtifact(parentId, parentMeta, "content");
Assert.assertTrue(artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).isEmpty());
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "2.0.0");
writeArtifact(parentId, parentMeta, "content");
Assert.assertEquals(1, artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).size());
// check parent-3.0.1 has plugin3 but parent-3.0.0 does not and 3.0.2 does not
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "3.0.0");
writeArtifact(parentId, parentMeta, "content");
Assert.assertTrue(artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).isEmpty());
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "3.0.2");
writeArtifact(parentId, parentMeta, "content");
Assert.assertTrue(artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).isEmpty());
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "3.0.1");
writeArtifact(parentId, parentMeta, "content");
Assert.assertEquals(1, artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).size());
// check parent-4.0.1 has plugin4 but parent-4.0.0 does not and 4.0.2 does not
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "4.0.0");
writeArtifact(parentId, parentMeta, "content");
Assert.assertTrue(artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).isEmpty());
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "4.0.2");
writeArtifact(parentId, parentMeta, "content");
Assert.assertTrue(artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).isEmpty());
parentId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "4.0.1");
writeArtifact(parentId, parentMeta, "content");
Assert.assertEquals(1, artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentId).size());
}
use of co.cask.cdap.api.plugin.PluginClass in project cdap by caskdata.
the class ArtifactStoreTest method testNamespaceIsolation.
@Test
public void testNamespaceIsolation() throws Exception {
Id.Namespace namespace1 = Id.Namespace.from("ns1");
Id.Namespace namespace2 = Id.Namespace.from("ns2");
Id.Artifact artifact1 = Id.Artifact.from(namespace1, "myplugins", "1.0.0");
Id.Artifact artifact2 = Id.Artifact.from(namespace2, "myplugins", "1.0.0");
String contents1 = "first contents";
String contents2 = "second contents";
PluginClass plugin1 = new PluginClass("atype", "plugin1", "", "c.c.c.plugin1", "cfg", ImmutableMap.<String, PluginPropertyField>of());
PluginClass plugin2 = new PluginClass("atype", "plugin2", "", "c.c.c.plugin2", "cfg", ImmutableMap.<String, PluginPropertyField>of());
ArtifactMeta meta1 = new ArtifactMeta(ArtifactClasses.builder().addPlugin(plugin1).build());
ArtifactMeta meta2 = new ArtifactMeta(ArtifactClasses.builder().addPlugin(plugin2).build());
writeArtifact(artifact1, meta1, contents1);
writeArtifact(artifact2, meta2, contents2);
try {
ArtifactDetail info1 = artifactStore.getArtifact(artifact1);
ArtifactDetail info2 = artifactStore.getArtifact(artifact2);
assertEqual(artifact1, meta1, contents1, info1);
assertEqual(artifact2, meta2, contents2, info2);
List<ArtifactDetail> namespace1Artifacts = artifactStore.getArtifacts(namespace1.toEntityId());
List<ArtifactDetail> namespace2Artifacts = artifactStore.getArtifacts(namespace2.toEntityId());
Assert.assertEquals(1, namespace1Artifacts.size());
assertEqual(artifact1, meta1, contents1, namespace1Artifacts.get(0));
Assert.assertEquals(1, namespace2Artifacts.size());
assertEqual(artifact2, meta2, contents2, namespace2Artifacts.get(0));
} finally {
artifactStore.clear(namespace1.toEntityId());
artifactStore.clear(namespace2.toEntityId());
}
}
use of co.cask.cdap.api.plugin.PluginClass in project cdap by caskdata.
the class ArtifactStoreTest method testConcurrentWrite.
@Category(SlowTests.class)
@Test
public void testConcurrentWrite() throws Exception {
// start up a bunch of threads that will try and write the same artifact at the same time
// only one of them should be able to write it
int numThreads = 20;
final Id.Artifact artifactId = Id.Artifact.from(Id.Namespace.DEFAULT, "abc", "1.0.0");
final List<String> successfulWriters = Collections.synchronizedList(Lists.<String>newArrayList());
// use a barrier so they all try and write at the same time
final CyclicBarrier barrier = new CyclicBarrier(numThreads);
final CountDownLatch latch = new CountDownLatch(numThreads);
ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
for (int i = 0; i < numThreads; i++) {
final String writer = String.valueOf(i);
executorService.execute(new Runnable() {
@Override
public void run() {
try {
barrier.await();
ArtifactMeta meta = new ArtifactMeta(ArtifactClasses.builder().addPlugin(new PluginClass("plugin-type", "plugin" + writer, "", "classname", "cfg", ImmutableMap.<String, PluginPropertyField>of())).build());
writeArtifact(artifactId, meta, writer);
successfulWriters.add(writer);
} catch (InterruptedException | BrokenBarrierException | IOException e) {
// something went wrong, fail the test
throw new RuntimeException(e);
} catch (ArtifactAlreadyExistsException | WriteConflictException e) {
// these are ok, all but one thread should see this
} finally {
latch.countDown();
}
}
});
}
// wait for all writers to finish
latch.await();
// only one writer should have been able to write
Assert.assertEquals(1, successfulWriters.size());
String successfulWriter = successfulWriters.get(0);
// check that the contents weren't mixed between writers
ArtifactDetail info = artifactStore.getArtifact(artifactId);
ArtifactMeta expectedMeta = new ArtifactMeta(ArtifactClasses.builder().addPlugin(new PluginClass("plugin-type", "plugin" + successfulWriter, "", "classname", "cfg", ImmutableMap.<String, PluginPropertyField>of())).build());
assertEqual(artifactId, expectedMeta, successfulWriter, info);
}
use of co.cask.cdap.api.plugin.PluginClass in project cdap by caskdata.
the class ArtifactStoreTest method testSnapshotMutability.
@Test
public void testSnapshotMutability() throws Exception {
// write parent
Id.Artifact parentArtifactId = Id.Artifact.from(Id.Namespace.DEFAULT, "parent", "1.0.0");
ArtifactMeta parentMeta = new ArtifactMeta(ArtifactClasses.builder().build());
writeArtifact(parentArtifactId, parentMeta, "content");
ArtifactRange parentArtifacts = new ArtifactRange(NamespaceId.DEFAULT.getNamespace(), "parent", new ArtifactVersion("1.0.0"), new ArtifactVersion("2.0.0"));
// write the snapshot once
PluginClass plugin1 = new PluginClass("atype", "plugin1", "", "c.c.c.plugin1", "cfg", ImmutableMap.<String, PluginPropertyField>of());
PluginClass plugin2 = new PluginClass("atype", "plugin2", "", "c.c.c.plugin2", "cfg", ImmutableMap.<String, PluginPropertyField>of());
Id.Artifact artifactId = Id.Artifact.from(Id.Namespace.DEFAULT, "myplugins", "1.0.0-SNAPSHOT");
ArtifactMeta artifactMeta = new ArtifactMeta(ArtifactClasses.builder().addPlugins(plugin1, plugin2).build(), ImmutableSet.of(parentArtifacts));
writeArtifact(artifactId, artifactMeta, "abc123");
// update meta and jar contents
artifactMeta = new ArtifactMeta(ArtifactClasses.builder().addPlugin(plugin2).build(), ImmutableSet.of(parentArtifacts));
writeArtifact(artifactId, artifactMeta, "xyz321");
// check the metadata and contents got updated
ArtifactDetail detail = artifactStore.getArtifact(artifactId);
assertEqual(artifactId, artifactMeta, "xyz321", detail);
// check that plugin1 was deleted and plugin2 remains
Assert.assertEquals(ImmutableMap.of(detail.getDescriptor(), plugin2), artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentArtifactId, plugin2.getType(), plugin2.getName(), null, Integer.MAX_VALUE, ArtifactSortOrder.UNORDERED));
try {
artifactStore.getPluginClasses(NamespaceId.DEFAULT, parentArtifactId, plugin1.getType(), plugin1.getName(), null, Integer.MAX_VALUE, ArtifactSortOrder.UNORDERED);
Assert.fail();
} catch (PluginNotExistsException e) {
// expected
}
}
Aggregations