You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by li...@apache.org on 2020/04/12 11:21:32 UTC

[zeppelin] branch branch-0.9 updated: ZEPPELIN-4747. Terminal interpreter support internal and external IP mapping

This is an automated email from the ASF dual-hosted git repository.

liuxun 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 bdefc85  ZEPPELIN-4747. Terminal interpreter support internal and external IP mapping
bdefc85 is described below

commit bdefc85a4361fa101f73c7781faf0062f5f6d2b6
Author: Xun Liu <li...@apache.org>
AuthorDate: Sat Apr 11 15:06:39 2020 +0800

    ZEPPELIN-4747. Terminal interpreter support internal and external IP mapping
    
    ### What is this PR for?
    When running the terminal interpreter in the notebook, the front end of the notebook needs to obtain the IP address of the server where the terminal interpreter is located to communicate.
    
    In a public cloud environment, the cloud host has an internal IP and an external access IP, and the interpreter runs in the cloud host. This will cause the notebook front end to be unable to connect to the terminal interpreter properly, resulting in the terminal interpreter being unusable.
    
    Solution: Set the mapping between internal IP and external IP in the terminal interpreter, and connect the front end of the notebook through the external IP of the terminal interpreter.
    
    ### What type of PR is it?
    [Improvement]
    
    ### What is the Jira issue?
    * https://jira.apache.org/jira/browse/ZEPPELIN-4747
    
    ### How should this be tested?
    * First time? Setup Travis CI as described on https://zeppelin.apache.org/contribution/contributions.html#continuous-integration
    * Strongly recommended: add automated unit tests for any new or changed behavior
    * Outline any manual steps to test the PR here.
    
    ### Screenshots (if appropriate)
    
    ### Questions:
    * Does the licenses files need update?
    * Is there breaking changes for older versions?
    * Does this needs documentation?
    
    Author: Xun Liu <li...@apache.org>
    
    Closes #3732 from liuxunorg/ZEPPELIN-4747 and squashes the following commits:
    
    68f16caa4 [Xun Liu] Fixed
    c462c3e46 [Xun Liu] ZEPPELIN-4747. Terminal interpreter support internal and external IP mapping
    
    (cherry picked from commit faf082bc07433454bcdc7dec7869cb9f6f2e5bef)
    Signed-off-by: liuxun323 <li...@apache.org>
---
 docs/interpreter/shell.md                            | 16 ++++++++++++++++
 .../apache/zeppelin/shell/TerminalInterpreter.java   | 20 ++++++++++++++++++++
 shell/src/main/resources/interpreter-setting.json    |  7 +++++++
 3 files changed, 43 insertions(+)

diff --git a/docs/interpreter/shell.md b/docs/interpreter/shell.md
index c38391b..631c133 100644
--- a/docs/interpreter/shell.md
+++ b/docs/interpreter/shell.md
@@ -74,6 +74,11 @@ At the "Interpreters" menu in Zeppelin dropdown menu, you can set the property v
     <td>false</td>
     <td>Enable ZeppelinContext variable interpolation into paragraph text</td>
   </tr>
+  <tr>
+    <td>zeppelin.terminal.ip.mapping</td>
+    <td></td>
+    <td>Internal and external IP mapping of zeppelin server</td>
+  </tr>
 </table>
 
 ## Example
@@ -129,3 +134,14 @@ input any char
 ```
 
 <img src="{{BASE_PATH}}/assets/themes/zeppelin/img/docs-img/shell-terminal.gif" />
+
+### zeppelin.terminal.ip.mapping
+
+When running the terminal interpreter in the notebook, the front end of the notebook needs to obtain the IP address of the server where the terminal interpreter is located to communicate.
+
+In a public cloud environment, the cloud host has an internal IP and an external access IP, and the interpreter runs in the cloud host. This will cause the notebook front end to be unable to connect to the terminal interpreter properly, resulting in the terminal interpreter being unusable.
+
+Solution: Set the mapping between internal IP and external IP in the terminal interpreter, and connect the front end of the notebook through the external IP of the terminal interpreter.
+
+Example: 
+{"internal-ip1":"external-ip1", "internal-ip2":"external-ip2"}
diff --git a/shell/src/main/java/org/apache/zeppelin/shell/TerminalInterpreter.java b/shell/src/main/java/org/apache/zeppelin/shell/TerminalInterpreter.java
index f18c8b4..d54495e 100644
--- a/shell/src/main/java/org/apache/zeppelin/shell/TerminalInterpreter.java
+++ b/shell/src/main/java/org/apache/zeppelin/shell/TerminalInterpreter.java
@@ -19,6 +19,8 @@ package org.apache.zeppelin.shell;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.io.Resources;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import com.hubspot.jinjava.Jinjava;
 import org.apache.commons.io.Charsets;
 import org.apache.commons.lang3.StringUtils;
@@ -43,6 +45,7 @@ import java.net.URL;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 /**
@@ -61,6 +64,10 @@ public class TerminalInterpreter extends KerberosInterpreter {
 
   private int terminalPort = 0;
 
+  // Internal and external IP mapping of zeppelin server
+  private HashMap<String, String> mapIpMapping = new HashMap<>();
+  private Gson gson = new Gson();
+
   // terminal web socket status
   // ui_templates/terminal-dashboard.jinja
   public static final String TERMINAL_SOCKET_STATUS = "TERMINAL_SOCKET_STATUS";
@@ -123,6 +130,12 @@ public class TerminalInterpreter extends KerberosInterpreter {
       }
     }
     setParagraphConfig();
+    Properties properties = getProperties();
+    String strIpMapping = properties.getProperty("zeppelin.terminal.ip.mapping");
+    if (!StringUtils.isEmpty(strIpMapping)) {
+      mapIpMapping = gson.fromJson(strIpMapping, new TypeToken<Map<String, String>>(){}.getType());
+    }
+
     createTerminalDashboard(context.getNoteId(), context.getParagraphId(), terminalPort);
 
     return new InterpreterResult(Code.SUCCESS);
@@ -137,6 +150,13 @@ public class TerminalInterpreter extends KerberosInterpreter {
       InetAddress addr = InetAddress.getLocalHost();
       hostName = addr.getHostName().toString();
       hostIp = RemoteInterpreterUtils.findAvailableHostAddress();
+
+      // Internal and external IP mapping of zeppelin server
+      if (mapIpMapping.containsKey(hostIp)) {
+        LOGGER.info("Internal IP: {}", hostIp);
+        hostIp = mapIpMapping.get(hostIp);
+        LOGGER.info("External IP: {}", hostIp);
+      }
     } catch (IOException e) {
       LOGGER.error(e.getMessage(), e);
     }
diff --git a/shell/src/main/resources/interpreter-setting.json b/shell/src/main/resources/interpreter-setting.json
index 1db6528..57b6fa1 100644
--- a/shell/src/main/resources/interpreter-setting.json
+++ b/shell/src/main/resources/interpreter-setting.json
@@ -59,6 +59,13 @@
     "name": "terminal",
     "className": "org.apache.zeppelin.shell.TerminalInterpreter",
     "properties": {
+      "zeppelin.terminal.ip.mapping": {
+        "envName": null,
+        "propertyName": "zeppelin.terminal.ip.mapping",
+        "defaultValue": "",
+        "description": "Internal and external IP mapping of zeppelin server",
+        "type": "string"
+      }
     },
     "editor": {
       "language": "sh",