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 <[email protected]> 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 <[email protected]> Authored: Fri Nov 20 16:30:07 2015 +0530 Committer: Damien CORNEAU <[email protected]> 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 */
