package io.seqware.pipeline.plugins;
import io.seqware.pipeline.api.WorkflowTools;
import io.seqware.pipeline.engines.whitestar.Persistence;
import io.seqware.pipeline.engines.whitestar.WhiteStarWorkflowEngine;
import java.io.File;
import java.util.Arrays;
import joptsimple.ArgumentAcceptingOptionSpec;
import net.sourceforge.seqware.common.model.WorkflowRun;
import net.sourceforge.seqware.common.module.ReturnValue;
import net.sourceforge.seqware.common.module.ReturnValue.ExitStatus;
import net.sourceforge.seqware.pipeline.plugin.Plugin;
import net.sourceforge.seqware.pipeline.plugin.PluginInterface;
import net.sourceforge.seqware.pipeline.workflowV2.AbstractWorkflowDataModel;
import net.sourceforge.seqware.pipeline.workflowV2.WorkflowDataModelFactory;
import org.openide.util.lookup.ServiceProvider;
/**
* The Workflow relauncher is only responsible for relaunching failed workflows.
*
* This started as a fork of the WorkflowWatcher since it uses a similar path to initialize the workflow data model. This is only currently
* applicable for SeqWare Whitestar.
*
* @author dyuen
*/
@ServiceProvider(service = PluginInterface.class)
public class WorkflowRelauncher extends Plugin {
private final ArgumentAcceptingOptionSpec<String> nfsWorkDir;
public WorkflowRelauncher() {
super();
parser.acceptsAll(Arrays.asList("help", "h", "?"), "Provides this help message.");
this.nfsWorkDir = parser
.acceptsAll(Arrays.asList("working-dir", "w"), "Required: The working directory of the workflow run to watch")
.withRequiredArg().ofType(String.class).required();
}
@Override
public ReturnValue init() {
return new ReturnValue(ExitStatus.SUCCESS);
}
@Override
public ReturnValue do_test() {
return new ReturnValue(ExitStatus.SUCCESS);
}
@Override
public ReturnValue clean_up() {
return new ReturnValue(ExitStatus.SUCCESS);
}
@Override
public String get_description() {
return "A plugin that lets you re-launch failed workflow runs.";
}
@Override
public ReturnValue do_run() {
File workDir = new File(options.valueOf(nfsWorkDir));
Persistence persistence = new Persistence(workDir);
WorkflowRun workflowRun = persistence.readWorkflowRun();
Integer workflowAccession = workflowRun.getWorkflowAccession();
String bundleDir = workflowRun.getWorkflow().getCwd();
WorkflowDataModelFactory factory = new WorkflowDataModelFactory(config, metadata);
AbstractWorkflowDataModel dataModel = factory.getWorkflowDataModel(bundleDir, workflowAccession, workflowRun.getSwAccession(),
workflowRun.getWorkflowEngine());
WhiteStarWorkflowEngine workflowEngine = (WhiteStarWorkflowEngine) WorkflowTools.getWorkflowEngine(dataModel, config, false);
workflowEngine.prepareWorkflow(dataModel, workDir);
workflowEngine.runWorkflow(persistence.readCompletedJobs());
return new ReturnValue();
}
}