refs #508: Support Config File to run task at service startup

https://support.d4science.org/issues/508

git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/vre-management/smart-executor@117760 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Luca Frosini 2015-09-01 15:57:44 +00:00
parent 4637d76de7
commit ef3d949eb7
4 changed files with 90 additions and 13 deletions

View File

@ -36,7 +36,7 @@ import org.gcube.smartgears.handlers.application.ApplicationLifecycleEvent;
import org.gcube.smartgears.handlers.application.ApplicationLifecycleHandler; import org.gcube.smartgears.handlers.application.ApplicationLifecycleHandler;
import org.gcube.vremanagement.executor.api.types.LaunchParameter; import org.gcube.vremanagement.executor.api.types.LaunchParameter;
import org.gcube.vremanagement.executor.configuration.JSONLaunchParameter; import org.gcube.vremanagement.executor.configuration.JSONLaunchParameter;
import org.gcube.vremanagement.executor.configuration.Parser; import org.gcube.vremanagement.executor.configuration.ConfiguredTasks;
import org.gcube.vremanagement.executor.persistence.SmartExecutorPersistenceConnector; import org.gcube.vremanagement.executor.persistence.SmartExecutorPersistenceConnector;
import org.gcube.vremanagement.executor.plugin.PluginDeclaration; import org.gcube.vremanagement.executor.plugin.PluginDeclaration;
import org.gcube.vremanagement.executor.pluginmanager.PluginManager; import org.gcube.vremanagement.executor.pluginmanager.PluginManager;
@ -73,6 +73,16 @@ public class SmartExecutorInitalizator extends ApplicationLifecycleHandler {
*/ */
protected static SmartExecutorScheduler smartExecutorScheduler; protected static SmartExecutorScheduler smartExecutorScheduler;
protected static ConfiguredTasks configuredTasks;
/**
* @return the configuredTasks
*/
public static ConfiguredTasks getConfiguredTasks() {
return configuredTasks;
}
/** /**
* @return the ctx * @return the ctx
*/ */
@ -351,11 +361,11 @@ public class SmartExecutorInitalizator extends ApplicationLifecycleHandler {
logger.trace("Going to Run Configured Tasks"); logger.trace("Going to Run Configured Tasks");
try { try {
Parser taskConfiguration = new Parser(ctx.persistence().location()); configuredTasks = new ConfiguredTasks(ctx.persistence().location());
List<JSONLaunchParameter> configuredTasks = taskConfiguration.getConfiguredTasks(); List<JSONLaunchParameter> configuredTaskList = configuredTasks.getConfiguredTasks();
SmartExecutorImpl smartExecutorImpl = new SmartExecutorImpl(); SmartExecutorImpl smartExecutorImpl = new SmartExecutorImpl();
for(LaunchParameter parameter : configuredTasks){ for(LaunchParameter parameter : configuredTaskList){
try { try {
smartExecutorImpl.launch(parameter); smartExecutorImpl.launch(parameter);
} catch (Exception e) { } catch (Exception e) {

View File

@ -3,12 +3,15 @@
*/ */
package org.gcube.vremanagement.executor.configuration; package org.gcube.vremanagement.executor.configuration;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException; import java.text.ParseException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.gcube.vremanagement.executor.api.types.LaunchParameter; import org.apache.commons.io.FileUtils;
import org.gcube.vremanagement.executor.api.types.Scheduling; import org.gcube.vremanagement.executor.api.types.Scheduling;
import org.gcube.vremanagement.executor.utils.IOUtility; import org.gcube.vremanagement.executor.utils.IOUtility;
import org.json.JSONArray; import org.json.JSONArray;
@ -21,12 +24,12 @@ import org.slf4j.LoggerFactory;
* @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/
* *
*/ */
public class Parser { public class ConfiguredTasks {
/** /**
* Logger * Logger
*/ */
private static Logger logger = LoggerFactory.getLogger(Parser.class); private static Logger logger = LoggerFactory.getLogger(ConfiguredTasks.class);
protected String configurationFileLocation; protected String configurationFileLocation;
protected List<JSONLaunchParameter> configuredTasks; protected List<JSONLaunchParameter> configuredTasks;
@ -34,7 +37,7 @@ public class Parser {
public static final String CONFIG_TASK_FILENAME = "definedTasks.json"; public static final String CONFIG_TASK_FILENAME = "definedTasks.json";
public Parser(String location) throws IOException, JSONException { public ConfiguredTasks(String location) throws IOException, JSONException {
this.configurationFileLocation = location; this.configurationFileLocation = location;
this.configuredTasks = new ArrayList<JSONLaunchParameter>(); this.configuredTasks = new ArrayList<JSONLaunchParameter>();
this.configuredTasks = retriveConfiguredTask(); this.configuredTasks = retriveConfiguredTask();
@ -44,9 +47,14 @@ public class Parser {
return new JSONScheduling(jsonObject); return new JSONScheduling(jsonObject);
} }
protected static String configurationFileName(String configurationFileLocation){
return configurationFileLocation + "/" + CONFIG_TASK_FILENAME;
}
protected List<JSONLaunchParameter> retriveConfiguredTask() throws IOException, JSONException { protected List<JSONLaunchParameter> retriveConfiguredTask() throws IOException, JSONException {
String configuredTasksDefinition = IOUtility.readFile(configurationFileLocation + "/" + CONFIG_TASK_FILENAME); String configuredTasksDefinition = IOUtility.readFile(configurationFileName(configurationFileLocation));
List<JSONLaunchParameter> tasks = new ArrayList<JSONLaunchParameter>(); List<JSONLaunchParameter> tasks = new ArrayList<JSONLaunchParameter>();
JSONArray jsonArray = new JSONArray(configuredTasksDefinition); JSONArray jsonArray = new JSONArray(configuredTasksDefinition);
@ -63,8 +71,23 @@ public class Parser {
return tasks; return tasks;
} }
public void addLaunch(LaunchParameter parameter) throws ParseException { protected void emptyConfigurationFile(String fileName) throws FileNotFoundException {
configuredTasks.add(new JSONLaunchParameter(parameter)); PrintWriter writer = new PrintWriter(fileName);
writer.print("");
writer.close();
}
public synchronized void addLaunch(JSONLaunchParameter parameter) throws ParseException, JSONException, IOException {
configuredTasks.add(parameter);
String fileName = configurationFileName(configurationFileLocation);
JSONArray jsonArray = new JSONArray();
for(JSONLaunchParameter jsonLaunchParameter : configuredTasks){
jsonArray.put(jsonLaunchParameter.toJSON());
}
String jsonArrayString = jsonArray.toString();
emptyConfigurationFile(fileName);
FileUtils.writeStringToFile(new File(fileName), jsonArrayString);
} }
/** /**

View File

@ -5,8 +5,10 @@ package org.gcube.vremanagement.executor.configuration;
import java.text.ParseException; import java.text.ParseException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
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.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -28,6 +30,24 @@ public class JSONLaunchParameter extends LaunchParameter {
@SuppressWarnings("unused") @SuppressWarnings("unused")
private JSONLaunchParameter(){} private JSONLaunchParameter(){}
public JSONLaunchParameter(String pluginName, Map<String, Object> inputs) {
super(pluginName, inputs);
}
public JSONLaunchParameter(String pluginName, Map<String, Object> inputs, boolean persist) {
super(pluginName, inputs, persist);
}
public JSONLaunchParameter(String pluginName, Map<String, Object> inputs, Scheduling scheduling) throws ParseException {
super(pluginName, inputs, scheduling);
this.scheduling = new JSONScheduling(scheduling);
}
public JSONLaunchParameter(String pluginName, Map<String, Object> inputs, boolean persist, Scheduling scheduling) throws ParseException {
super(pluginName, inputs, persist, scheduling);
this.scheduling = new JSONScheduling(scheduling);
}
public JSONLaunchParameter(LaunchParameter parameter) throws ParseException { public JSONLaunchParameter(LaunchParameter parameter) throws ParseException {
super(parameter.getPluginName(), parameter.getInputs(), parameter.isPersist()); super(parameter.getPluginName(), parameter.getInputs(), parameter.isPersist());
this.scheduling = new JSONScheduling(parameter.getScheduling()); this.scheduling = new JSONScheduling(parameter.getScheduling());
@ -71,4 +91,24 @@ public class JSONLaunchParameter extends LaunchParameter {
public void setScheduling(JSONScheduling scheduling) { public void setScheduling(JSONScheduling scheduling) {
this.scheduling = scheduling; this.scheduling = scheduling;
} }
public JSONObject toJSON() throws JSONException {
JSONObject obj = new JSONObject();
obj.put(PLUGIN_NAME, pluginName);
JSONObject inputJsonObject = new JSONObject();
for(String id : inputs.keySet()){
inputJsonObject.put(id, inputs.get(id));
}
obj.put(INPUTS, inputJsonObject);
if(scheduling!=null){
obj.put(SCHEDULING, scheduling.toJSON());
}
obj.put(PERSIST, true);
return obj;
}
} }

View File

@ -5,6 +5,7 @@ package org.gcube.vremanagement.executor.configuration;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -24,10 +25,10 @@ public class ParserTest {
public static final String TEST = "test"; public static final String TEST = "test";
@Test @Test
public void testLaunchConfiguredTask() throws IOException, JSONException { public void testLaunchConfiguredTask() throws IOException, JSONException, ParseException {
String location = new File(".").getAbsolutePath(); String location = new File(".").getAbsolutePath();
location = location + "/src/test/resources"; location = location + "/src/test/resources";
Parser parser = new Parser(location); ConfiguredTasks parser = new ConfiguredTasks(location);
List<JSONLaunchParameter> configuredTasks = parser.getConfiguredTasks(); List<JSONLaunchParameter> configuredTasks = parser.getConfiguredTasks();
Assert.assertEquals(3, configuredTasks.size()); Assert.assertEquals(3, configuredTasks.size());
@ -60,5 +61,8 @@ public class ParserTest {
Assert.assertEquals(3, inputs.get(TEST)); Assert.assertEquals(3, inputs.get(TEST));
Assert.assertEquals(null, parameter.getScheduling()); Assert.assertEquals(null, parameter.getScheduling());
Assert.assertEquals(true, parameter.isPersist()); Assert.assertEquals(true, parameter.isPersist());
JSONLaunchParameter added = new JSONLaunchParameter(HelloWorldPluginDeclaration.NAME, inputs, true);
parser.addLaunch(added);
} }
} }