Compare commits

..

No commits in common. "master" and "feature/19647" have entirely different histories.

7 changed files with 75 additions and 94 deletions

2
.gitignore vendored
View File

@ -2,5 +2,3 @@ target
.classpath .classpath
.project .project
.settings .settings
/bin/
/.DS_Store

View File

@ -2,11 +2,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
# Changelog for Smart Executor Client # Changelog for Smart Executor Client
## [v3.1.0]
- Ported service to authorization-utils [#22871] ## [v3.0.0-SNAPSHOT] [r5.0.0] -
## [v3.0.0]
- Switched smart-executor JSON management to gcube-jackson [#19647] - Switched smart-executor JSON management to gcube-jackson [#19647]
- Redesigned HTTP APIs to comply with RESTful architectural style [#12997] - Redesigned HTTP APIs to comply with RESTful architectural style [#12997]

View File

@ -1,26 +0,0 @@
# Acknowledgments
The projects leading to this software have received funding from a series of European Union programmes including:
- the Sixth Framework Programme for Research and Technological Development
- [DILIGENT](https://cordis.europa.eu/project/id/004260) (grant no. 004260).
- the Seventh Framework Programme for research, technological development and demonstration
- [D4Science](https://cordis.europa.eu/project/id/212488) (grant no. 212488);
- [D4Science-II](https://cordis.europa.eu/project/id/239019) (grant no.239019);
- [ENVRI](https://cordis.europa.eu/project/id/283465) (grant no. 283465);
- [iMarine](https://cordis.europa.eu/project/id/283644) (grant no. 283644);
- [EUBrazilOpenBio](https://cordis.europa.eu/project/id/288754) (grant no. 288754).
- the H2020 research and innovation programme
- [SoBigData](https://cordis.europa.eu/project/id/654024) (grant no. 654024);
- [PARTHENOS](https://cordis.europa.eu/project/id/654119) (grant no. 654119);
- [EGI-Engage](https://cordis.europa.eu/project/id/654142) (grant no. 654142);
- [ENVRI PLUS](https://cordis.europa.eu/project/id/654182) (grant no. 654182);
- [BlueBRIDGE](https://cordis.europa.eu/project/id/675680) (grant no. 675680);
- [PerformFISH](https://cordis.europa.eu/project/id/727610) (grant no. 727610);
- [AGINFRA PLUS](https://cordis.europa.eu/project/id/731001) (grant no. 731001);
- [DESIRA](https://cordis.europa.eu/project/id/818194) (grant no. 818194);
- [ARIADNEplus](https://cordis.europa.eu/project/id/823914) (grant no. 823914);
- [RISIS 2](https://cordis.europa.eu/project/id/824091) (grant no. 824091);
- [EOSC-Pillar](https://cordis.europa.eu/project/id/857650) (grant no. 857650);
- [Blue Cloud](https://cordis.europa.eu/project/id/862409) (grant no. 862409);
- [SoBigData-PlusPlus](https://cordis.europa.eu/project/id/871042) (grant no. 871042);

View File

@ -46,5 +46,26 @@ open-source software toolkit used for building and operating Hybrid Data
Infrastructures enabling the dynamic deployment of Virtual Research Environments Infrastructures enabling the dynamic deployment of Virtual Research Environments
by favouring the realisation of reuse oriented policies. by favouring the realisation of reuse oriented policies.
The projects leading to this software have received funding from a series of European Union programmes see [FUNDING.md](FUNDING.md) The projects leading to this software have received funding from a series of European Union programmes including:
- the Sixth Framework Programme for Research and Technological Development
- DILIGENT (grant no. 004260).
- the Seventh Framework Programme for research, technological development and demonstration
- D4Science (grant no. 212488);
- D4Science-II (grant no.239019);
- ENVRI (grant no. 283465);
- iMarine(grant no. 283644);
- EUBrazilOpenBio (grant no. 288754).
- the H2020 research and innovation programme
- SoBigData (grant no. 654024);
- PARTHENOS (grant no. 654119);
- EGIEngage (grant no. 654142);
- ENVRIplus (grant no. 654182);
- BlueBRIDGE (grant no. 675680);
- PerformFish (grant no. 727610);
- AGINFRAplus (grant no. 731001);
- DESIRA (grant no. 818194);
- ARIADNEplus (grant no. 823914);
- RISIS2 (grant no. 824091);

18
pom.xml
View File

@ -10,7 +10,7 @@
<groupId>org.gcube.vremanagement</groupId> <groupId>org.gcube.vremanagement</groupId>
<artifactId>smart-executor-client</artifactId> <artifactId>smart-executor-client</artifactId>
<version>3.1.0</version> <version>3.0.0-SNAPSHOT</version>
<name>Smart Executor Client</name> <name>Smart Executor Client</name>
<description>Smart Executor Client is a library designed to interact with Smart Executor exposed REST API</description> <description>Smart Executor Client is a library designed to interact with Smart Executor exposed REST API</description>
@ -30,7 +30,7 @@
<dependency> <dependency>
<groupId>org.gcube.distribution</groupId> <groupId>org.gcube.distribution</groupId>
<artifactId>gcube-bom</artifactId> <artifactId>gcube-bom</artifactId>
<version>2.1.0</version> <version>2.0.0-SNAPSHOT</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
@ -57,7 +57,7 @@
<dependency> <dependency>
<groupId>org.gcube.vremanagement</groupId> <groupId>org.gcube.vremanagement</groupId>
<artifactId>smart-executor-api</artifactId> <artifactId>smart-executor-api</artifactId>
<version>[3.0.0, 4.0.0-SNAPSHOT)</version> <version>[3.0.0-SNAPSHOT, 4.0.0-SNAPSHOT)</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.gcube.common</groupId> <groupId>org.gcube.common</groupId>
@ -84,17 +84,11 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.gcube.common</groupId> <groupId>org.gcube.vremanagement</groupId>
<artifactId>authorization-utils</artifactId> <artifactId>hello-world-se-plugin</artifactId>
<version>[2.0.0, 3.0.0-SNAPSHOT)</version> <version>[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- <dependency> -->
<!-- <groupId>org.gcube.vremanagement</groupId> -->
<!-- <artifactId>hello-world-se-plugin</artifactId> -->
<!-- <version>[2.0.0, 3.0.0-SNAPSHOT)</version> -->
<!-- <scope>test</scope> -->
<!-- </dependency> -->
</dependencies> </dependencies>
</project> </project>

View File

@ -7,24 +7,31 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Properties; import java.util.Properties;
import org.gcube.common.authorization.utils.manager.SecretManager; import org.gcube.common.authorization.client.Constants;
import org.gcube.common.authorization.utils.manager.SecretManagerProvider; import org.gcube.common.authorization.client.exceptions.ObjectNotFound;
import org.gcube.common.authorization.utils.secret.Secret; import org.gcube.common.authorization.library.AuthorizationEntry;
import org.gcube.common.authorization.utils.secret.SecretUtility; import org.gcube.common.authorization.library.provider.AuthorizationProvider;
import org.gcube.common.authorization.library.provider.ClientInfo;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.authorization.library.utils.Caller;
import org.gcube.common.scope.api.ScopeProvider;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* @author Luca Frosini (ISTI - CNR) * @author Luca Frosini (ISTI - CNR)
*
*/ */
public class ContextTest { public class ContextTest {
private static final Logger logger = LoggerFactory.getLogger(ContextTest.class);
protected static Properties properties; protected static Properties properties;
protected static final String PROPERTIES_FILENAME = "token.properties"; protected static final String PROPERTIES_FILENAME = "token.properties";
public static final String ROOT; public static final String DEFAULT_TEST_SCOPE_NAME;
public static final String VO;
public static final String VRE;
static { static {
properties = new Properties(); properties = new Properties();
@ -37,50 +44,42 @@ public class ContextTest {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
ROOT = "/gcube"; //DEFAULT_TEST_SCOPE_NAME = "/pred4s/preprod/preVRE";
// VO = ROOT + "/devsec"; DEFAULT_TEST_SCOPE_NAME = "/gcube/devNext/NextNext";
// VRE = VO + "/devVRE";
VO = ROOT + "/devNext";
VRE = VO + "/NextNext";
} }
public static void set(Secret secret) throws Exception { public static String getCurrentScope(String token) throws ObjectNotFound, Exception {
SecretManagerProvider.instance.reset(); AuthorizationEntry authorizationEntry = Constants.authorizationService().get(token);
SecretManager secretManager = new SecretManager(); String context = authorizationEntry.getContext();
SecretManagerProvider.instance.set(secretManager); logger.info("Context of token {} is {}", token, context);
secretManager.addSecret(secret); return context;
secretManager.set();
} }
public static void setContext(String token) throws Exception { public static void setContextByName(String fullContextName) throws ObjectNotFound, Exception {
Secret secret = getSecret(token);
set(secret);
}
public static void setContextByName(String fullContextName) throws Exception {
Secret secret = getSecretByContextName(fullContextName);
set(secret);
}
private static Secret getSecret(String token) throws Exception {
Secret secret = SecretUtility.getSecretByTokenString(token);
return secret;
}
private static Secret getSecretByContextName(String fullContextName) throws Exception {
String token = ContextTest.properties.getProperty(fullContextName); String token = ContextTest.properties.getProperty(fullContextName);
return getSecret(token); setContext(token);
}
public static void setContext(String token) throws ObjectNotFound, Exception {
SecurityTokenProvider.instance.set(token);
AuthorizationEntry authorizationEntry = Constants.authorizationService().get(token);
ClientInfo clientInfo = authorizationEntry.getClientInfo();
logger.debug("User : {} - Type : {}", clientInfo.getId(), clientInfo.getType().name());
String qualifier = authorizationEntry.getQualifier();
Caller caller = new Caller(clientInfo, qualifier);
AuthorizationProvider.instance.set(caller);
ScopeProvider.instance.set(getCurrentScope(token));
} }
@BeforeClass @BeforeClass
public static void beforeClass() throws Exception { public static void beforeClass() throws Exception {
setContextByName(ROOT); setContextByName(DEFAULT_TEST_SCOPE_NAME);
} }
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClass() throws Exception {
SecretManagerProvider.instance.reset(); SecurityTokenProvider.instance.reset();
ScopeProvider.instance.reset();
} }
} }

View File

@ -10,9 +10,11 @@ import java.util.concurrent.TimeUnit;
import org.gcube.vremanagement.executor.api.types.LaunchParameter; import org.gcube.vremanagement.executor.api.types.LaunchParameter;
import org.gcube.vremanagement.executor.api.types.Scheduling; import org.gcube.vremanagement.executor.api.types.Scheduling;
import org.gcube.vremanagement.executor.client.query.Discover; import org.gcube.vremanagement.executor.client.query.Discover;
import org.gcube.vremanagement.executor.plugin.Plugin;
import org.gcube.vremanagement.executor.plugin.PluginDefinition; import org.gcube.vremanagement.executor.plugin.PluginDefinition;
import org.gcube.vremanagement.executor.plugin.PluginStateEvolution; import org.gcube.vremanagement.executor.plugin.PluginStateEvolution;
import org.gcube.vremanagement.executor.plugin.ScheduledTask; import org.gcube.vremanagement.executor.plugin.ScheduledTask;
import org.gcube.vremanagement.helloworld.HelloWorldPlugin;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -29,11 +31,6 @@ public class SmartExecutorClientTest extends ContextTest {
public static final String HTTPS_ADDRESS = "https://smartexecutor.d4science.org:8090/smart-executor/rest"; public static final String HTTPS_ADDRESS = "https://smartexecutor.d4science.org:8090/smart-executor/rest";
public static final String HOST = "smartexecutor.d4science.org"; public static final String HOST = "smartexecutor.d4science.org";
public static final String SLEEP_TIME = "sleepTime";
public static final String HELLO_WORLD_PLUGIN_NAME = "hello-world-se-plugin";
public static final String HELLO_WORLD_PLUGIN_VERSION = "2.0.0";
public static final String HELLO_WORLD_PLUGIN_DESCRIPTION = "Hello World Smart Executor Plugin";
@Test @Test
public void testSetAddress() { public void testSetAddress() {
SmartExecutorClientImpl smartExecutorClient = new SmartExecutorClientImpl(); SmartExecutorClientImpl smartExecutorClient = new SmartExecutorClientImpl();
@ -51,10 +48,10 @@ public class SmartExecutorClientTest extends ContextTest {
private LaunchParameter getLaunchParameter() { private LaunchParameter getLaunchParameter() {
Scheduling scheduling = new Scheduling(20); Scheduling scheduling = new Scheduling(20);
Map<String,Object> inputs = new HashMap<String,Object>(); Map<String,Object> inputs = new HashMap<String,Object>();
inputs.put(SLEEP_TIME, TimeUnit.SECONDS.toMillis(10)); inputs.put(HelloWorldPlugin.SLEEP_TIME, TimeUnit.SECONDS.toMillis(10));
inputs.put("TestUUID", UUID.randomUUID()); inputs.put("TestUUID", UUID.randomUUID());
LaunchParameter launchParameter = new LaunchParameter(HELLO_WORLD_PLUGIN_NAME, inputs); LaunchParameter launchParameter = new LaunchParameter(new HelloWorldPlugin().getName(), inputs);
launchParameter.setScheduling(scheduling); launchParameter.setScheduling(scheduling);
return launchParameter; return launchParameter;
@ -64,7 +61,8 @@ public class SmartExecutorClientTest extends ContextTest {
public void testServiceInteraction() throws Exception { public void testServiceInteraction() throws Exception {
SmartExecutorClientFactory.forceURL("http://pc-frosini.isti.cnr.it:8080/smart-executor"); SmartExecutorClientFactory.forceURL("http://pc-frosini.isti.cnr.it:8080/smart-executor");
String pluginName = HELLO_WORLD_PLUGIN_NAME; Plugin plugin = new HelloWorldPlugin();
String pluginName = plugin.getName();
logger.debug("Going to test smart executor using {} plugin", pluginName); logger.debug("Going to test smart executor using {} plugin", pluginName);
SmartExecutorClient smartExecutorClient = SmartExecutorClientFactory.getClient(pluginName); SmartExecutorClient smartExecutorClient = SmartExecutorClientFactory.getClient(pluginName);
@ -76,9 +74,9 @@ public class SmartExecutorClientTest extends ContextTest {
PluginDefinition pluginDefinition = plugins.get(0); PluginDefinition pluginDefinition = plugins.get(0);
Assert.assertTrue(pluginDefinition.getName().compareTo(pluginName) == 0); Assert.assertTrue(pluginDefinition.getName().compareTo(pluginName) == 0);
Assert.assertTrue(pluginDefinition.getDescription().compareTo(HELLO_WORLD_PLUGIN_DESCRIPTION) == 0); Assert.assertTrue(pluginDefinition.getDescription().compareTo(plugin.getDescription()) == 0);
Assert.assertTrue(pluginDefinition.getVersion().compareTo(HELLO_WORLD_PLUGIN_VERSION) == 0); Assert.assertTrue(pluginDefinition.getVersion().compareTo(plugin.getVersion()) == 0);
//Assert.assertTrue(pluginDefinition.getSupportedCapabilities().equals(plugin.getSupportedCapabilities())); Assert.assertTrue(pluginDefinition.getSupportedCapabilities().equals(plugin.getSupportedCapabilities()));
List<ScheduledTask> orphans = smartExecutorClient.getOrphanScheduledLaunches(); List<ScheduledTask> orphans = smartExecutorClient.getOrphanScheduledLaunches();
for(ScheduledTask orphan : orphans) { for(ScheduledTask orphan : orphans) {