SAMZA-1366: ScriptRunner should allow callers to control the child prâ¦
â¦ocess environment. Author: Jacob Maes <jm...@linkedin.com> Reviewers: Jagadish <jvenk...@linkedin.com>, Shanthoosh Venkataraman <svenkatara...@linkedin.com> Closes #245 from jmakes/script-runner-improvements Project: http://git-wip-us.apache.org/repos/asf/samza/repo Commit: http://git-wip-us.apache.org/repos/asf/samza/commit/fde55644 Tree: http://git-wip-us.apache.org/repos/asf/samza/tree/fde55644 Diff: http://git-wip-us.apache.org/repos/asf/samza/diff/fde55644 Branch: refs/heads/0.14.0 Commit: fde5564407e97c2d4ed0efa15f4b25d45d0b9f6a Parents: c2b55dc Author: Jacob Maes <jm...@linkedin.com> Authored: Wed Aug 2 09:22:51 2017 -0700 Committer: Jacob Maes <jm...@linkedin.com> Committed: Wed Aug 2 09:22:51 2017 -0700 ---------------------------------------------------------------------- .../samza/rest/proxy/job/ScriptJobProxy.java | 1 + .../apache/samza/rest/script/ScriptRunner.java | 29 ++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/samza/blob/fde55644/samza-rest/src/main/java/org/apache/samza/rest/proxy/job/ScriptJobProxy.java ---------------------------------------------------------------------- diff --git a/samza-rest/src/main/java/org/apache/samza/rest/proxy/job/ScriptJobProxy.java b/samza-rest/src/main/java/org/apache/samza/rest/proxy/job/ScriptJobProxy.java index 2d14366..796671a 100644 --- a/samza-rest/src/main/java/org/apache/samza/rest/proxy/job/ScriptJobProxy.java +++ b/samza-rest/src/main/java/org/apache/samza/rest/proxy/job/ScriptJobProxy.java @@ -51,6 +51,7 @@ public abstract class ScriptJobProxy extends AbstractJobProxy implements ScriptP * @return the full path to the script. * @throws FileNotFoundException if the job installation path doesn't exist. */ + @Override public String getScriptPath(JobInstance jobInstance, String scriptName) throws FileNotFoundException { String scriptPath; http://git-wip-us.apache.org/repos/asf/samza/blob/fde55644/samza-rest/src/main/java/org/apache/samza/rest/script/ScriptRunner.java ---------------------------------------------------------------------- diff --git a/samza-rest/src/main/java/org/apache/samza/rest/script/ScriptRunner.java b/samza-rest/src/main/java/org/apache/samza/rest/script/ScriptRunner.java index b70a0f1..1eab067 100644 --- a/samza-rest/src/main/java/org/apache/samza/rest/script/ScriptRunner.java +++ b/samza-rest/src/main/java/org/apache/samza/rest/script/ScriptRunner.java @@ -18,11 +18,15 @@ */ package org.apache.samza.rest.script; +import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import org.apache.samza.SamzaException; import org.slf4j.Logger; @@ -39,6 +43,8 @@ public class ScriptRunner { private static final int DEFAULT_SCRIPT_CMD_TIMEOUT_S = 30; private int scriptTimeout = DEFAULT_SCRIPT_CMD_TIMEOUT_S; + private final Map<String, String> environment = new HashMap<>(); + protected long getScriptTimeoutS() { return scriptTimeout; } @@ -84,13 +90,21 @@ public class ScriptRunner { * @param args the command line args to pass to the script. * @return a {@link java.lang.ProcessBuilder} for the script and args. */ - private ProcessBuilder getProcessBuilder(String scriptPath, String[] args) { + private ProcessBuilder getProcessBuilder(String scriptPath, String[] args) throws FileNotFoundException { + if (!new File(scriptPath).exists()) { + throw new FileNotFoundException("Script file does not exist: " + scriptPath); + } + List<String> command = new ArrayList<>(args.length + 1); command.add(scriptPath); command.addAll(Arrays.asList(args)); log.debug("Building process with command {}", command); - return new ProcessBuilder(command); + ProcessBuilder pb = new ProcessBuilder(command); + + pb.environment().clear(); + pb.environment().putAll(environment); + return pb; } /** @@ -126,4 +140,15 @@ public class ScriptRunner { log.debug("Exit value {}", exitVal); return exitVal; } + + /** + * Gets the mutable map of environment variables to add to the child process environment. + * + * The structure is the same as {@link ProcessBuilder#environment()}, but this map starts empty. + * + * @return the mutable map of environment variables. + */ + public Map<String, String> environment() { + return environment; + } }