Repository: zeppelin Updated Branches: refs/heads/master 5d09a7f83 -> 53e6f743d
ZEPPELIN-3106. User impersonation in SPARK is not working ### What is this PR for? This PR is for trying to fix the impersonation of spark interpreter in master branch. For spark impersonation, we don't need to ssh, just adding `--proxy-user` is enough. ### What type of PR is it? [Bug Fix] ### Todos * [ ] - Task ### What is the Jira issue? * https://issues.apache.org/jira/browse/ZEPPELIN-3106 ### How should this be tested? * Manually verified. ### Screenshots (if appropriate) ### Questions: * Does the licenses files need update? No * Is there breaking changes for older versions? No * Does this needs documentation? No Author: Jeff Zhang <zjf...@apache.org> Closes #2705 from zjffdu/ZEPPELIN-3106 and squashes the following commits: 2a6cb14 [Jeff Zhang] address comment d8a7d50 [Jeff Zhang] ZEPPELIN-3106. User impersonation in SPARK is not working Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/53e6f743 Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/53e6f743 Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/53e6f743 Branch: refs/heads/master Commit: 53e6f743d434ff5ca787db26c8e3740cb16f9e5d Parents: 5d09a7f Author: Jeff Zhang <zjf...@apache.org> Authored: Fri Dec 22 06:22:48 2017 +0800 Committer: Jeff Zhang <zjf...@apache.org> Committed: Fri Dec 22 16:26:20 2017 +0800 ---------------------------------------------------------------------- bin/interpreter.sh | 24 +++++++++++--------- .../interpreter/launcher/InterpreterClient.java | 2 +- .../launcher/InterpreterLaunchContext.java | 7 ++++++ .../interpreter/InterpreterSetting.java | 3 ++- .../interpreter/ManagedInterpreterGroup.java | 5 ++-- .../launcher/ShellScriptLauncher.java | 8 +++---- .../launcher/SparkInterpreterLauncher.java | 13 +++++++---- .../remote/RemoteInterpreterManagedProcess.java | 14 +++++++++--- .../remote/RemoteInterpreterRunningProcess.java | 2 +- .../launcher/ShellScriptLauncherTest.java | 4 +++- .../launcher/SparkInterpreterLauncherTest.java | 13 ++++++----- 11 files changed, 61 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/bin/interpreter.sh ---------------------------------------------------------------------- diff --git a/bin/interpreter.sh b/bin/interpreter.sh index f23ca82..687d8a9 100755 --- a/bin/interpreter.sh +++ b/bin/interpreter.sh @@ -16,6 +16,7 @@ # limitations under the License. # + bin=$(dirname "${BASH_SOURCE-$0}") bin=$(cd "${bin}">/dev/null; pwd) @@ -50,11 +51,6 @@ while getopts "hc:p:r:d:l:v:u:g:" o; do ;; u) ZEPPELIN_IMPERSONATE_USER="${OPTARG}" - if [[ -z "$ZEPPELIN_IMPERSONATE_CMD" ]]; then - ZEPPELIN_IMPERSONATE_RUN_CMD=`echo "ssh ${ZEPPELIN_IMPERSONATE_USER}@localhost" ` - else - ZEPPELIN_IMPERSONATE_RUN_CMD=$(eval "echo ${ZEPPELIN_IMPERSONATE_CMD} ") - fi ;; g) INTERPRETER_SETTING_NAME=${OPTARG} @@ -96,6 +92,15 @@ INTERPRETER_ID=$(basename "${INTERPRETER_DIR}") ZEPPELIN_PID="${ZEPPELIN_PID_DIR}/zeppelin-interpreter-${INTERPRETER_ID}-${ZEPPELIN_IDENT_STRING}-${HOSTNAME}.pid" ZEPPELIN_LOGFILE="${ZEPPELIN_LOG_DIR}/zeppelin-interpreter-${INTERPRETER_SETTING_NAME}-" +if [[ -z "$ZEPPELIN_IMPERSONATE_CMD" ]]; then + if [[ "${INTERPRETER_ID}" != "spark" || "$ZEPPELIN_IMPERSONATE_SPARK_PROXY_USER" == "false" ]]; then + ZEPPELIN_IMPERSONATE_RUN_CMD=`echo "ssh ${ZEPPELIN_IMPERSONATE_USER}@localhost" ` + fi +else + ZEPPELIN_IMPERSONATE_RUN_CMD=$(eval "echo ${ZEPPELIN_IMPERSONATE_CMD} ") +fi + + if [[ ! -z "$ZEPPELIN_IMPERSONATE_USER" ]]; then ZEPPELIN_LOGFILE+="${ZEPPELIN_IMPERSONATE_USER}-" fi @@ -195,7 +200,7 @@ fi addJarInDirForIntp "${LOCAL_INTERPRETER_REPO}" -if [[ ! -z "$ZEPPELIN_IMPERSONATE_USER" ]]; then +if [[ ! -z "$ZEPPELIN_IMPERSONATE_USER" && "${INTERPRETER_ID}" != "spark" ]]; then suid="$(id -u ${ZEPPELIN_IMPERSONATE_USER})" if [[ -n "${suid}" || -z "${SPARK_SUBMIT}" ]]; then INTERPRETER_RUN_COMMAND=${ZEPPELIN_IMPERSONATE_RUN_CMD}" '" @@ -206,15 +211,12 @@ if [[ ! -z "$ZEPPELIN_IMPERSONATE_USER" ]]; then fi if [[ -n "${SPARK_SUBMIT}" ]]; then - if [[ -n "$ZEPPELIN_IMPERSONATE_USER" ]] && [[ "$ZEPPELIN_IMPERSONATE_SPARK_PROXY_USER" != "false" ]]; then - INTERPRETER_RUN_COMMAND+=' '` echo ${SPARK_SUBMIT} --class ${ZEPPELIN_SERVER} --driver-class-path \"${ZEPPELIN_INTP_CLASSPATH_OVERRIDES}:${ZEPPELIN_INTP_CLASSPATH}\" --driver-java-options \"${JAVA_INTP_OPTS}\" ${SPARK_SUBMIT_OPTIONS} ${ZEPPELIN_SPARK_CONF} --proxy-user ${ZEPPELIN_IMPERSONATE_USER} ${SPARK_APP_JAR} ${CALLBACK_HOST} ${PORT} ${INTP_PORT}` - else - INTERPRETER_RUN_COMMAND+=' '` echo ${SPARK_SUBMIT} --class ${ZEPPELIN_SERVER} --driver-class-path \"${ZEPPELIN_INTP_CLASSPATH_OVERRIDES}:${ZEPPELIN_INTP_CLASSPATH}\" --driver-java-options \"${JAVA_INTP_OPTS}\" ${SPARK_SUBMIT_OPTIONS} ${ZEPPELIN_SPARK_CONF} ${SPARK_APP_JAR} ${CALLBACK_HOST} ${PORT} ${INTP_PORT}` - fi + INTERPRETER_RUN_COMMAND+=' '` echo ${SPARK_SUBMIT} --class ${ZEPPELIN_SERVER} --driver-class-path \"${ZEPPELIN_INTP_CLASSPATH_OVERRIDES}:${ZEPPELIN_INTP_CLASSPATH}\" --driver-java-options \"${JAVA_INTP_OPTS}\" ${SPARK_SUBMIT_OPTIONS} ${ZEPPELIN_SPARK_CONF} ${SPARK_APP_JAR} ${CALLBACK_HOST} ${PORT} ${INTP_PORT}` else INTERPRETER_RUN_COMMAND+=' '` echo ${ZEPPELIN_RUNNER} ${JAVA_INTP_OPTS} ${ZEPPELIN_INTP_MEM} -cp ${ZEPPELIN_INTP_CLASSPATH_OVERRIDES}:${ZEPPELIN_INTP_CLASSPATH} ${ZEPPELIN_SERVER} ${CALLBACK_HOST} ${PORT} ${INTP_PORT}` fi + if [[ ! -z "$ZEPPELIN_IMPERSONATE_USER" ]] && [[ -n "${suid}" || -z "${SPARK_SUBMIT}" ]]; then INTERPRETER_RUN_COMMAND+="'" fi http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterClient.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterClient.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterClient.java index 813dad8..26da270 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterClient.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterClient.java @@ -26,7 +26,7 @@ public interface InterpreterClient { String getInterpreterSettingName(); - void start(String userName, Boolean isUserImpersonate); + void start(String userName); void stop(); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterLaunchContext.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterLaunchContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterLaunchContext.java index 6901e2c..28c40f2 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterLaunchContext.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/launcher/InterpreterLaunchContext.java @@ -30,6 +30,7 @@ public class InterpreterLaunchContext { private Properties properties; private InterpreterOption option; private InterpreterRunner runner; + private String userName; private String interpreterGroupId; private String interpreterSettingId; private String interpreterSettingGroup; @@ -38,6 +39,7 @@ public class InterpreterLaunchContext { public InterpreterLaunchContext(Properties properties, InterpreterOption option, InterpreterRunner runner, + String userName, String interpreterGroupId, String interpreterSettingId, String interpreterSettingGroup, @@ -45,6 +47,7 @@ public class InterpreterLaunchContext { this.properties = properties; this.option = option; this.runner = runner; + this.userName = userName; this.interpreterGroupId = interpreterGroupId; this.interpreterSettingId = interpreterSettingId; this.interpreterSettingGroup = interpreterSettingGroup; @@ -78,4 +81,8 @@ public class InterpreterLaunchContext { public String getInterpreterSettingName() { return interpreterSettingName; } + + public String getUserName() { + return userName; + } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java index 424aa27..397ae10 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java @@ -699,13 +699,14 @@ public class InterpreterSetting { } synchronized RemoteInterpreterProcess createInterpreterProcess(String interpreterGroupId, + String userName, Properties properties) throws IOException { if (launcher == null) { createLauncher(); } InterpreterLaunchContext launchContext = new - InterpreterLaunchContext(properties, option, interpreterRunner, + InterpreterLaunchContext(properties, option, interpreterRunner, userName, interpreterGroupId, id, group, name); RemoteInterpreterProcess process = (RemoteInterpreterProcess) launcher.launch(launchContext); process.setRemoteInterpreterEventPoller( http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java index 641c0ac..d21a34d 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ManagedInterpreterGroup.java @@ -60,10 +60,11 @@ public class ManagedInterpreterGroup extends InterpreterGroup { throws IOException { if (remoteInterpreterProcess == null) { LOGGER.info("Create InterpreterProcess for InterpreterGroup: " + getId()); - remoteInterpreterProcess = interpreterSetting.createInterpreterProcess(id, properties); + remoteInterpreterProcess = interpreterSetting.createInterpreterProcess(id, userName, + properties); synchronized (remoteInterpreterProcess) { if (!remoteInterpreterProcess.isRunning()) { - remoteInterpreterProcess.start(userName, false); + remoteInterpreterProcess.start(userName); remoteInterpreterProcess.getRemoteInterpreterEventPoller() .setInterpreterProcess(remoteInterpreterProcess); remoteInterpreterProcess.getRemoteInterpreterEventPoller().setInterpreterGroup(this); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncher.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncher.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncher.java index 6ddcacf..e107fb7 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncher.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncher.java @@ -84,15 +84,15 @@ public class ShellScriptLauncher extends InterpreterLauncher { runner != null ? runner.getPath() : zConf.getInterpreterRemoteRunnerPath(), zConf.getCallbackPortRange(), zConf.getInterpreterPortRange(), zConf.getInterpreterDir() + "/" + groupName, localRepoPath, - buildEnvFromProperties(), connectTimeout, name); + buildEnvFromProperties(context), connectTimeout, name, option.isUserImpersonate()); } } - protected Map<String, String> buildEnvFromProperties() { + protected Map<String, String> buildEnvFromProperties(InterpreterLaunchContext context) { Map<String, String> env = new HashMap<>(); - for (Object key : properties.keySet()) { + for (Object key : context.getProperties().keySet()) { if (RemoteInterpreterUtils.isEnvString((String) key)) { - env.put((String) key, properties.getProperty((String) key)); + env.put((String) key, context.getProperties().getProperty((String) key)); } } return env; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncher.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncher.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncher.java index e8a9cdf..c462f0a 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncher.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncher.java @@ -41,7 +41,7 @@ public class SparkInterpreterLauncher extends ShellScriptLauncher { } @Override - protected Map<String, String> buildEnvFromProperties() { + protected Map<String, String> buildEnvFromProperties(InterpreterLaunchContext context) { Map<String, String> env = new HashMap<String, String>(); Properties sparkProperties = new Properties(); String sparkMaster = getSparkMaster(properties); @@ -70,6 +70,11 @@ public class SparkInterpreterLauncher extends ShellScriptLauncher { for (String name : sparkProperties.stringPropertyNames()) { sparkConfBuilder.append(" --conf " + name + "=" + sparkProperties.getProperty(name)); } + String useProxyUserEnv = System.getenv("ZEPPELIN_IMPERSONATE_SPARK_PROXY_USER"); + if (context.getOption().isUserImpersonate() && (StringUtils.isBlank(useProxyUserEnv) || + !useProxyUserEnv.equals("false"))) { + sparkConfBuilder.append(" --proxy-user " + context.getUserName()); + } env.put("ZEPPELIN_SPARK_CONF", sparkConfBuilder.toString()); @@ -194,12 +199,12 @@ public class SparkInterpreterLauncher extends ShellScriptLauncher { } private String toShellFormat(String value) { - if (value.contains("\'") && value.contains("\"")) { + if (value.contains("'") && value.contains("\"")) { throw new RuntimeException("Spark property value could not contain both \" and '"); - } else if (value.contains("\'")) { + } else if (value.contains("'")) { return "\"" + value + "\""; } else { - return "\'" + value + "\'"; + return "'" + value + "'"; } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java index 3dd5bfa..b186e48 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java @@ -63,6 +63,7 @@ public class RemoteInterpreterManagedProcess extends RemoteInterpreterProcess private final String interpreterDir; private final String localRepoDir; private final String interpreterSettingName; + private final boolean isUserImpersonated; private Map<String, String> env; @@ -74,7 +75,8 @@ public class RemoteInterpreterManagedProcess extends RemoteInterpreterProcess String localRepoDir, Map<String, String> env, int connectTimeout, - String interpreterSettingName) { + String interpreterSettingName, + boolean isUserImpersonated) { super(connectTimeout); this.interpreterRunner = intpRunner; this.callbackPortRange = callbackPortRange; @@ -83,6 +85,7 @@ public class RemoteInterpreterManagedProcess extends RemoteInterpreterProcess this.interpreterDir = intpDir; this.localRepoDir = localRepoDir; this.interpreterSettingName = interpreterSettingName; + this.isUserImpersonated = isUserImpersonated; } @Override @@ -96,7 +99,7 @@ public class RemoteInterpreterManagedProcess extends RemoteInterpreterProcess } @Override - public void start(String userName, Boolean isUserImpersonate) { + public void start(String userName) { // start server process final String callbackHost; final int callbackPort; @@ -161,7 +164,7 @@ public class RemoteInterpreterManagedProcess extends RemoteInterpreterProcess cmdLine.addArgument(Integer.toString(callbackPort), false); cmdLine.addArgument("-r", false); cmdLine.addArgument(interpreterPortRange, false); - if (isUserImpersonate && !userName.equals("anonymous")) { + if (isUserImpersonated && !userName.equals("anonymous")) { cmdLine.addArgument("-u", false); cmdLine.addArgument(userName, false); } @@ -272,6 +275,11 @@ public class RemoteInterpreterManagedProcess extends RemoteInterpreterProcess return interpreterRunner; } + @VisibleForTesting + public boolean isUserImpersonated() { + return isUserImpersonated; + } + public boolean isRunning() { return running.get(); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterRunningProcess.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterRunningProcess.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterRunningProcess.java index 0e87e4f..69daa6f 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterRunningProcess.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterRunningProcess.java @@ -58,7 +58,7 @@ public class RemoteInterpreterRunningProcess extends RemoteInterpreterProcess { } @Override - public void start(String userName, Boolean isUserImpersonate) { + public void start(String userName) { // assume process is externally managed. nothing to do } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncherTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncherTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncherTest.java index f7988e3..b7557ad 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncherTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/ShellScriptLauncherTest.java @@ -38,7 +38,8 @@ public class ShellScriptLauncherTest { properties.setProperty("ENV_1", "VALUE_1"); properties.setProperty("property_1", "value_1"); InterpreterOption option = new InterpreterOption(); - InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "intpGroupId", "groupId", "groupName", "name"); + option.setUserImpersonate(true); + InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "user1", "intpGroupId", "groupId", "groupName", "name"); InterpreterClient client = launcher.launch(context); assertTrue( client instanceof RemoteInterpreterManagedProcess); RemoteInterpreterManagedProcess interpreterProcess = (RemoteInterpreterManagedProcess) client; @@ -48,6 +49,7 @@ public class ShellScriptLauncherTest { assertEquals(zConf.getInterpreterRemoteRunnerPath(), interpreterProcess.getInterpreterRunner()); assertEquals(1, interpreterProcess.getEnv().size()); assertEquals("VALUE_1", interpreterProcess.getEnv().get("ENV_1")); + assertEquals(true, interpreterProcess.isUserImpersonated()); } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/53e6f743/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncherTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncherTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncherTest.java index 3d7e251..a3e6a9b 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncherTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/launcher/SparkInterpreterLauncherTest.java @@ -42,7 +42,7 @@ public class SparkInterpreterLauncherTest { properties.setProperty("spark.jars", "jar_1"); InterpreterOption option = new InterpreterOption(); - InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "intpGroupId", "groupId", "spark", "spark"); + InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "user1", "intpGroupId", "groupId", "spark", "spark"); InterpreterClient client = launcher.launch(context); assertTrue( client instanceof RemoteInterpreterManagedProcess); RemoteInterpreterManagedProcess interpreterProcess = (RemoteInterpreterManagedProcess) client; @@ -67,7 +67,7 @@ public class SparkInterpreterLauncherTest { properties.setProperty("spark.jars", "jar_1"); InterpreterOption option = new InterpreterOption(); - InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "intpGroupId", "groupId", "spark", "spark"); + InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "user1", "intpGroupId", "groupId", "spark", "spark"); InterpreterClient client = launcher.launch(context); assertTrue( client instanceof RemoteInterpreterManagedProcess); RemoteInterpreterManagedProcess interpreterProcess = (RemoteInterpreterManagedProcess) client; @@ -93,7 +93,7 @@ public class SparkInterpreterLauncherTest { properties.setProperty("spark.jars", "jar_1"); InterpreterOption option = new InterpreterOption(); - InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "intpGroupId", "groupId", "spark", "spark"); + InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "user1", "intpGroupId", "groupId", "spark", "spark"); InterpreterClient client = launcher.launch(context); assertTrue( client instanceof RemoteInterpreterManagedProcess); RemoteInterpreterManagedProcess interpreterProcess = (RemoteInterpreterManagedProcess) client; @@ -118,7 +118,7 @@ public class SparkInterpreterLauncherTest { properties.setProperty("spark.jars", "jar_1"); InterpreterOption option = new InterpreterOption(); - InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "intpGroupId", "groupId", "spark", "spark"); + InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "user1", "intpGroupId", "groupId", "spark", "spark"); InterpreterClient client = launcher.launch(context); assertTrue( client instanceof RemoteInterpreterManagedProcess); RemoteInterpreterManagedProcess interpreterProcess = (RemoteInterpreterManagedProcess) client; @@ -145,7 +145,8 @@ public class SparkInterpreterLauncherTest { properties.setProperty("spark.jars", "jar_1"); InterpreterOption option = new InterpreterOption(); - InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "intpGroupId", "groupId", "spark", "spark"); + option.setUserImpersonate(true); + InterpreterLaunchContext context = new InterpreterLaunchContext(properties, option, null, "user1", "intpGroupId", "groupId", "spark", "spark"); InterpreterClient client = launcher.launch(context); assertTrue( client instanceof RemoteInterpreterManagedProcess); RemoteInterpreterManagedProcess interpreterProcess = (RemoteInterpreterManagedProcess) client; @@ -156,6 +157,6 @@ public class SparkInterpreterLauncherTest { assertEquals(3, interpreterProcess.getEnv().size()); assertEquals("/user/spark", interpreterProcess.getEnv().get("SPARK_HOME")); assertEquals("true", interpreterProcess.getEnv().get("ZEPPELIN_SPARK_YARN_CLUSTER")); - assertEquals(" --master yarn --files .//conf/log4j_yarn_cluster.properties --conf spark.files='file_1' --conf spark.jars='jar_1' --conf spark.submit.deployMode='cluster' --conf spark.yarn.isPython=true", interpreterProcess.getEnv().get("ZEPPELIN_SPARK_CONF")); + assertEquals(" --master yarn --files .//conf/log4j_yarn_cluster.properties --conf spark.files='file_1' --conf spark.jars='jar_1' --conf spark.submit.deployMode='cluster' --conf spark.yarn.isPython=true --proxy-user user1", interpreterProcess.getEnv().get("ZEPPELIN_SPARK_CONF")); } }