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 6009675  [ZEPPELIN-5474] Add configuration to specify the port range 
of shiny app
6009675 is described below

commit 60096752e0ca03e69be916c52f23e46548ead04e
Author: Jeff Zhang <zjf...@apache.org>
AuthorDate: Fri Jul 2 13:46:55 2021 +0800

    [ZEPPELIN-5474] Add configuration to specify the port range of shiny app
    
    ### What is this PR for?
    
    Add configuration `zeppelin.R.shiny.portRange` for both R interpreter and 
SparkR, so that user can specify the portRange of shiny app. This would be 
useful when user has port usage constraint due to security reason.
    
    ### What type of PR is it?
    [Improvement ]
    
    ### Todos
    * [ ] - Task
    
    ### What is the Jira issue?
    * https://issues.apache.org/jira/browse/ZEPPELIN-5474
    
    ### How should this be tested?
    * Manually tested
    
    ### 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 #4191 from zjffdu/ZEPPELIN-5474 and squashes the following commits:
    
    2649b27b72 [Jeff Zhang] [ZEPPELIN-5474] Add configuration to specify the 
port range of shiny app
    
    (cherry picked from commit 934e38add26157b87d6b247e4efca4f795411a2c)
    Signed-off-by: Jeff Zhang <zjf...@apache.org>
---
 rlang/src/main/java/org/apache/zeppelin/r/IRInterpreter.java  | 6 ++++--
 rlang/src/main/resources/interpreter-setting.json             | 7 +++++++
 spark/interpreter/src/main/resources/interpreter-setting.json | 7 +++++++
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/rlang/src/main/java/org/apache/zeppelin/r/IRInterpreter.java 
b/rlang/src/main/java/org/apache/zeppelin/r/IRInterpreter.java
index 0dcb836..ef6d60d 100644
--- a/rlang/src/main/java/org/apache/zeppelin/r/IRInterpreter.java
+++ b/rlang/src/main/java/org/apache/zeppelin/r/IRInterpreter.java
@@ -53,6 +53,7 @@ public class IRInterpreter extends JupyterKernelInterpreter {
   // only one shiny app can be hosted in one R session.
   private File shinyAppFolder;
   private SparkRBackend sparkRBackend;
+  private String shinyPortRange;
 
   public IRInterpreter(Properties properties) {
     super("ir", properties);
@@ -113,6 +114,7 @@ public class IRInterpreter extends JupyterKernelInterpreter 
{
     try {
       this.shinyAppFolder = 
Files.createTempDirectory("zeppelin-shiny").toFile();
       this.shinyAppFolder.deleteOnExit();
+      this.shinyPortRange = 
properties.getProperty("zeppelin.R.shiny.portRange", ":");
     } catch (IOException e) {
       throw new InterpreterException(e);
     }
@@ -185,11 +187,11 @@ public class IRInterpreter extends 
JupyterKernelInterpreter {
     try {
       StringBuilder builder = new StringBuilder("library(shiny)\n");
       String host = RemoteInterpreterUtils.findAvailableHostAddress();
-      int port = 
RemoteInterpreterUtils.findRandomAvailablePortOnAllLocalInterfaces();
+      int port = RemoteInterpreterUtils.findAvailablePort(shinyPortRange);
       builder.append("runApp(appDir='" + shinyAppFolder.getAbsolutePath() + 
"', " +
               "port=" + port + ", host='" + host + "', launch.browser=FALSE)");
       // shiny app will launch and block there until user cancel the paragraph.
-      LOGGER.info("Run shiny app code: {}", builder);
+      LOGGER.info("Run shiny app code: {}", builder.toString());
       return internalInterpret(builder.toString(), context);
     } finally {
       getKernelProcessLauncher().setRedirectedContext(null);
diff --git a/rlang/src/main/resources/interpreter-setting.json 
b/rlang/src/main/resources/interpreter-setting.json
index 24d1a48..f0a9677 100644
--- a/rlang/src/main/resources/interpreter-setting.json
+++ b/rlang/src/main/resources/interpreter-setting.json
@@ -31,6 +31,13 @@
         "defaultValue": "out.format = 'html', comment = NA, echo = FALSE, 
results = 'asis', message = F, warning = F, fig.retina = 2",
         "description": "",
         "type": "textarea"
+      },
+      "zeppelin.R.shiny.portRange": {
+        "envName": "",
+        "propertyName": "zeppelin.R.shiny.portRange",
+        "defaultValue": ":",
+        "description": "Shiny app would launch a web app at some port, this 
property is to specify the portRange via format '<start>:<end>', e.g. 
'5000:5001'. By default it is ':' which means any port",
+        "type": "string"
       }
     },
     "editor": {
diff --git a/spark/interpreter/src/main/resources/interpreter-setting.json 
b/spark/interpreter/src/main/resources/interpreter-setting.json
index 1502f64..5ba5f23 100644
--- a/spark/interpreter/src/main/resources/interpreter-setting.json
+++ b/spark/interpreter/src/main/resources/interpreter-setting.json
@@ -289,6 +289,13 @@
         "defaultValue": "out.format = 'html', comment = NA, echo = FALSE, 
results = 'asis', message = F, warning = F, fig.retina = 2",
         "description": "",
         "type": "textarea"
+      },
+      "zeppelin.R.shiny.portRange": {
+        "envName": "",
+        "propertyName": "zeppelin.R.shiny.portRange",
+        "defaultValue": ":",
+        "description": "Shiny app would launch a web app at some port, this 
property is to specify the portRange via format '<start>:<end>', e.g. 
'5000:5001'. By default it is ':' which means any port",
+        "type": "string"
       }
     },
     "editor": {

Reply via email to