diff --git a/pom.xml b/pom.xml index 1f51b21..f23cd24 100644 --- a/pom.xml +++ b/pom.xml @@ -93,6 +93,21 @@ [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) test + + org.acme + HelloWorldPlugin + [1.1.0-SNAPSHOT, 2.0.0-SNAPSHOT) + test + + + org.gcube.core diff --git a/src/test/java/org/gcube/vremanagement/executor/client/DefaultExecutorTest.java b/src/test/java/org/gcube/vremanagement/executor/client/DefaultExecutorTest.java new file mode 100644 index 0000000..cbb90ca --- /dev/null +++ b/src/test/java/org/gcube/vremanagement/executor/client/DefaultExecutorTest.java @@ -0,0 +1,164 @@ +/** + * + */ +package org.gcube.vremanagement.executor.client; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.acme.HelloWorldPlugin; +import org.acme.HelloWorldPluginDeclaration; +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.utils.TestUtility; +import org.gcube.vremanagement.executor.api.types.LaunchParameter; +import org.gcube.vremanagement.executor.api.types.Scheduling; +import org.gcube.vremanagement.executor.client.plugins.ExecutorPlugin; +import org.gcube.vremanagement.executor.client.proxies.SmartExecutorProxy; +import org.gcube.vremanagement.executor.exception.PluginInstanceNotFoundException; +import org.gcube.vremanagement.executor.exception.PluginNotFoundException; +import org.gcube.vremanagement.executor.plugin.PluginState; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ + * + */ +public class DefaultExecutorTest { + + private static Logger logger = LoggerFactory.getLogger(DefaultExecutorTest.class); + + private SmartExecutorProxy proxy; + + @Before + public void before(){ + SecurityTokenProvider.instance.set(TestUtility.TOKEN); + proxy = ExecutorPlugin.getExecutorProxy().build(); + Assert.assertNotNull(proxy); + } + + @After + public void after(){ + SecurityTokenProvider.instance.reset(); + } + + @Test + public void launch() { + Map inputs = new HashMap(); + LaunchParameter launchParameter = new LaunchParameter("Test", inputs); + try { + proxy.launch(launchParameter); + } catch (Exception e) { + Assert.assertEquals(PluginNotFoundException.class, e.getCause().getClass()); + } + + } + + @Test + public void getState() { + String executionIdentifier = UUID.randomUUID().toString(); + try { + proxy.getState(executionIdentifier); + } catch (Exception e) { + Assert.assertEquals(PluginInstanceNotFoundException.class, e.getCause().getClass()); + } + + } + + @Test + public void testOk() throws Exception { + Map inputs = new HashMap(); + inputs.put("Hello", "World"); + long sleepTime = 10000; // 1000 millisec * 10 = 10 sec + inputs.put(HelloWorldPlugin.SLEEP_TIME, sleepTime); + LaunchParameter launchParameter = new LaunchParameter(HelloWorldPluginDeclaration.NAME, inputs); + try { + String executionIdentifier = proxy.launch(launchParameter); + + Thread.sleep(1000); + Assert.assertEquals(PluginState.RUNNING, proxy.getState(executionIdentifier)); + + Thread.sleep(4000); + Assert.assertEquals(PluginState.RUNNING, proxy.getState(executionIdentifier)); + + Thread.sleep(6000); + Assert.assertEquals(PluginState.DONE, proxy.getState(executionIdentifier)); + + } catch (Exception e) { + logger.error("testOk Exception", e); + throw e; + } + + } + + + @Test + public void testScheduledTaskNotPersisted() throws Exception { + proxy = ExecutorPlugin.getExecutorProxy((new HelloWorldPluginDeclaration()).getName()).build(); + Assert.assertNotNull(proxy); + + Map inputs = new HashMap(); + inputs.put("Hello", "World"); + long sleepTime = 10000; // 1000 millisec * 10 = 10 sec + inputs.put(HelloWorldPlugin.SLEEP_TIME, sleepTime); + // Every 5 minutes, for 12 times (one hour totally). + Scheduling scheduling = new Scheduling(60*5,12,false); + LaunchParameter launchParameter = new LaunchParameter(HelloWorldPluginDeclaration.NAME, inputs, scheduling); + + try { + String executionIdentifier = proxy.launch(launchParameter); + + Thread.sleep(1000); + Assert.assertEquals(PluginState.RUNNING, proxy.getState(executionIdentifier)); + + Thread.sleep(4000); + Assert.assertEquals(PluginState.RUNNING, proxy.getState(executionIdentifier)); + + Thread.sleep(6000); + Assert.assertEquals(PluginState.DONE, proxy.getState(executionIdentifier)); + + } catch (Exception e) { + logger.error("testOk Exception", e); + throw e; + } + + } + + @Test + public void testScheduledTaskPersisted() throws Exception { + proxy = ExecutorPlugin.getExecutorProxy((new HelloWorldPluginDeclaration()).getName()).build(); + Assert.assertNotNull(proxy); + + Map inputs = new HashMap(); + inputs.put("Hello", "World"); + long sleepTime = 10000; // 1000 millisec * 10 = 10 sec + inputs.put(HelloWorldPlugin.SLEEP_TIME, sleepTime); + // Every 5 minutes, for 12 times (one hour totally). + Scheduling scheduling = new Scheduling(60*5,12,true); + LaunchParameter launchParameter = new LaunchParameter(HelloWorldPluginDeclaration.NAME, inputs, scheduling); + + try { + String executionIdentifier = proxy.launch(launchParameter); + + Thread.sleep(1000); + Assert.assertEquals(PluginState.RUNNING, proxy.getState(executionIdentifier)); + + Thread.sleep(4000); + Assert.assertEquals(PluginState.RUNNING, proxy.getState(executionIdentifier)); + + Thread.sleep(6000); + Assert.assertEquals(PluginState.DONE, proxy.getState(executionIdentifier)); + + } catch (Exception e) { + logger.error("testOk Exception", e); + throw e; + } + + } + +} diff --git a/src/test/java/org/gcube/vremanagement/executor/client/QueriedClientTest.java b/src/test/java/org/gcube/vremanagement/executor/client/QueriedClientTest.java new file mode 100644 index 0000000..ddd3cf6 --- /dev/null +++ b/src/test/java/org/gcube/vremanagement/executor/client/QueriedClientTest.java @@ -0,0 +1,252 @@ +/** + * + */ +package org.gcube.vremanagement.executor.client; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.acme.HelloWorldPlugin; +import org.acme.HelloWorldPluginDeclaration; +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.clients.ProxyBuilderImpl; +import org.gcube.common.clients.exceptions.DiscoveryException; +import org.gcube.utils.TestUtility; +import org.gcube.vremanagement.executor.api.SmartExecutor; +import org.gcube.vremanagement.executor.api.types.LaunchParameter; +import org.gcube.vremanagement.executor.client.plugins.ExecutorPlugin; +import org.gcube.vremanagement.executor.client.plugins.query.SmartExecutorPluginQuery; +import org.gcube.vremanagement.executor.client.plugins.query.filter.ListEndpointDiscoveryFilter; +import org.gcube.vremanagement.executor.client.plugins.query.filter.RandomEndpointDiscoveryFilter; +import org.gcube.vremanagement.executor.client.plugins.query.filter.SpecificEndpointDiscoveryFilter; +import org.gcube.vremanagement.executor.client.proxies.SmartExecutorProxy; +import org.gcube.vremanagement.executor.client.util.Tuple; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ + * + */ +public class QueriedClientTest { + + private static Logger logger = LoggerFactory.getLogger(QueriedClientTest.class); + + @Before + public void before(){ + SecurityTokenProvider.instance.set(TestUtility.TOKEN); + } + + @After + public void after(){ + SecurityTokenProvider.instance.reset(); + } + + private void launchTest(SmartExecutorProxy proxy) throws Exception { + Map inputs = new HashMap(); + inputs.put("Hello", "World"); + long sleepTime = 10000; + inputs.put(HelloWorldPlugin.SLEEP_TIME, sleepTime); + LaunchParameter launchParameter = new LaunchParameter(HelloWorldPluginDeclaration.NAME, inputs); + try { + String executionIdentifier = proxy.launch(launchParameter); + proxy.getState(executionIdentifier); + } catch (Exception e) { + throw e; + } + } + + @Test + public void testNoConditions() throws Exception { + SmartExecutorProxy proxy = ExecutorPlugin.getExecutorProxy(HelloWorldPluginDeclaration.NAME).build(); + Assert.assertNotNull(proxy); + + try { + launchTest(proxy); + } catch (Exception e) { + logger.error("testNoConditions Exception", e); + throw e; + } + + } + + @Test + public void testWithSingleRighConditions() throws Exception { + HelloWorldPluginDeclaration helloWorldPluginDeclaration = new HelloWorldPluginDeclaration(); + Map map = helloWorldPluginDeclaration.getSupportedCapabilities(); + Tuple tuple = new Tuple(); + for(String key : map.keySet()){ + tuple = new Tuple(key, map.get(key)); + break; // Get only the first + } + SmartExecutorProxy proxy = ExecutorPlugin.getExecutorProxy(HelloWorldPluginDeclaration.NAME, tuple).build(); + Assert.assertNotNull(proxy); + + try { + launchTest(proxy); + } catch (Exception e) { + logger.error("testWithSingleRighConditions Exception", e); + throw e; + } + } + + @Test + public void testWithMultipleRighConditions() throws Exception { + HelloWorldPluginDeclaration helloWorldPluginDeclaration = new HelloWorldPluginDeclaration(); + Map map = helloWorldPluginDeclaration.getSupportedCapabilities(); + + @SuppressWarnings("unchecked") + Tuple[] tuples = new Tuple[map.size()+1]; + int i = 0; + for(String key : map.keySet()){ + tuples[i] = new Tuple(key, map.get(key)); + ++i; + } + + tuples[i] = new Tuple("Version", helloWorldPluginDeclaration.getVersion()); + + SmartExecutorProxy proxy = ExecutorPlugin.getExecutorProxy(HelloWorldPluginDeclaration.NAME, tuples).build(); + Assert.assertNotNull(proxy); + + try { + launchTest(proxy); + } catch (Exception e) { + logger.error("testWithMultipleRighConditions Exception", e); + throw e; + } + } + + @Test + public void testWithUnsatisfiedConditions() { + Tuple tuple = new Tuple("Unsatisfied", "Condition"); + SmartExecutorProxy proxy = ExecutorPlugin.getExecutorProxy(HelloWorldPluginDeclaration.NAME, tuple).build(); + Assert.assertNotNull(proxy); + try { + launchTest(proxy); + } catch (Exception e) { + Assert.assertEquals(DiscoveryException.class, e.getClass()); + } + } + + @SuppressWarnings("unchecked") + @Test + public void testWithPersonalfilters() throws Exception { + ExecutorPlugin executorPlugin = new ExecutorPlugin(); + SmartExecutorPluginQuery query = new SmartExecutorPluginQuery(executorPlugin); + HelloWorldPluginDeclaration helloWorldPluginDeclaration = new HelloWorldPluginDeclaration(); + Map map = helloWorldPluginDeclaration.getSupportedCapabilities(); + Tuple tuple = new Tuple(); + for(String key : map.keySet()){ + tuple = new Tuple(key, map.get(key)); + break; // Get only the first + } + + query.addConditions(HelloWorldPluginDeclaration.NAME, tuple); + query.setServiceEndpointQueryFilter(null); + query.setEndpointDiscoveryFilter(null); + + SmartExecutorProxy proxy = new ProxyBuilderImpl(executorPlugin, query).build(); + + try { + launchTest(proxy); + } catch (Exception e) { + logger.error("testWithPersonalfilters Exception", e); + throw e; + } + } + + @Test + public void testManagedPersonalfilters() throws Exception { + HelloWorldPluginDeclaration helloWorldPluginDeclaration = new HelloWorldPluginDeclaration(); + Map map = helloWorldPluginDeclaration.getSupportedCapabilities(); + @SuppressWarnings("unchecked") + Tuple[] tuples = new Tuple[map.size()]; + int i = 0; + for(String key : map.keySet()){ + tuples[i] = new Tuple(key, map.get(key)); + ++i; + } + + SmartExecutorProxy proxy = ExecutorPlugin.getExecutorProxy(HelloWorldPluginDeclaration.NAME, tuples, null, new RandomEndpointDiscoveryFilter()).build(); + Assert.assertNotNull(proxy); + + try { + launchTest(proxy); + } catch (Exception e) { + logger.error("testManagedPersonalfilters Exception", e); + throw e; + } + } + + @SuppressWarnings("unchecked") + @Test + public void testWithListfilters() throws Exception { + ExecutorPlugin executorPlugin = new ExecutorPlugin(); + SmartExecutorPluginQuery query = new SmartExecutorPluginQuery(executorPlugin); + HelloWorldPluginDeclaration helloWorldPluginDeclaration = new HelloWorldPluginDeclaration(); + Map map = helloWorldPluginDeclaration.getSupportedCapabilities(); + Tuple tuple = new Tuple(); + for(String key : map.keySet()){ + tuple = new Tuple(key, map.get(key)); + break; // Get only the first + } + + query.addConditions(HelloWorldPluginDeclaration.NAME, tuple); + query.setServiceEndpointQueryFilter(null); + query.setEndpointDiscoveryFilter(new ListEndpointDiscoveryFilter()); + + SmartExecutorProxy proxy = new ProxyBuilderImpl(executorPlugin, query).build(); + + try { + launchTest(proxy); + } catch (Exception e) { + logger.error("testWithListfilters Exception", e); + throw e; + } + } + + + + + @SuppressWarnings("unchecked") + @Test + public void testWithSpecificSelection() throws Exception { + ExecutorPlugin executorPlugin = new ExecutorPlugin(); + SmartExecutorPluginQuery query = new SmartExecutorPluginQuery(executorPlugin); + HelloWorldPluginDeclaration helloWorldPluginDeclaration = new HelloWorldPluginDeclaration(); + Map map = helloWorldPluginDeclaration.getSupportedCapabilities(); + Tuple tuple = new Tuple(); + for(String key : map.keySet()){ + tuple = new Tuple(key, map.get(key)); + break; // Get only the first + } + + query.addConditions(HelloWorldPluginDeclaration.NAME, tuple); + query.setServiceEndpointQueryFilter(null); + List endpoints = query.discoverEndpoints(new ListEndpointDiscoveryFilter()); + + for(String endpoint : endpoints){ + + ExecutorPlugin runExecutorPlugin = new ExecutorPlugin(); + SmartExecutorPluginQuery runQuery = new SmartExecutorPluginQuery(runExecutorPlugin); + runQuery.addConditions(HelloWorldPluginDeclaration.NAME, tuple); + + SpecificEndpointDiscoveryFilter sedf = new SpecificEndpointDiscoveryFilter(endpoint); + runQuery.setEndpointDiscoveryFilter(sedf); + SmartExecutorProxy proxy = new ProxyBuilderImpl(runExecutorPlugin, runQuery).build(); + + try { + launchTest(proxy); + } catch (Exception e) { + logger.error("testWithSpecificSelection Exception", e); + throw e; + } + } + } + +} diff --git a/src/test/java/org/gcube/vremanagement/executor/client/SmartGenericWorkerDiscoveryQuery.java b/src/test/java/org/gcube/vremanagement/executor/client/SmartGenericWorkerDiscoveryQuery.java new file mode 100644 index 0000000..92b4179 --- /dev/null +++ b/src/test/java/org/gcube/vremanagement/executor/client/SmartGenericWorkerDiscoveryQuery.java @@ -0,0 +1,62 @@ +/** + * + */ +package org.gcube.vremanagement.executor.client; + +import java.util.List; + +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.utils.TestUtility; +//import org.gcube.dataanalysis.executor.plugin.GenericWorkerPluginDeclaration; +import org.gcube.vremanagement.executor.client.plugins.ExecutorPlugin; +import org.gcube.vremanagement.executor.client.plugins.query.SmartExecutorPluginQuery; +import org.gcube.vremanagement.executor.client.plugins.query.filter.ListEndpointDiscoveryFilter; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ + * + */ +public class SmartGenericWorkerDiscoveryQuery { + + private static Logger logger = LoggerFactory.getLogger(SmartGenericWorkerDiscoveryQuery.class); + + @Before + public void before(){ + SecurityTokenProvider.instance.set(TestUtility.TOKEN); + } + + @After + public void after(){ + SecurityTokenProvider.instance.reset(); + } + + @Test + public void testGenericWorkerDiscoveryQuery() throws Exception { + + //GenericWorkerPluginDeclaration gwpd = new GenericWorkerPluginDeclaration(); + + ExecutorPlugin executorPlugin = new ExecutorPlugin(); + SmartExecutorPluginQuery query = new SmartExecutorPluginQuery(executorPlugin); + + /* + add key_value filter here + * Tuple[] tuples = new Tuple[n]; + * + * runQuery.addConditions(pluginName, tuples); + */ + + //query.addConditions(gwpd.getName()); + + /* Used to add extra filter to ServiceEndpoint discovery */ + query.setServiceEndpointQueryFilter(null); + List nodes = query.discoverEndpoints(new ListEndpointDiscoveryFilter()); + logger.debug("Found the following nodes: {}", nodes); + + } + +}