You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by co...@apache.org on 2015/11/24 05:39:56 UTC

incubator-zeppelin git commit: ZEPPELIN-387 Allow enable/disable of specific paragraphs

Repository: incubator-zeppelin
Updated Branches:
  refs/heads/master 53812cfcc -> 6cfb32e5f


ZEPPELIN-387 Allow enable/disable of specific paragraphs

- When "run all" is called the disabled paragraphs are not executed.
- There is no "run" button for a disabled paragraph.

Disabled paragraph menu item
<img width="287" alt="screen shot 2015-11-09 at 10 30 42 pm" src="https://cloud.githubusercontent.com/assets/2031306/11040681/87673328-8733-11e5-8507-f366a222ecf1.png">
---
Enabled paragraph menu item
<img width="266" alt="screen shot 2015-11-09 at 10 30 26 pm" src="https://cloud.githubusercontent.com/assets/2031306/11040702/a39ae012-8733-11e5-8c7d-33fedc6ea6a7.png">

Author: Renjith Kamath <re...@gmail.com>

Closes #414 from r-kamath/ZEPPELIN-387 and squashes the following commits:

796575d [Renjith Kamath] ZEPPELIN-387 fix testClearParagraphOutput failure
38ef9bf [Renjith Kamath] Merge branch 'master' of https://github.com/apache/incubator-zeppelin into ZEPPELIN-387
87ef87b [Renjith Kamath] ZEPPELIN-387 fix tests
118d358 [Renjith Kamath] ZEPPELIN-387 review fix
3a7175a [Renjith Kamath] ZEPPELIN-387 review updates
87aa4e8 [Renjith Kamath] ZEPPELIN-387 remove checkbox, add icon and update the position
226493a [Renjith Kamath] ZEPPELIN-387 Allow enable/disable of specific paragraphs


Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/6cfb32e5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/6cfb32e5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/6cfb32e5

Branch: refs/heads/master
Commit: 6cfb32e5f686dba1973c81d8d97d00ce07f3601a
Parents: 53812cf
Author: Renjith Kamath <re...@gmail.com>
Authored: Fri Nov 20 16:30:07 2015 +0530
Committer: Damien CORNEAU <co...@gmail.com>
Committed: Tue Nov 24 13:39:41 2015 +0900

----------------------------------------------------------------------
 .../zeppelin/rest/ZeppelinRestApiTest.java      |  8 ++++++
 .../zeppelin/rest/ZeppelinSparkClusterTest.java | 27 ++++++++++++++++++++
 .../notebook/paragraph/paragraph.controller.js  | 11 ++++++++
 .../src/app/notebook/paragraph/paragraph.html   |  7 +++--
 .../java/org/apache/zeppelin/notebook/Note.java |  4 ++-
 .../apache/zeppelin/notebook/NotebookTest.java  | 22 ++++++++++++++--
 .../notebook/repo/NotebookRepoSyncTest.java     |  8 +++---
 7 files changed, 78 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/6cfb32e5/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java
