SAMZA-1366: ScriptRunner should allow callers to control the child pr…
authorJacob Maes <jmaes@linkedin.com>
Wed, 2 Aug 2017 16:22:51 +0000 (09:22 -0700)
committerJacob Maes <jmaes@linkedin.com>
Wed, 2 Aug 2017 16:22:51 +0000 (09:22 -0700)
…ocess environment.

Author: Jacob Maes <jmaes@linkedin.com>

Reviewers: Jagadish <jvenkatr@linkedin.com>, Shanthoosh Venkataraman <svenkataraman@linkedin.com>

Closes #245 from jmakes/script-runner-improvements

samza-rest/src/main/java/org/apache/samza/rest/proxy/job/ScriptJobProxy.java
samza-rest/src/main/java/org/apache/samza/rest/script/ScriptRunner.java

index 2d14366..796671a 100644 (file)
@@ -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;
index b70a0f1..1eab067 100644 (file)
  */
 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;
+  }
 }