This is an automated email from the ASF dual-hosted git repository. zjffdu pushed a commit to branch branch-0.9 in repository https://gitbox.apache.org/repos/asf/zeppelin.git
The following commit(s) were added to refs/heads/branch-0.9 by this push: new a68cd24 [ZEPPELIN-5109]. Support knox in zeppelin-client a68cd24 is described below commit a68cd241cd4ae09644468c02e12f25300e34ad2e Author: Jeff Zhang <zjf...@apache.org> AuthorDate: Thu Oct 29 15:48:04 2020 +0800 [ZEPPELIN-5109]. Support knox in zeppelin-client ### What is this PR for? This PR add support of knox in zeppelin-client. I tested it in a real environment. What user need to provide is the knos sso url ### What type of PR is it? [ Feature ] ### Todos * [ ] - Task ### What is the Jira issue? * https://issues.apache.org/jira/browse/ZEPPELIN-5109 ### How should this be tested? * CI Pass. https://travis-ci.com/github/zjffdu/zeppelin/builds/196564937 Sample code ``` ClientConfig clientConfig = new ClientConfig("https://xxx:8443/gateway/cluster-topo/zeppelin", 1000, "https://xxx:8443/gateway/knoxsso/api/v1/websso"); ZeppelinClient zeppelinClient = new ZeppelinClient(clientConfig); zeppelinClient.login("username", "password"); String version = zeppelinClient.getVersion(); System.out.println(version); ``` ### 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 #3955 from zjffdu/ZEPPELIN-5109 and squashes the following commits: 76ada3d22 [Jeff Zhang] update gson in S3NotebookRepo 8ca577064 [Jeff Zhang] [ZEPPELIN-5109]. Support knox in zeppelin-client (cherry picked from commit 17d2cabf2e07e3d02710ba0b5a2bee7a37e9c23e) Signed-off-by: Jeff Zhang <zjf...@apache.org> --- .../java/org/apache/zeppelin/client/ClientConfig.java | 16 +++++++++++----- .../java/org/apache/zeppelin/client/ZeppelinClient.java | 14 +++++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/zeppelin-client/src/main/java/org/apache/zeppelin/client/ClientConfig.java b/zeppelin-client/src/main/java/org/apache/zeppelin/client/ClientConfig.java index 527e033..668e211 100644 --- a/zeppelin-client/src/main/java/org/apache/zeppelin/client/ClientConfig.java +++ b/zeppelin-client/src/main/java/org/apache/zeppelin/client/ClientConfig.java @@ -17,6 +17,8 @@ package org.apache.zeppelin.client; +import org.apache.commons.lang3.StringUtils; + /** * Configuration of Zeppelin client, such as zeppelin server rest url and * query interval of polling note/paragraph result. @@ -24,20 +26,20 @@ package org.apache.zeppelin.client; public class ClientConfig { private String zeppelinRestUrl; private long queryInterval ; - private boolean useKnox = false; + private String knoxSSOUrl; public ClientConfig(String zeppelinRestUrl) { this(zeppelinRestUrl, 1000); } public ClientConfig(String zeppelinRestUrl, long queryInterval) { - this(zeppelinRestUrl, queryInterval, false); + this(zeppelinRestUrl, queryInterval, null); } - public ClientConfig(String zeppelinRestUrl, long queryInterval, boolean useKnox) { + public ClientConfig(String zeppelinRestUrl, long queryInterval, String knoxSSOUrl) { this.zeppelinRestUrl = removeTrailingSlash(zeppelinRestUrl); this.queryInterval = queryInterval; - this.useKnox = useKnox; + this.knoxSSOUrl = knoxSSOUrl; } private String removeTrailingSlash(String zeppelinRestUrl) { @@ -57,6 +59,10 @@ public class ClientConfig { } public boolean isUseKnox() { - return useKnox; + return StringUtils.isNotBlank(knoxSSOUrl); + } + + public String getKnoxSSOUrl() { + return knoxSSOUrl; } } diff --git a/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZeppelinClient.java b/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZeppelinClient.java index 790575b..0605e09 100644 --- a/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZeppelinClient.java +++ b/zeppelin-client/src/main/java/org/apache/zeppelin/client/ZeppelinClient.java @@ -125,7 +125,7 @@ public class ZeppelinClient { checkJsonNodeStatus(jsonNode); return jsonNode.getObject().getJSONObject("body").getString("version"); } - + /** * Request a new session id. It doesn't create session (interpreter process) in zeppelin server side, but just * create an unique session id. @@ -257,11 +257,19 @@ public class ZeppelinClient { */ public void login(String userName, String password) throws Exception { if (clientConfig.isUseKnox()) { - HttpResponse<String> response = Unirest.get("/") + HttpResponse<String> response = Unirest.get(clientConfig.getKnoxSSOUrl() + + "?originalUrl=" + clientConfig.getZeppelinRestUrl()) .basicAuth(userName, password) .asString(); if (response.getStatus() != 200) { - throw new Exception(String.format("Login failed, status: %s, statusText: %s", + throw new Exception(String.format("Knox SSO login failed, status: %s, statusText: %s", + response.getStatus(), + response.getStatusText())); + } + response = Unirest.get("/security/ticket") + .asString(); + if (response.getStatus() != 200) { + throw new Exception(String.format("Fail to get ticket after Knox SSO, status: %s, statusText: %s", response.getStatus(), response.getStatusText())); }