index 8c8ff07..8468de2 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java
@@ -18,6 +18,7 @@
 package org.apache.zeppelin.rest;
 
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -155,8 +156,11 @@ public class ZeppelinRestApiTest extends AbstractTestRestApi {
     Note note = ZeppelinServer.notebook.createNote();
     note.addParagraph();
     Paragraph p = note.getLastParagraph();
+    Map config = p.getConfig();
+    config.put("enabled", true);
 
     // run markdown paragraph
+    p.setConfig(config);
     p.setText("%md markdown");
     note.run(p.getId());
     while (p.getStatus() != Status.FINISHED) {
@@ -175,6 +179,7 @@ public class ZeppelinRestApiTest extends AbstractTestRestApi {
 
     // run markdown paragraph, again
     p = note.addParagraph();
+    p.setConfig(config);
     p.setText("%md markdown restarted");
     note.run(p.getId());
     while (p.getStatus() != Status.FINISHED) {
@@ -262,6 +267,9 @@ public class ZeppelinRestApiTest extends AbstractTestRestApi {
     assertNotNull("cant create new note", note);
     note.setName("source note for clone");
     Paragraph paragraph = note.addParagraph();
+    Map config = paragraph.getConfig();
+    config.put("enabled", true);
+    paragraph.setConfig(config);
     paragraph.setText("%md This is my new paragraph in my new note");
     note.persist();
     String sourceNoteID = note.getId();

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/6cfb32e5/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java
index d5006ee..7076a79 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java
@@ -20,7 +20,9 @@ import static org.junit.Assert.assertEquals;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.zeppelin.interpreter.InterpreterSetting;
@@ -68,6 +70,9 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi {
 
     // run markdown paragraph, again
     Paragraph p = note.addParagraph();
+    Map config = p.getConfig();
+    config.put("enabled", true);
+    p.setConfig(config);
     p.setText("%spark print(sc.parallelize(1 to 10).reduce(_ + _))");
     note.run(p.getId());
     waitForFinish(p);
@@ -84,6 +89,9 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi {
     if (isPyspark() && sparkVersion >= 12) {   // pyspark supported from 1.2.1
       // run markdown paragraph, again
       Paragraph p = note.addParagraph();
+      Map config = p.getConfig();
+      config.put("enabled", true);
+      p.setConfig(config);
       p.setText("%pyspark print(sc.parallelize(range(1, 11)).reduce(lambda a, b: a + b))");
       note.run(p.getId());
       waitForFinish(p);
@@ -102,6 +110,9 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi {
     if (isPyspark() && sparkVersion >= 14) {   // auto_convert enabled from spark 1.4
       // run markdown paragraph, again
       Paragraph p = note.addParagraph();
+      Map config = p.getConfig();
+      config.put("enabled", true);
+      p.setConfig(config);
       p.setText("%pyspark\nfrom pyspark.sql.functions import *\n"
           + "print(sqlContext.range(0, 10).withColumn('uniform', rand(seed=10) * 3.14).count())");
       note.run(p.getId());
@@ -116,10 +127,19 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi {
     // create new note
     Note note = ZeppelinServer.notebook.createNote();
     Paragraph p0 = note.addParagraph();
+    Map config0 = p0.getConfig();
+    config0.put("enabled", true);
+    p0.setConfig(config0);
     p0.setText("%spark z.run(1)");
     Paragraph p1 = note.addParagraph();
+    Map config1 = p1.getConfig();
+    config1.put("enabled", true);
+    p1.setConfig(config1);
     p1.setText("%spark val a=10");
     Paragraph p2 = note.addParagraph();
+    Map config2 = p2.getConfig();
+    config2.put("enabled", true);
+    p2.setConfig(config2);
     p2.setText("%spark print(a)");
 
     note.run(p0.getId());
@@ -151,6 +171,9 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi {
 
       // load dep
       Paragraph p0 = note.addParagraph();
+      Map config = p0.getConfig();
+      config.put("enabled", true);
+      p0.setConfig(config);
       p0.setText("%dep z.load(\"com.databricks:spark-csv_2.11:1.2.0\")");
       note.run(p0.getId());
       waitForFinish(p0);
@@ -161,6 +184,7 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi {
 
       // load data using libraries from dep loader
       Paragraph p1 = note.addParagraph();
+      p1.setConfig(config);
       p1.setText("%pyspark\n" +
         "from pyspark.sql import SQLContext\n" +
         "print(sqlContext.read.format('com.databricks.spark.csv')" +
@@ -178,6 +202,9 @@ public class ZeppelinSparkClusterTest extends AbstractTestRestApi {
    */
   private int getSparkVersionNumber(Note note) {
     Paragraph p = note.addParagraph();
+    Map config = p.getConfig();
+    config.put("enabled", true);
+    p.setConfig(config);
     p.setText("%spark print(sc.version)");
     note.run(p.getId());
     waitForFinish(p);

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/6cfb32e5/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
index 41039c0..430c5ac 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
@@ -128,6 +128,10 @@ angular.module('zeppelinWebApp')
     if (!config.graph.scatter) {
       config.graph.scatter = {};
     }
+
+    if (config.enabled === undefined) {
+      config.enabled = true;
+    }
   };
 
   $scope.getIframeDimensions = function () {
@@ -268,6 +272,13 @@ angular.module('zeppelinWebApp')
     $scope.dirtyText = undefined;
   };
 
+  $scope.toggleEnableDisable = function () {
+    $scope.paragraph.config.enabled = $scope.paragraph.config.enabled ? false : true;
+    var newParams = angular.copy($scope.paragraph.settings.params);
+    var newConfig = angular.copy($scope.paragraph.config);
+    commitParagraph($scope.paragraph.title, $scope.paragraph.text, newConfig, newParams);
+  };
+
   $scope.moveUp = function() {
     $scope.$emit('moveParagraphUp', $scope.paragraph.id);
   };

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/6cfb32e5/zeppelin-web/src/app/notebook/paragraph/paragraph.html
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph.html
index 0ccb716..3ad3e31 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.html
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.html
@@ -410,7 +410,7 @@ limitations under the License.
     <!-- Run / Cancel button -->
     <span class="icon-control-play" style="cursor:pointer;color:#3071A9" tooltip-placement="top" tooltip="Run this paragraph (Shift+Enter)"
           ng-click="runParagraph(getEditorValue())"
-          ng-show="paragraph.status!='RUNNING' && paragraph.status!='PENDING'"></span>
+          ng-show="paragraph.status!='RUNNING' && paragraph.status!='PENDING' && paragraph.config.enabled"></span>
     <span class="icon-control-pause" style="cursor:pointer;color:#CD5C5C" tooltip-placement="top" tooltip="Cancel"
           ng-click="cancelParagraph()"
           ng-show="paragraph.status=='RUNNING' || paragraph.status=='PENDING'"></span>
@@ -463,7 +463,10 @@ limitations under the License.
              ng-click="showLineNumbers()"
              ng-show="!paragraph.config.lineNumbers"> Show line numbers</a>
         </li>
-
+        <li>
+          <a class="icon-control-play" style="cursor:pointer"
+             ng-click="toggleEnableDisable()"> {{paragraph.config.enabled ? "Disable" : "Enable"}}  run</a>
+        </li>
         <li><a class="icon-share-alt" style="cursor:pointer"
                ng-click="goToSingleParagraph()"> Link this paragraph</a>
         </li>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/6cfb32e5/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
index 89a72b5..4271a73 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
@@ -323,7 +323,9 @@ public class Note implements Serializable, JobListener {
     if (intp == null) {
       throw new InterpreterException("Interpreter " + p.getRequiredReplName() + " not found");
     }
-    intp.getScheduler().submit(p);
+    if ((Boolean) p.getConfig().get("enabled")) {
+      intp.getScheduler().submit(p);
+    }
   }
 
   public List<String> completion(String paragraphId, String buffer, int cursor) {

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/6cfb32e5/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java
index 5d887e9..8ae0970 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertTrue;
 import java.io.File;
 import java.io.IOException;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -95,6 +96,9 @@ public class NotebookTest implements JobListenerFactory{
 
     // run with defatul repl
     Paragraph p1 = note.addParagraph();
+    Map config = p1.getConfig();
+    config.put("enabled", true);
+    p1.setConfig(config);
     p1.setText("hello world");
     note.run(p1.getId());
     while(p1.isTerminated()==false || p1.getResult()==null) Thread.yield();
@@ -102,6 +106,7 @@ public class NotebookTest implements JobListenerFactory{
 
     // run with specific repl
     Paragraph p2 = note.addParagraph();
+    p2.setConfig(config);
     p2.setText("%mock2 hello world");
     note.run(p2.getId());
     while(p2.isTerminated()==false || p2.getResult()==null) Thread.yield();
@@ -155,6 +160,9 @@ public class NotebookTest implements JobListenerFactory{
 
     // run with default repl
     Paragraph p1 = note.addParagraph();
+    Map config = p1.getConfig();
+    config.put("enabled", true);
+    p1.setConfig(config);
     p1.setText("hello world");
     note.persist();
 
@@ -166,6 +174,9 @@ public class NotebookTest implements JobListenerFactory{
   public void testClearParagraphOutput() throws IOException, SchedulerException{
     Note note = notebook.createNote();
     Paragraph p1 = note.addParagraph();
+    Map config = p1.getConfig();
+    config.put("enabled", true);
+    p1.setConfig(config);
     p1.setText("hello world");
     note.run(p1.getId());
 
@@ -181,10 +192,14 @@ public class NotebookTest implements JobListenerFactory{
   public void testRunAll() throws IOException {
     Note note = notebook.createNote();
     note.getNoteReplLoader().setInterpreters(factory.getDefaultInterpreterSettingList());
-
     Paragraph p1 = note.addParagraph();
+    Map config = p1.getConfig();
+    config.put("enabled", true);
+    p1.setConfig(config);
     p1.setText("p1");
     Paragraph p2 = note.addParagraph();
+    Map config1 = p2.getConfig();
+    p2.setConfig(config1);
     p2.setText("p2");
     assertEquals(null, p2.getResult());
     note.runAll();
@@ -200,12 +215,15 @@ public class NotebookTest implements JobListenerFactory{
     note.getNoteReplLoader().setInterpreters(factory.getDefaultInterpreterSettingList());
 
     Paragraph p = note.addParagraph();
+    Map config = new HashMap<String, Object>();
+    p.setConfig(config);
     p.setText("p1");
     Date dateFinished = p.getDateFinished();
     assertNull(dateFinished);
 
     // set cron scheduler, once a second
-    Map<String, Object> config = note.getConfig();
+    config = note.getConfig();
+    config.put("enabled", true);
     config.put("cron", "* * * * * ?");
     note.setConfig(config);
     notebook.refreshCron(note.id());

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/6cfb32e5/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java
index bfc6561..8d33d51 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java
@@ -19,11 +19,10 @@ package org.apache.zeppelin.notebook.repo;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
@@ -34,10 +33,8 @@ import org.apache.zeppelin.interpreter.mock.MockInterpreter1;
 import org.apache.zeppelin.interpreter.mock.MockInterpreter2;
 import org.apache.zeppelin.notebook.JobListenerFactory;
 import org.apache.zeppelin.notebook.Note;
-import org.apache.zeppelin.notebook.NoteInfo;
 import org.apache.zeppelin.notebook.Notebook;
 import org.apache.zeppelin.notebook.Paragraph;
-import org.apache.zeppelin.notebook.repo.NotebookRepoSync;
 import org.apache.zeppelin.scheduler.Job;
 import org.apache.zeppelin.scheduler.Job.Status;
 import org.apache.zeppelin.scheduler.JobListener;
@@ -149,6 +146,9 @@ public class NotebookRepoSyncTest implements JobListenerFactory{
     /* create note */
     Note note = notebookSync.createNote();
     Paragraph p1 = note.addParagraph();
+    Map config = p1.getConfig();
+    config.put("enabled", true);
+    p1.setConfig(config);
     p1.setText("hello world");
     
     /* new paragraph exists in note instance */