diff --git a/bin/interpreter.sh b/bin/interpreter.sh index 4fb4b269265..b1e1a157cb0 100755 --- a/bin/interpreter.sh +++ b/bin/interpreter.sh @@ -23,7 +23,7 @@ function usage() { echo "usage) $0 -p -d -l " } -while getopts "hp:d:l:v" o; do +while getopts "hp:d:l:v:u:" o; do case ${o} in h) usage @@ -42,6 +42,14 @@ while getopts "hp:d:l:v" o; do . "${bin}/common.sh" getZeppelinVersion ;; + 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 + ;; esac done @@ -178,9 +186,9 @@ addJarInDirForIntp "${LOCAL_INTERPRETER_REPO}" CLASSPATH+=":${ZEPPELIN_INTP_CLASSPATH}" if [[ -n "${SPARK_SUBMIT}" ]]; then - ${SPARK_SUBMIT} --class ${ZEPPELIN_SERVER} --driver-class-path "${ZEPPELIN_INTP_CLASSPATH_OVERRIDES}:${CLASSPATH}" --driver-java-options "${JAVA_INTP_OPTS}" ${SPARK_SUBMIT_OPTIONS} ${SPARK_APP_JAR} ${PORT} & + ${ZEPPELIN_IMPERSONATE_RUN_CMD} `${SPARK_SUBMIT} --class ${ZEPPELIN_SERVER} --driver-class-path "${ZEPPELIN_INTP_CLASSPATH_OVERRIDES}:${CLASSPATH}" --driver-java-options "${JAVA_INTP_OPTS}" ${SPARK_SUBMIT_OPTIONS} ${SPARK_APP_JAR} ${PORT} &` else - ${ZEPPELIN_RUNNER} ${JAVA_INTP_OPTS} ${ZEPPELIN_INTP_MEM} -cp ${ZEPPELIN_INTP_CLASSPATH_OVERRIDES}:${CLASSPATH} ${ZEPPELIN_SERVER} ${PORT} & + ${ZEPPELIN_IMPERSONATE_RUN_CMD} ${ZEPPELIN_RUNNER} ${JAVA_INTP_OPTS} ${ZEPPELIN_INTP_MEM} -cp ${ZEPPELIN_INTP_CLASSPATH_OVERRIDES}:${CLASSPATH} ${ZEPPELIN_SERVER} ${PORT} & fi pid=$! diff --git a/conf/zeppelin-env.sh.template b/conf/zeppelin-env.sh.template index 5263cadbde2..a35adba663c 100644 --- a/conf/zeppelin-env.sh.template +++ b/conf/zeppelin-env.sh.template @@ -79,3 +79,4 @@ # export ZEPPELINHUB_API_ADDRESS # Refers to the address of the ZeppelinHub service in use # export ZEPPELINHUB_API_TOKEN # Refers to the Zeppelin instance token of the user # export ZEPPELINHUB_USER_KEY # Optional, when using Zeppelin with authentication. +# export ZEPPELIN_IMPERSONATE_CMD # Optional, when user want to run interpreter as end web user. eg) 'sudo -u ${ZEPPELIN_IMPERSONATE_USER}' diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index 1b1fdbf1035..c74e7ff4285 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -45,6 +45,7 @@
  • Interpreter Installation
  • Interpreter Dependency Management
  • +
  • Interpreter User Impersonation
  • Available Interpreters
  • Alluxio
  • diff --git a/docs/assets/themes/zeppelin/img/screenshots/user-impersonation.gif b/docs/assets/themes/zeppelin/img/screenshots/user-impersonation.gif new file mode 100644 index 00000000000..eb39bc8dac8 Binary files /dev/null and b/docs/assets/themes/zeppelin/img/screenshots/user-impersonation.gif differ diff --git a/docs/index.md b/docs/index.md index 0f257500eec..c3c0a482c89 100644 --- a/docs/index.md +++ b/docs/index.md @@ -141,6 +141,7 @@ Join to our [Mailing list](https://zeppelin.apache.org/community.html) and repor * Usage * [Interpreter Installation](./manual/interpreterinstallation.html): Install not only community managed interpreters but also 3rd party interpreters * [Interpreter Dependency Management](./manual/dependencymanagement.html) when you include external libraries to interpreter + * [Interpreter User Impersonation](./manual/userimpersonation.html) when you want to run interpreter as end user * Available Interpreters: currently, about 20 interpreters are available in Apache Zeppelin. ####Display System diff --git a/docs/manual/processenduser.md b/docs/manual/processenduser.md new file mode 100644 index 00000000000..363c62dbc53 --- /dev/null +++ b/docs/manual/processenduser.md @@ -0,0 +1,66 @@ +--- +layout: page +title: "Run zeppelin interpreter process as web front end user" +description: "Set up zeppelin interpreter process as web front end user." +group: manual +--- + +{% include JB/setup %} + +## Run zeppelin interpreter process as web front end user + + * Enable shiro auth in shiro.ini + +``` +[users] +user1 = password1, role1 +user2 = password2, role2 +``` + + * Enable password-less ssh for the user you want to impersonate (say user1). + +``` +adduser user1 +#ssh-keygen (optional if you don't already have generated ssh-key. +ssh user1@localhost mkdir -p .ssh +cat ~/.ssh/id_rsa.pub | ssh user1@localhost 'cat >> .ssh/authorized_keys' +``` + + * Start zeppelin server. + +
    +
    +
    + Screenshot +

    +
    +
    + + + + +
    +
    +
    + + * Go to interpreter setting page, and enable "User Impersonate" in any of the interpreter (in my example its shell interpreter) + + * Test with a simple paragraph + +``` +%sh +whoami +``` + diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java index 6ab4d116427..3e789babf31 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOption.java @@ -37,6 +37,7 @@ public class InterpreterOption { boolean isExistingProcess; boolean setPermission; List users; + boolean isUserImpersonate; public boolean isExistingProcess() { return isExistingProcess; @@ -66,6 +67,14 @@ public List getUsers() { return users; } + public boolean isUserImpersonate() { + return isUserImpersonate; + } + + public void setUserImpersonate(boolean userImpersonate) { + isUserImpersonate = userImpersonate; + } + public InterpreterOption() { this(false); } diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java index 0ce7921de4a..b2a4fbef534 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java @@ -59,6 +59,8 @@ public class RemoteInterpreter extends Interpreter { private int maxPoolSize; private String host; private int port; + private String userName; + private Boolean isUserImpersonate; /** * Remote interpreter and manage interpreter process @@ -72,7 +74,9 @@ public RemoteInterpreter(Properties property, int connectTimeout, int maxPoolSize, RemoteInterpreterProcessListener remoteInterpreterProcessListener, - ApplicationEventListener appListener) { + ApplicationEventListener appListener, + String userName, + Boolean isUserImpersonate) { super(property); this.noteId = noteId; this.className = className; @@ -85,6 +89,8 @@ public RemoteInterpreter(Properties property, this.maxPoolSize = maxPoolSize; this.remoteInterpreterProcessListener = remoteInterpreterProcessListener; this.applicationEventListener = appListener; + this.userName = userName; + this.isUserImpersonate = isUserImpersonate; } @@ -100,7 +106,9 @@ public RemoteInterpreter( int connectTimeout, int maxPoolSize, RemoteInterpreterProcessListener remoteInterpreterProcessListener, - ApplicationEventListener appListener) { + ApplicationEventListener appListener, + String userName, + Boolean isUserImpersonate) { super(property); this.noteId = noteId; this.className = className; @@ -111,6 +119,8 @@ public RemoteInterpreter( this.maxPoolSize = maxPoolSize; this.remoteInterpreterProcessListener = remoteInterpreterProcessListener; this.applicationEventListener = appListener; + this.userName = userName; + this.isUserImpersonate = isUserImpersonate; } @@ -125,7 +135,9 @@ public RemoteInterpreter( Map env, int connectTimeout, RemoteInterpreterProcessListener remoteInterpreterProcessListener, - ApplicationEventListener appListener) { + ApplicationEventListener appListener, + String userName, + Boolean isUserImpersonate) { super(property); this.className = className; this.noteId = noteId; @@ -138,6 +150,8 @@ public RemoteInterpreter( this.maxPoolSize = 10; this.remoteInterpreterProcessListener = remoteInterpreterProcessListener; this.applicationEventListener = appListener; + this.userName = userName; + this.isUserImpersonate = isUserImpersonate; } private Map getEnvFromInterpreterProperty(Properties property) { @@ -205,7 +219,7 @@ public synchronized void init() { RemoteInterpreterProcess interpreterProcess = getInterpreterProcess(); final InterpreterGroup interpreterGroup = getInterpreterGroup(); - interpreterProcess.reference(interpreterGroup); + interpreterProcess.reference(interpreterGroup, userName, isUserImpersonate); interpreterProcess.setMaxPoolSize( Math.max(this.maxPoolSize, interpreterProcess.getMaxPoolSize())); String groupId = interpreterGroup.getId(); diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java index ddab105570b..f3d5f914852 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java @@ -88,7 +88,7 @@ public int getPort() { } @Override - public void start() { + public void start(String userName, Boolean isUserImpersonate) { // start server process try { port = RemoteInterpreterUtils.findRandomAvailablePortOnAllLocalInterfaces(); @@ -101,6 +101,10 @@ public void start() { cmdLine.addArgument(interpreterDir, false); cmdLine.addArgument("-p", false); cmdLine.addArgument(Integer.toString(port), false); + if (isUserImpersonate && !userName.equals("anonymous")) { + cmdLine.addArgument("-u", false); + cmdLine.addArgument(userName, false); + } cmdLine.addArgument("-l", false); cmdLine.addArgument(localRepoDir, false); diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcess.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcess.java index 62727bcee6b..c7b2205226d 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcess.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcess.java @@ -63,7 +63,7 @@ public RemoteInterpreterProcess( public abstract String getHost(); public abstract int getPort(); - public abstract void start(); + public abstract void start(String userName, Boolean isUserImpersonate); public abstract void stop(); public abstract boolean isRunning(); @@ -71,10 +71,11 @@ public int getConnectTimeout() { return connectTimeout; } - public int reference(InterpreterGroup interpreterGroup) { + public int reference(InterpreterGroup interpreterGroup, String userName, + Boolean isUserImpersonate) { synchronized (referenceCount) { if (!isRunning()) { - start(); + start(userName, isUserImpersonate); } if (clientPool == null) { diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterRunningProcess.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterRunningProcess.java index 42e6250e3ca..bb176bea590 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterRunningProcess.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterRunningProcess.java @@ -51,7 +51,7 @@ public int getPort() { } @Override - public void start() { + public void start(String userName, Boolean isUserImpersonate) { // assume process is externally managed. nothing to do } diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java index c8f665031df..e876ef93168 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java @@ -74,7 +74,9 @@ public void setUp() throws Exception { env, 10 * 1000, null, - null + null, + "anonymous", + false ); intpGroup.put("note", new LinkedList()); diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java index 2ba62c30172..bba9bb9f2be 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java @@ -71,7 +71,9 @@ private RemoteInterpreter createMockInterpreter() { env, 10 * 1000, this, - null); + null, + "anonymous", + false); intpGroup.get("note").add(intp); intp.setInterpreterGroup(intpGroup); diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcessTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcessTest.java index 01582821308..99ab63b34a7 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcessTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcessTest.java @@ -46,8 +46,8 @@ public void testStartStop() { 10 * 1000, null, null); assertFalse(rip.isRunning()); assertEquals(0, rip.referenceCount()); - assertEquals(1, rip.reference(intpGroup)); - assertEquals(2, rip.reference(intpGroup)); + assertEquals(1, rip.reference(intpGroup, "anonymous", false)); + assertEquals(2, rip.reference(intpGroup, "anonymous", false)); assertEquals(true, rip.isRunning()); assertEquals(1, rip.dereference()); assertEquals(true, rip.isRunning()); @@ -61,7 +61,7 @@ public void testClientFactory() throws Exception { RemoteInterpreterManagedProcess rip = new RemoteInterpreterManagedProcess( INTERPRETER_SCRIPT, "nonexists", "fakeRepo", new HashMap(), mock(RemoteInterpreterEventPoller.class), 10 * 1000); - rip.reference(intpGroup); + rip.reference(intpGroup, "anonymous", false); assertEquals(0, rip.getNumActiveClient()); assertEquals(0, rip.getNumIdleClient()); @@ -106,7 +106,7 @@ public void testStartStopRemoteInterpreter() throws TException, InterruptedExcep , 10 * 1000); assertFalse(rip.isRunning()); assertEquals(0, rip.referenceCount()); - assertEquals(1, rip.reference(intpGroup)); + assertEquals(1, rip.reference(intpGroup, "anonymous", false)); assertEquals(true, rip.isRunning()); } } diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java index bdb8edc04cd..ec7c02a8d4c 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java @@ -90,7 +90,9 @@ private RemoteInterpreter createMockInterpreterA(Properties p, String noteId) { env, 10 * 1000, null, - null); + null, + "anonymous", + false); } private RemoteInterpreter createMockInterpreterB(Properties p) { @@ -108,7 +110,9 @@ private RemoteInterpreter createMockInterpreterB(Properties p, String noteId) { env, 10 * 1000, null, - null); + null, + "anonymous", + false); } @Test @@ -207,7 +211,9 @@ public void testRemoteSchedulerSharing() throws TTransportException, IOException env, 10 * 1000, null, - null); + null, + "anonymous", + false); intpGroup.get("note").add(intpA); @@ -223,7 +229,9 @@ public void testRemoteSchedulerSharing() throws TTransportException, IOException env, 10 * 1000, null, - null); + null, + "anonymous", + false); intpGroup.get("note").add(intpB); intpB.setInterpreterGroup(intpGroup); @@ -687,7 +695,8 @@ public void should_push_local_angular_repo_to_remote() throws Exception { //Given final Client client = Mockito.mock(Client.class); final RemoteInterpreter intr = new RemoteInterpreter(new Properties(), "noteId", - MockInterpreterA.class.getName(), "runner", "path","localRepo", env, 10 * 1000, null, null); + MockInterpreterA.class.getName(), "runner", "path", "localRepo", env, 10 * 1000, null, + null, "anonymous", false); final AngularObjectRegistry registry = new AngularObjectRegistry("spark", null); registry.add("name", "DuyHai DOAN", "nodeId", "paragraphId"); final InterpreterGroup interpreterGroup = new InterpreterGroup("groupId"); @@ -733,7 +742,9 @@ public void testEnvronmentAndPropertySet() { env, 10 * 1000, null, - null); + null, + "anonymous", + false); intpGroup.put("note", new LinkedList()); intpGroup.get("note").add(intp); diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/resource/DistributedResourcePoolTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/resource/DistributedResourcePoolTest.java index 4bd2681bf15..b76f0635074 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/resource/DistributedResourcePoolTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/resource/DistributedResourcePoolTest.java @@ -70,7 +70,9 @@ public void setUp() throws Exception { env, 10 * 1000, null, - null + null, + "anonymous", + false ); intpGroup1 = new InterpreterGroup("intpGroup1"); @@ -88,7 +90,9 @@ public void setUp() throws Exception { env, 10 * 1000, null, - null + null, + "anonymous", + false ); intpGroup2 = new InterpreterGroup("intpGroup2"); diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/scheduler/RemoteSchedulerTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/scheduler/RemoteSchedulerTest.java index 49de4a70539..7fddb89c661 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/scheduler/RemoteSchedulerTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/scheduler/RemoteSchedulerTest.java @@ -81,7 +81,9 @@ public void test() throws Exception { env, 10 * 1000, this, - null); + null, + "anonymous", + false); intpGroup.put("note", new LinkedList()); intpGroup.get("note").add(intpA); @@ -170,7 +172,9 @@ public void testAbortOnPending() throws Exception { env, 10 * 1000, this, - null); + null, + "anonymous", + false); intpGroup.put("note", new LinkedList()); intpGroup.get("note").add(intpA); diff --git a/zeppelin-web/src/app/interpreter/interpreter-create/interpreter-create.html b/zeppelin-web/src/app/interpreter/interpreter-create/interpreter-create.html index 2407e82d690..bae234a2408 100644 --- a/zeppelin-web/src/app/interpreter/interpreter-create/interpreter-create.html +++ b/zeppelin-web/src/app/interpreter/interpreter-create/interpreter-create.html @@ -196,7 +196,20 @@
    Option
    -
    +
    +
    +
    + + + +
    +
    +
    +
    diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index e4bebebd6c6..2e29929c1c9 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -326,6 +326,13 @@ if (setting.option.setPermission === undefined) { setting.option.setPermission = false; } + if (setting.option.isUserImpersonate === undefined) { + setting.option.isUserImpersonate = false; + } + if (!($scope.getInterpreterRunningOption(settingId) === 'Per User' && + $scope.getPerUserOption(settingId) === 'isolated')) { + setting.option.isUserImpersonate = false; + } if (setting.option.remote === undefined) { // remote always true for now setting.option.remote = true; diff --git a/zeppelin-web/src/app/interpreter/interpreter.html b/zeppelin-web/src/app/interpreter/interpreter.html index abb83d8a65e..7cb01a32cc5 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.html +++ b/zeppelin-web/src/app/interpreter/interpreter.html @@ -309,7 +309,23 @@
    Option
    -
    + +
    +
    +
    + + + +
    +
    +
    +
    diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java index ce740b73f92..2d66ed9ded8 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java @@ -776,10 +776,10 @@ public void createInterpretersForNote(InterpreterSetting interpreterSetting, Str if (option.isExistingProcess()) { interpreter = connectToRemoteRepl(noteId, info.getClassName(), option.getHost(), option.getPort(), - properties); + properties, user, option.isUserImpersonate); } else { interpreter = createRemoteRepl(path, key, info.getClassName(), properties, - interpreterSetting.getId()); + interpreterSetting.getId(), user, option.isUserImpersonate()); } } else { interpreter = createRepl(interpreterSetting.getPath(), info.getClassName(), properties); @@ -1098,17 +1098,18 @@ private Interpreter createRepl(String dirName, String className, Properties prop } private Interpreter connectToRemoteRepl(String noteId, String className, String host, int port, - Properties property) { + Properties property, String userName, Boolean isUserImpersonate) { int connectTimeout = conf.getInt(ConfVars.ZEPPELIN_INTERPRETER_CONNECT_TIMEOUT); int maxPoolSize = conf.getInt(ConfVars.ZEPPELIN_INTERPRETER_MAX_POOL_SIZE); LazyOpenInterpreter intp = new LazyOpenInterpreter( new RemoteInterpreter(property, noteId, className, host, port, connectTimeout, maxPoolSize, - remoteInterpreterProcessListener, appEventListener)); + remoteInterpreterProcessListener, appEventListener, userName, isUserImpersonate)); return intp; } private Interpreter createRemoteRepl(String interpreterPath, String noteId, String className, - Properties property, String interpreterSettingId) { + Properties property, String interpreterSettingId, String userName, + Boolean isUserImpersonate) { int connectTimeout = conf.getInt(ConfVars.ZEPPELIN_INTERPRETER_CONNECT_TIMEOUT); String localRepoPath = conf.getInterpreterLocalRepoPath() + "/" + interpreterSettingId; int maxPoolSize = conf.getInt(ConfVars.ZEPPELIN_INTERPRETER_MAX_POOL_SIZE); @@ -1116,7 +1117,7 @@ private Interpreter createRemoteRepl(String interpreterPath, String noteId, Stri RemoteInterpreter remoteInterpreter = new RemoteInterpreter(property, noteId, className, conf.getInterpreterRemoteRunnerPath(), interpreterPath, localRepoPath, connectTimeout, maxPoolSize, - remoteInterpreterProcessListener, appEventListener); + remoteInterpreterProcessListener, appEventListener, userName, isUserImpersonate); remoteInterpreter.addEnv(env); return new LazyOpenInterpreter(remoteInterpreter); @@ -1412,7 +1413,7 @@ private Interpreter getDevInterpreter() { InterpreterGroup interpreterGroup = createInterpreterGroup("dev", option); devInterpreter = connectToRemoteRepl("dev", DevInterpreter.class.getName(), "localhost", - ZeppelinDevServer.DEFAULT_TEST_INTERPRETER_PORT, new Properties()); + ZeppelinDevServer.DEFAULT_TEST_INTERPRETER_PORT, new Properties(), "anonymous", false); LinkedList intpList = new LinkedList<>(); intpList.add(devInterpreter); diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index a1daeb5471e..a536978db49 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -589,7 +589,7 @@ public String getMagic() { } private boolean isValidInterpreter(String replName) { - return factory.getInterpreter("", + return factory.getInterpreter(user, note.getId(), replName) != null; } }