You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zeppelin.apache.org by Luis Angel Vicente Sanchez <lu...@bigcente.ch> on 2017/10/10 14:15:23 UTC
ZeppelinContext run method runs a paragraph as anonymous user
This is related to ticket
https://issues.apache.org/jira/browse/ZEPPELIN-2929.
This is the flow of a ZeppelinContext run request, when you want to run
a paragraph from a given notebook:
1. ZeppelinContext.run uses
ZeppelinContext.getInterpreterContextRunner to obtain a list of
InterpreterContextRunner. The call to
ZeppelinContext.getInterpreterContextRunner:
1.1 Obtains the RemoteWorksController from the interpreter
context (the only implementation is
RemoteInterpreterServer.ZeppelinRemoteWorksController)
1.2 Calls the method
ZeppelinRemoteWorksController.getRemoteContextRunner to obtain a
list of InterpreterContextRunner. The call to
ZeppelinRemoteWorksController.getRemoteContextRunner:
1.2.1 Creates a ZeppelinServerResourceParagraphRunner and
pass it to
RemoteInterpreterEventClient.getZeppelinServerNoteRunner of
the RemoteInterpreterServer passed to
ZeppelinRemoteWorksController.
1.2.2
RemoteInterpreterEventClient.getZeppelinServerNoteRunner
creates a RemoteZeppelinServerResource, of type
RemoteZeppelinServerResource.Type.PARAGRAPH_RUNNERS, with the
ZeppelinServerResourceParagraphRunner as data, and sends it
as the JSON payload of the event
RemoteInterpreterEventType.REMOTE_ZEPPELIN_SERVER_RESOURCE.
2. ZeppelinContext.run calls the run method of each of the
InterpreterContextRunner that it gets from
ZeppelinContext.getInterpreterContextRunner.
I found that the only place where the event
RemoteInterpreterEventType.REMOTE_ZEPPELIN_SERVER_RESOURCE is handled is
in the run method of RemoteInterpreterEventPoller:
1. The RemoteZeppelinServerResource is deserialised and passed to
RemoteInterpreterEventPoller.progressRemoteZeppelinControlEvent:
1.1. Setup a callback using the method
RemoteInterpreterProcessListener.onGetParagraphRunners.
1.2. The callback will create one
ZeppelinServerResourceParagraphRunner per
InterpreterContextRunner received.
1.3. It will create a RemoteZeppelinServerResource, with the list
of ZeppelinServerResourceParagraphRunner, as data and sends it
using a RemoteInterpreterService.Client.
No I think that this RemoteZeppelinServerResource is handled by
RemoteInterpreterServer.onReceivedZeppelinResource that create a
ParagraphRunner per element in the arraylist that you get as the payload
of RemoteZeppelinServerResource
I added several log messages to be sure that the previous flow was
correct, but I can't see any message coming from the callback passed to
RemoteInterpreterProcessListener.onGetParagraphRunners; the other
methods are called in the right sequence.
The changes I have done to try fixing the credentials propagation are
the following:
1. Add the AuthenticationInfo to InterpreterContextRunner.
2. Add the AuthenticationInfo to ParagraphRunner.
3. Add a RemoteWorksController.getRemoteContextRunner that receives
AuthenticationInfo as a 3rd parameter
(ZeppelinContext.getInterpreterContextRunner is calling this method
passing the AuthenticationInfo from the InterpreterContext)
4. Add the AuthenticationInfo to RemoteInterpreterContextRunner.
5. Add the AuthenticationInfo to
RemoteInterpreterProcessListener.onRemoteRunParagraph.
6. Recover and propagate AuthenticationInfo in
RemoteInterpreterEventPoller.run (call to
listener.onRemoteRunParagraph)
7. Recover AuthenticationInfo in
RemoteInterpreterServer.onReceivedZeppelinResource and create
ParagraphRunners using that.
8. Change RemoteInterpreterService.thrift to add authenticationInfo
as a String to ZeppelinServerResourceParagraphRunner.
9. Change NotebookServer.onRemoteRunParagraph to accept
AuthenticationInfo as a 3rd parameter; if it's not null, use it
instead of getting the AuthenticationInfo from Shiro.
But so far no luck, the paragraph is still run as the anonymous user. Is
there anything I'm missing?
--
Luis Angel Vicente Sanchez
luis@bigcente.ch