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;
+  }
 }

Reply via email to