diff --git a/conf/shiro.ini b/conf/shiro.ini.template similarity index 100% rename from conf/shiro.ini rename to conf/shiro.ini.template diff --git a/pom.xml b/pom.xml index efcf526f889..3ebc42976b4 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,7 @@ smart-engine smart-server smart-rule + smart-interpreter smart-zeppelin smart-agent smart-hdfs diff --git a/smart-interpreter/pom.xml b/smart-interpreter/pom.xml new file mode 100644 index 00000000000..73b0173efec --- /dev/null +++ b/smart-interpreter/pom.xml @@ -0,0 +1,42 @@ + + + + + smartdata-project + org.smartdata + 1.0-SNAPSHOT + ../pom.xml + + 4.0.0 + + org.smartdata + smart-interpreter + 1.0-SNAPSHOT + jar + + + org.smartdata + smart-engine + 1.0-SNAPSHOT + + + Interpreter + + \ No newline at end of file diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/display/AngularObjectBuilder.java b/smart-interpreter/src/main/java/org/smartdata/interpreter/SmartInterpreter.java similarity index 62% rename from smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/display/AngularObjectBuilder.java rename to smart-interpreter/src/main/java/org/smartdata/interpreter/SmartInterpreter.java index a6aaae6d9c2..f9e565a3739 100644 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/display/AngularObjectBuilder.java +++ b/smart-interpreter/src/main/java/org/smartdata/interpreter/SmartInterpreter.java @@ -14,13 +14,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.smartdata.interpreter; -package org.apache.zeppelin.display; +import org.smartdata.server.SmartEngine; -public class AngularObjectBuilder { +import java.io.IOException; + +/** + * Created by zhiqiangx on 17-7-31. + */ +public abstract class SmartInterpreter { + private SmartEngine smartEngine; + + public SmartInterpreter(SmartEngine smartEngine) { + this.smartEngine = smartEngine; + } + + protected SmartEngine getSmartEngine() { + return smartEngine; + } + + public abstract String excute(String cmd) throws IOException; - public static AngularObject build(String varName, T value, String noteId, - String paragraphId) { - return new AngularObject<>(varName, value, noteId, paragraphId, null); - } } diff --git a/smart-zeppelin/zeppelin-server/src/test/scala/org/apache/zeppelin/WelcomePageSuite.scala b/smart-interpreter/src/main/java/org/smartdata/interpreter/impl/ActionInterpreter.java similarity index 60% rename from smart-zeppelin/zeppelin-server/src/test/scala/org/apache/zeppelin/WelcomePageSuite.scala rename to smart-interpreter/src/main/java/org/smartdata/interpreter/impl/ActionInterpreter.java index 1798214aecb..0e29efc3a1b 100644 --- a/smart-zeppelin/zeppelin-server/src/test/scala/org/apache/zeppelin/WelcomePageSuite.scala +++ b/smart-interpreter/src/main/java/org/smartdata/interpreter/impl/ActionInterpreter.java @@ -14,24 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.smartdata.interpreter.impl; -package org.apache.zeppelin +import org.smartdata.interpreter.SmartInterpreter; +import org.smartdata.server.SmartEngine; -import org.openqa.selenium.WebDriver -import org.scalatest.concurrent.Eventually._ -import org.scalatest.time._ -import org.scalatest.selenium.WebBrowser -import org.scalatest.{DoNotDiscover, FunSuite} -import AbstractFunctionalSuite.SERVER_ADDRESS +import java.io.IOException; -@DoNotDiscover -class WelcomePageSuite(implicit driver: WebDriver) extends FunSuite with WebBrowser { +public class ActionInterpreter extends SmartInterpreter { - test("Welcome sign is correct") { - eventually (timeout(Span(180, Seconds))) { - go to SERVER_ADDRESS - assert(find("welcome").isDefined) + public ActionInterpreter(SmartEngine smartEngine) { + super(smartEngine); } - } + @Override + public String excute(String cmd) throws IOException { + getSmartEngine().getCmdletManager().submitCmdlet(cmd); + return "Success to add action"; + } } diff --git a/smart-interpreter/src/main/java/org/smartdata/interpreter/impl/RuleInterpreter.java b/smart-interpreter/src/main/java/org/smartdata/interpreter/impl/RuleInterpreter.java new file mode 100644 index 00000000000..bb23c394ebd --- /dev/null +++ b/smart-interpreter/src/main/java/org/smartdata/interpreter/impl/RuleInterpreter.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.smartdata.interpreter.impl; + +import org.smartdata.interpreter.SmartInterpreter; +import org.smartdata.model.RuleState; +import org.smartdata.server.SmartEngine; + +import java.io.IOException; + +/** + * Created by zhiqiangx on 17-7-31. + */ +public class RuleInterpreter extends SmartInterpreter { + + public RuleInterpreter(SmartEngine smartEngine) { + super(smartEngine); + } + + @Override + public String excute(String cmd) throws IOException { + long t =getSmartEngine().getRuleManager().submitRule(cmd, RuleState.DISABLED); + return "Success to add rule : " + t; + } +} diff --git a/smart-zeppelin/notebook/2BWJFTXKJ/note.json b/smart-zeppelin/notebook/2BWJFTXKJ/note.json deleted file mode 100644 index 7196dd0bd85..00000000000 --- a/smart-zeppelin/notebook/2BWJFTXKJ/note.json +++ /dev/null @@ -1,1309 +0,0 @@ -{ - "paragraphs": [ - { - "title": "Hello R", - "text": "%r\nfoo \u003c- TRUE\nprint(foo)\nbare \u003c- c(1, 2.5, 4)\nprint(bare)\ndouble \u003c- 15.0\nprint(double)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:45:40 AM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/r", - "enabled": true, - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 84.64583587646484, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\n[1] TRUE\n[1] 1.0 2.5 4.0\n[1] 15\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1429882946244_-381648689", - "id": "20150424-154226_261270952", - "dateCreated": "Apr 24, 2015 3:42:26 AM", - "dateStarted": "Jan 29, 2017 2:42:27 AM", - "dateFinished": "Jan 29, 2017 2:42:40 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Load R Librairies", - "text": "%r\nlibrary(data.table)\ndt \u003c- data.table(1:3)\nprint(dt)\nfor (i in 1:5) {\n print(i*2)\n}\nprint(1:50)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:45:44 AM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/r", - "enabled": true, - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 193.33334350585938, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\nV1\n1: 1\n2: 2\n3: 3\n[1] 2\n[1] 4\n[1] 6\n[1] 8\n[1] 10\n [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n[24] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46\n[47] 47 48 49 50\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1429882976611_1352445253", - "id": "20150424-154256_645296307", - "dateCreated": "Apr 24, 2015 3:42:56 AM", - "dateStarted": "Jan 29, 2017 2:42:43 AM", - "dateFinished": "Jan 29, 2017 2:42:43 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n\n## Zeppelin SparkR Tutorial\n\n##### This is a live tutorial, you can run the code yourself. (Shift-Enter to Run)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:17:08 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "markdown", - "editOnDblClick": true - }, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch2\u003eZeppelin SparkR Tutorial\u003c/h2\u003e\n\u003ch5\u003eThis is a live tutorial, you can run the code yourself. (Shift-Enter to Run)\u003c/h5\u003e\n\u003c/div\u003e" - } - ] - }, - "apps": [], - "jobName": "paragraph_1485571833509_-1037808822", - "id": "20170128-115033_693473992", - "dateCreated": "Jan 28, 2017 11:50:33 AM", - "dateStarted": "Jan 29, 2017 3:17:08 AM", - "dateFinished": "Jan 29, 2017 3:17:08 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Load Iris Dataset", - "text": "%r\ncolnames(iris)\niris$Petal.Length\niris$Sepal.Length", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:45:47 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "editorMode": "ace/mode/r", - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 169.33334350585938, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\n[1] “Sepal.Length” “Sepal.Width” “Petal.Length” “Petal.Width” \n[5] “Species”\n [1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 1.5 1.6 1.4 1.1 1.2 1.5 1.3\n [18] 1.4 1.7 1.5 1.7 1.5 1.0 1.7 1.9 1.6 1.6 1.5 1.4 1.6 1.6 1.5 1.5 1.4\n [35] 1.5 1.2 1.3 1.4 1.3 1.5 1.3 1.3 1.3 1.6 1.9 1.4 1.6 1.4 1.5 1.4 4.7\n [52] 4.5 4.9 4.0 4.6 4.5 4.7 3.3 4.6 3.9 3.5 4.2 4.0 4.7 3.6 4.4 4.5 4.1\n [69] 4.5 3.9 4.8 4.0 4.9 4.7 4.3 4.4 4.8 5.0 4.5 3.5 3.8 3.7 3.9 5.1 4.5\n [86] 4.5 4.7 4.4 4.1 4.0 4.4 4.6 4.0 3.3 4.2 4.2 4.2 4.3 3.0 4.1 6.0 5.1\n[103] 5.9 5.6 5.8 6.6 4.5 6.3 5.8 6.1 5.1 5.3 5.5 5.0 5.1 5.3 5.5 6.7 6.9\n[120] 5.0 5.7 4.9 6.7 4.9 5.7 6.0 4.8 4.9 5.6 5.8 6.1 6.4 5.6 5.1 5.6 6.1\n[137] 5.6 5.5 4.8 5.4 5.6 5.1 5.1 5.9 5.7 5.2 5.0 5.2 5.4 5.1\n [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4\n [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5\n [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0\n [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8\n [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4\n [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8\n[103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7\n[120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7\n[137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455138077044_161383897", - "id": "20160210-220117_115873183", - "dateCreated": "Feb 10, 2016 10:01:17 AM", - "dateStarted": "Jan 29, 2017 2:42:46 AM", - "dateFinished": "Jan 29, 2017 2:42:46 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "TABLE Display", - "text": "%r print(\"%table name\\tsize\\nsmall\\t100\\nlarge\\t1000\")", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:20:33 AM", - "config": { - "colWidth": 6.0, - "enabled": true, - "title": true, - "editorMode": "ace/mode/r", - "results": [ - { - "graph": { - "mode": "table", - "height": 408.6458435058594, - "optionOpen": false, - "keys": [ - { - "name": "name", - "index": 0.0, - "aggr": "sum" - } - ], - "values": [ - { - "name": "size", - "index": 1.0, - "aggr": "sum" - } - ], - "groups": [], - "scatter": { - "xAxis": { - "name": "name", - "index": 0.0, - "aggr": "sum" - }, - "yAxis": { - "name": "size", - "index": 1.0, - "aggr": "sum" - } - } - }, - "helium": {} - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TABLE", - "data": "name\tsize\nsmall\t100\nlarge\t1000" - } - ] - }, - "apps": [], - "jobName": "paragraph_1456216582752_6855525", - "id": "20160223-093622_330111284", - "dateCreated": "Feb 23, 2016 9:36:22 AM", - "dateStarted": "Jan 29, 2017 2:42:50 AM", - "dateFinished": "Jan 29, 2017 2:42:50 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "HTML Display", - "text": "%r \n\nprint(\"%html \u003ch3\u003eHello HTML\u003c/h3\u003e\")\nprint(\"\u003cfont color\u003d\u0027blue\u0027\u003e\u003cspan class\u003d\u0027fa fa-bars\u0027\u003e Easy...\u003c/font\u003e\u003c/span\u003e\")\nfor (i in 1:10) {\n print(paste0(\"\u003ch4\u003e\", i, \" * 2 \u003d \", i*2, \"\u003c/h4\u003e\"))\n}", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:52:20 AM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/r", - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 361.66668701171875, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cp\u003e\u003c/p\u003e\u003ch3\u003eHello HTML\u003c/h3\u003e\u003cfont color\u003d\"blue\"\u003e\u003cspan class\u003d\"fa fa-bars\"\u003e Easy…\u003c/span\u003e\u003c/font\u003e\u003ch4\u003e1 * 2 \u003d 2\u003c/h4\u003e\u003ch4\u003e2 * 2 \u003d 4\u003c/h4\u003e\u003ch4\u003e3 * 2 \u003d 6\u003c/h4\u003e\u003ch4\u003e4 * 2 \u003d 8\u003c/h4\u003e\u003ch4\u003e5 * 2 \u003d 10\u003c/h4\u003e\u003ch4\u003e6 * 2 \u003d 12\u003c/h4\u003e\u003ch4\u003e7 * 2 \u003d 14\u003c/h4\u003e\u003ch4\u003e8 * 2 \u003d 16\u003c/h4\u003e\u003ch4\u003e9 * 2 \u003d 18\u003c/h4\u003e\u003ch4\u003e10 * 2 \u003d 20\u003c/h4\u003e\u003cp\u003e\u003c/p\u003e" - } - ] - }, - "apps": [], - "jobName": "paragraph_1456140102445_51059930", - "id": "20160222-122142_1323614681", - "dateCreated": "Feb 22, 2016 12:21:42 PM", - "dateStarted": "Jan 29, 2017 2:42:48 AM", - "dateFinished": "Jan 29, 2017 2:42:48 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Write Scala To R", - "text": "%spark\nval s \u003d \"Hello R from Scala\"\nz.put(\"s\", s)\nval b \u003d new Integer(42)\nz.put(\"b\", b)\nval a: Array[Double] \u003d Array[Double](30.1, 20.0)\nz.put(\"a\", a)\nval m \u003d Array(Array(1, 4), Array(8, 16))\nz.put(\"m\", m)\nval v \u003d Vector(1, 2, 3, 4)\nz.put(\"v\", v)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:52:50 AM", - "config": { - "colWidth": 3.0, - "editorMode": "ace/mode/scala", - "enabled": true, - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 91.3125, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorHide": false, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\ns: String \u003d Hello R from Scala\n\nb: Integer \u003d 42\n\na: Array[Double] \u003d Array(30.1, 20.0)\n\nm: Array[Array[Int]] \u003d Array(Array(1, 4), Array(8, 16))\n\nv: scala.collection.immutable.Vector[Int] \u003d Vector(1, 2, 3, 4)\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1429862281402_-79250404", - "id": "20150424-095801_125725189", - "dateCreated": "Apr 24, 2015 9:58:01 AM", - "dateStarted": "Jan 29, 2017 2:43:19 AM", - "dateFinished": "Jan 29, 2017 2:43:21 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Read from R the Scala Variables", - "text": "%r\nz.get(\"s\")\nz.get(\"b\")\nprint(unlist(z.get(\"a\")))\nprint(unlist(z.get(\"m\")))\nz.get(\"v\")", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:52:53 AM", - "config": { - "colWidth": 3.0, - "editorMode": "ace/mode/r", - "enabled": true, - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 86.64583587646484, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - }, - "editorHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\n[1] “Hello R from Scala”\n[1] 42\n[1] 30.1 20.0\n[1] 1 4 8 16\nJava ref type scala.collection.immutable.Vector id 97 \n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1438930802740_-1781296534", - "id": "20150807-090002_1514685133", - "dateCreated": "Aug 7, 2015 9:00:02 AM", - "dateStarted": "Jan 29, 2017 2:51:36 AM", - "dateFinished": "Jan 29, 2017 2:51:36 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Write R to Scala", - "text": "%r\ns \u003c- \"Hello Scala from R\"\nprint(s)\nz.put(\"rs\", s)\nb \u003c- TRUE\nprint(b)\nz.put(\"rb\", b)\nd \u003c- 15.0\nprint(d)\nz.put(\"rd\", d)\nm \u003c- c(2.4, 2.5, 4)\nprint(m)\nz.put(\"rm\", m)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:52:55 AM", - "config": { - "colWidth": 3.0, - "enabled": true, - "editorMode": "ace/mode/r", - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 92.58333587646484, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - }, - "editorHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\n[1] “Hello Scala from R”\nNULL\n[1] TRUE\nNULL\n[1] 15\nNULL\n[1] 2.4 2.5 4.0\nNULL\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455137934157_-1786381957", - "id": "20160210-215854_620520530", - "dateCreated": "Feb 10, 2016 9:58:54 AM", - "dateStarted": "Jan 29, 2017 2:43:28 AM", - "dateFinished": "Jan 29, 2017 2:43:28 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Read from Scala the R Variables", - "text": "%spark\nprintln(\"rs \u003d \"+ z.get(\"rs\"))\nprintln(\"rb \u003d \"+ z.get(\"rb\"))\nprintln(\"rd \u003d \"+ z.get(\"rd\"))\nprintln(\"rm \u003d \"+ z.get(\"rm\"))\n// println(z.get(\"rm\").getClass)\n// println(\"rm \u003d \"+ z.get(\"rm\").asInstanceOf[Array[Double]].toSeq)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:52:58 AM", - "config": { - "colWidth": 3.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 90.64583587646484, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorHide": false, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "rs \u003d Hello Scala from R\nrb \u003d true\nrd \u003d 15.0\nrm \u003d 2.4\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455138066039_1048230112", - "id": "20160210-220106_141884849", - "dateCreated": "Feb 10, 2016 10:01:06 AM", - "dateStarted": "Jan 29, 2017 2:43:35 AM", - "dateFinished": "Jan 29, 2017 2:43:35 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Create a Spark Dataframe", - "text": "%spark\nimport org.apache.commons.io.IOUtils\nimport java.net.URL\nimport java.nio.charset.Charset\n\nval bankText \u003d sc.parallelize(\n IOUtils.toString(\n new URL(\"https://s3.amazonaws.com/apache-zeppelin/tutorial/bank/bank.csv\"),\n Charset.forName(\"utf8\")).split(\"\\n\"))\n\ncase class Bank(age: Integer, job: String, marital: String, education: String, balance: Integer)\n\nval bank \u003d bankText.map(s \u003d\u003e s.split(\";\")).filter(s \u003d\u003e s(0) !\u003d \"\\\"age\\\"\").map(\n s \u003d\u003e Bank(s(0).toInt, \n s(1).replaceAll(\"\\\"\", \"\"),\n s(2).replaceAll(\"\\\"\", \"\"),\n s(3).replaceAll(\"\\\"\", \"\"),\n s(5).replaceAll(\"\\\"\", \"\").toInt\n )\n).toDF()\nbank.registerTempTable(\"bank\")", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:46:25 AM", - "config": { - "colWidth": 6.0, - "enabled": true, - "lineNumbers": false, - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 91.27083587646484, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "editorHide": false, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\nimport org.apache.commons.io.IOUtils\n\nimport java.net.URL\n\nimport java.nio.charset.Charset\n\nbankText: org.apache.spark.rdd.RDD[String] \u003d ParallelCollectionRDD[0] at parallelize at \u003cconsole\u003e:32\n\ndefined class Bank\n\nbank: org.apache.spark.sql.DataFrame \u003d [age: int, job: string, marital: string, education: string, balance: int]\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455142039343_-233762796", - "id": "20160210-230719_2111095838", - "dateCreated": "Feb 10, 2016 11:07:19 AM", - "dateStarted": "Jan 29, 2017 2:43:40 AM", - "dateFinished": "Jan 29, 2017 2:43:45 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Read the Spark Dataframe from R", - "text": "%r\n\ndf \u003c- sql(sqlContext, \"select count(*) from bank\")\nprintSchema(df)\nSparkR::head(df)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:43:46 AM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/r", - "tableHide": false, - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 110.64583587646484, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\nroot\n |– _c0: long (nullable \u003d false)\n _c0\n1 4521\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455142043062_1598026718", - "id": "20160210-230723_1811469598", - "dateCreated": "Feb 10, 2016 11:07:23 AM", - "dateStarted": "Jan 29, 2017 2:43:47 AM", - "dateFinished": "Jan 29, 2017 2:43:49 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Query with Spark Dataframe with SQL", - "text": "%sql select count(*) as count from bank", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:47:05 AM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/sql", - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 126.25, - "optionOpen": true, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - }, - "helium": {} - } - ], - "editorSetting": { - "language": "sql", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TABLE", - "data": "count\n4521\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455142050697_-1353382095", - "id": "20160210-230730_1259663883", - "dateCreated": "Feb 10, 2016 11:07:30 AM", - "dateStarted": "Jan 29, 2017 2:43:55 AM", - "dateFinished": "Jan 29, 2017 2:43:55 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Create a R Dataframe", - "text": "%r \n\nlocalNames \u003c- data.frame(name\u003dc(\"John\", \"Smith\", \"Sarah\"), budget\u003dc(19, 53, 18))\nnames \u003c- createDataFrame(sqlContext, localNames)\nprintSchema(names)\nregisterTempTable(names, \"names\")\n\n# SparkR::head(names)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:19:59 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "title": true, - "editorMode": "ace/mode/r", - "results": [ - { - "graph": { - "mode": "table", - "height": 84.64583587646484, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - }, - "editorHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\nroot\n |– name: string (nullable \u003d true)\n |– budget: double (nullable \u003d true)\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455142112413_519883679", - "id": "20160210-230832_1847721959", - "dateCreated": "Feb 10, 2016 11:08:32 AM", - "dateStarted": "Jan 29, 2017 2:43:58 AM", - "dateFinished": "Jan 29, 2017 2:43:58 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Read the R Dataframe from Spark", - "text": "sqlc.sql(\"select * from names\").head", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:47:18 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 92.64583587646484, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "scala", - "editOnDblClick": true - }, - "editorHide": false, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\nres11: org.apache.spark.sql.Row \u003d [John,19.0]\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455188357108_95477841", - "id": "20160211-115917_445850505", - "dateCreated": "Feb 11, 2016 11:59:17 AM", - "dateStarted": "Jan 29, 2017 2:44:08 AM", - "dateFinished": "Jan 29, 2017 2:44:09 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Query the R Datafame with SQL", - "text": "%sql select * from names\n", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:47:29 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "editorMode": "ace/mode/sql", - "title": true, - "results": [ - { - "graph": { - "mode": "pieChart", - "height": 263.3125, - "optionOpen": false, - "keys": [ - { - "name": "name", - "index": 0.0, - "aggr": "sum" - } - ], - "values": [ - { - "name": "budget", - "index": 1.0, - "aggr": "sum" - } - ], - "groups": [], - "scatter": { - "xAxis": { - "name": "name", - "index": 0.0, - "aggr": "sum" - } - }, - "setting": { - "multiBarChart": {} - }, - "commonSetting": {} - }, - "helium": {} - } - ], - "editorSetting": { - "language": "sql", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TABLE", - "data": "name\tbudget\nJohn\t19.0\nSmith\t53.0\nSarah\t18.0\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455142115582_-1840950897", - "id": "20160210-230835_19876971", - "dateCreated": "Feb 10, 2016 11:08:35 AM", - "dateStarted": "Jan 29, 2017 2:44:11 AM", - "dateFinished": "Jan 29, 2017 2:44:11 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "GoogleVis: Bar Chart", - "text": "%r\nlibrary(googleVis)\ndf\u003ddata.frame(country\u003dc(\"US\", \"GB\", \"BR\"), \n val1\u003dc(10,13,14), \n val2\u003dc(23,12,32))\nBar \u003c- gvisBarChart(df)\nprint(Bar, tag \u003d \u0027chart\u0027)\n", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:16:38 AM", - "config": { - "colWidth": 4.0, - "enabled": true, - "results": { - "0": { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false - } - } - }, - "editorSetting": { - "language": "r", - "editOnDblClick": false - }, - "editorMode": "ace/mode/r", - "editorHide": false, - "tableHide": false, - "title": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\n\u003c!-- BarChart generated in R 3.3.2 by googleVis 0.6.2 package --\u003e\n\n\u003c!-- Sun Jan 29 03:11:34 2017 --\u003e\n\n\u003c!-- jsHeader --\u003e\n\n\u003cscript type\u003d\"text/javascript\"\u003e\n \n// jsData \nfunction gvisDataBarChartID17e4878cf808c () {\nvar data \u003d new google.visualization.DataTable();\nvar datajson \u003d\n[\n [\n\"US\",\n10,\n23\n],\n[\n\"GB\",\n13,\n12\n],\n[\n\"BR\",\n14,\n32\n] \n];\ndata.addColumn(\u0027string\u0027,\u0027country\u0027);\ndata.addColumn(\u0027number\u0027,\u0027val1\u0027);\ndata.addColumn(\u0027number\u0027,\u0027val2\u0027);\ndata.addRows(datajson);\nreturn(data);\n}\n \n// jsDrawChart\nfunction drawChartBarChartID17e4878cf808c() {\nvar data \u003d gvisDataBarChartID17e4878cf808c();\nvar options \u003d {};\noptions[\"allowHtml\"] \u003d true;\n\n var chart \u003d new google.visualization.BarChart(\n document.getElementById(\u0027BarChartID17e4878cf808c\u0027)\n );\n chart.draw(data,options);\n \n\n}\n \n \n// jsDisplayChart\n(function() {\nvar pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\nvar callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\nvar chartid \u003d \"corechart\";\n \n// Manually see if chartid is in pkgs (not all browsers support Array.indexOf)\nvar i, newPackage \u003d true;\nfor (i \u003d 0; newPackage \u0026\u0026 i \u003c pkgs.length; i++) {\nif (pkgs[i] \u003d\u003d\u003d chartid)\nnewPackage \u003d false;\n}\nif (newPackage)\n pkgs.push(chartid);\n \n// Add the drawChart function to the global list of callbacks\ncallbacks.push(drawChartBarChartID17e4878cf808c);\n})();\nfunction displayChartBarChartID17e4878cf808c() {\n var pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\n var callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\n window.clearTimeout(window.__gvisLoad);\n // The timeout is set to 100 because otherwise the container div we are\n // targeting might not be part of the document yet\n window.__gvisLoad \u003d setTimeout(function() {\n var pkgCount \u003d pkgs.length;\n google.load(\"visualization\", \"1\", { packages:pkgs, callback: function() {\n if (pkgCount !\u003d pkgs.length) {\n // Race condition where another setTimeout call snuck in after us; if\n // that call added a package, we must not shift its callback\n return;\n}\nwhile (callbacks.length \u003e 0)\ncallbacks.shift()();\n} });\n}, 100);\n}\n \n// jsFooter\n\u003c/script\u003e\n \n\n\u003c!-- jsChart --\u003e \n\n\u003cscript type\u003d\"text/javascript\" src\u003d\"https://www.google.com/jsapi?callback\u003ddisplayChartBarChartID17e4878cf808c\"\u003e\u003c/script\u003e\n \n\n\u003c!-- divChart --\u003e\n\n\u003cdiv id\u003d\"BarChartID17e4878cf808c\" style\u003d\"width: 500; height: automatic;\"\u003e\n\u003c/div\u003e\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1485626417184_-1153542135", - "id": "20170129-030017_426747323", - "dateCreated": "Jan 29, 2017 3:00:17 AM", - "dateStarted": "Jan 29, 2017 3:11:33 AM", - "dateFinished": "Jan 29, 2017 3:11:34 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "GoogleVis: Candlestick Chart", - "text": "%r\nlibrary(googleVis)\n\nCandle \u003c- gvisCandlestickChart(OpenClose, \n options\u003dlist(legend\u003d\u0027none\u0027))\n\nprint(Candle, tag \u003d \u0027chart\u0027)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:16:35 AM", - "config": { - "colWidth": 4.0, - "enabled": true, - "results": { - "0": { - "graph": { - "mode": "table", - "height": 84.64583587646484, - "optionOpen": false - } - } - }, - "editorSetting": { - "language": "r", - "editOnDblClick": true - }, - "editorMode": "ace/mode/r", - "editorHide": false, - "tableHide": false, - "title": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\n\u003c!-- CandlestickChart generated in R 3.3.2 by googleVis 0.6.2 package --\u003e\n\n\u003c!-- Sun Jan 29 03:16:15 2017 --\u003e\n\n\u003c!-- jsHeader --\u003e\n\n\u003cscript type\u003d\"text/javascript\"\u003e\n \n// jsData \nfunction gvisDataCandlestickChartID17e4862e18e15 () {\nvar data \u003d new google.visualization.DataTable();\nvar datajson \u003d\n[\n [\n\"Mon\",\n20,\n28,\n38,\n45\n],\n[\n\"Tues\",\n31,\n38,\n55,\n66\n],\n[\n\"Wed\",\n50,\n55,\n77,\n80\n],\n[\n\"Thurs\",\n50,\n77,\n66,\n77\n],\n[\n\"Fri\",\n15,\n66,\n22,\n68\n] \n];\ndata.addColumn(\u0027string\u0027,\u0027Weekday\u0027);\ndata.addColumn(\u0027number\u0027,\u0027Low\u0027);\ndata.addColumn(\u0027number\u0027,\u0027Open\u0027);\ndata.addColumn(\u0027number\u0027,\u0027Close\u0027);\ndata.addColumn(\u0027number\u0027,\u0027High\u0027);\ndata.addRows(datajson);\nreturn(data);\n}\n \n// jsDrawChart\nfunction drawChartCandlestickChartID17e4862e18e15() {\nvar data \u003d gvisDataCandlestickChartID17e4862e18e15();\nvar options \u003d {};\noptions[\"allowHtml\"] \u003d true;\noptions[\"legend\"] \u003d \"none\";\n\n var chart \u003d new google.visualization.CandlestickChart(\n document.getElementById(\u0027CandlestickChartID17e4862e18e15\u0027)\n );\n chart.draw(data,options);\n \n\n}\n \n \n// jsDisplayChart\n(function() {\nvar pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\nvar callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\nvar chartid \u003d \"corechart\";\n \n// Manually see if chartid is in pkgs (not all browsers support Array.indexOf)\nvar i, newPackage \u003d true;\nfor (i \u003d 0; newPackage \u0026\u0026 i \u003c pkgs.length; i++) {\nif (pkgs[i] \u003d\u003d\u003d chartid)\nnewPackage \u003d false;\n}\nif (newPackage)\n pkgs.push(chartid);\n \n// Add the drawChart function to the global list of callbacks\ncallbacks.push(drawChartCandlestickChartID17e4862e18e15);\n})();\nfunction displayChartCandlestickChartID17e4862e18e15() {\n var pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\n var callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\n window.clearTimeout(window.__gvisLoad);\n // The timeout is set to 100 because otherwise the container div we are\n // targeting might not be part of the document yet\n window.__gvisLoad \u003d setTimeout(function() {\n var pkgCount \u003d pkgs.length;\n google.load(\"visualization\", \"1\", { packages:pkgs, callback: function() {\n if (pkgCount !\u003d pkgs.length) {\n // Race condition where another setTimeout call snuck in after us; if\n // that call added a package, we must not shift its callback\n return;\n}\nwhile (callbacks.length \u003e 0)\ncallbacks.shift()();\n} });\n}, 100);\n}\n \n// jsFooter\n\u003c/script\u003e\n \n\n\u003c!-- jsChart --\u003e \n\n\u003cscript type\u003d\"text/javascript\" src\u003d\"https://www.google.com/jsapi?callback\u003ddisplayChartCandlestickChartID17e4862e18e15\"\u003e\u003c/script\u003e\n \n\n\u003c!-- divChart --\u003e\n\n\u003cdiv id\u003d\"CandlestickChartID17e4862e18e15\" style\u003d\"width: 500; height: automatic;\"\u003e\n\u003c/div\u003e\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1485627113560_-130863711", - "id": "20170129-031153_758721410", - "dateCreated": "Jan 29, 2017 3:11:53 AM", - "dateStarted": "Jan 29, 2017 3:16:15 AM", - "dateFinished": "Jan 29, 2017 3:16:15 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "GoogleVis: Line chart", - "text": "%r\nlibrary(googleVis)\ndf\u003ddata.frame(country\u003dc(\"US\", \"GB\", \"BR\"), \n val1\u003dc(10,13,14), \n val2\u003dc(23,12,32))\n\nLine \u003c- gvisLineChart(df)\n\nprint(Line, tag \u003d \u0027chart\u0027)\n", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:17:31 AM", - "config": { - "colWidth": 4.0, - "enabled": true, - "editorMode": "ace/mode/r", - "results": [ - { - "graph": { - "mode": "table", - "height": 61.458335876464844, - "optionOpen": false - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": true - }, - "editorHide": false, - "tableHide": false, - "title": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\n\u003c!-- LineChart generated in R 3.3.2 by googleVis 0.6.2 package --\u003e\n\n\u003c!-- Sun Jan 29 03:17:08 2017 --\u003e\n\n\u003c!-- jsHeader --\u003e\n\n\u003cscript type\u003d\"text/javascript\"\u003e\n \n// jsData \nfunction gvisDataLineChartID17e4818619a5d () {\nvar data \u003d new google.visualization.DataTable();\nvar datajson \u003d\n[\n [\n\"US\",\n10,\n23\n],\n[\n\"GB\",\n13,\n12\n],\n[\n\"BR\",\n14,\n32\n] \n];\ndata.addColumn(\u0027string\u0027,\u0027country\u0027);\ndata.addColumn(\u0027number\u0027,\u0027val1\u0027);\ndata.addColumn(\u0027number\u0027,\u0027val2\u0027);\ndata.addRows(datajson);\nreturn(data);\n}\n \n// jsDrawChart\nfunction drawChartLineChartID17e4818619a5d() {\nvar data \u003d gvisDataLineChartID17e4818619a5d();\nvar options \u003d {};\noptions[\"allowHtml\"] \u003d true;\n\n var chart \u003d new google.visualization.LineChart(\n document.getElementById(\u0027LineChartID17e4818619a5d\u0027)\n );\n chart.draw(data,options);\n \n\n}\n \n \n// jsDisplayChart\n(function() {\nvar pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\nvar callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\nvar chartid \u003d \"corechart\";\n \n// Manually see if chartid is in pkgs (not all browsers support Array.indexOf)\nvar i, newPackage \u003d true;\nfor (i \u003d 0; newPackage \u0026\u0026 i \u003c pkgs.length; i++) {\nif (pkgs[i] \u003d\u003d\u003d chartid)\nnewPackage \u003d false;\n}\nif (newPackage)\n pkgs.push(chartid);\n \n// Add the drawChart function to the global list of callbacks\ncallbacks.push(drawChartLineChartID17e4818619a5d);\n})();\nfunction displayChartLineChartID17e4818619a5d() {\n var pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\n var callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\n window.clearTimeout(window.__gvisLoad);\n // The timeout is set to 100 because otherwise the container div we are\n // targeting might not be part of the document yet\n window.__gvisLoad \u003d setTimeout(function() {\n var pkgCount \u003d pkgs.length;\n google.load(\"visualization\", \"1\", { packages:pkgs, callback: function() {\n if (pkgCount !\u003d pkgs.length) {\n // Race condition where another setTimeout call snuck in after us; if\n // that call added a package, we must not shift its callback\n return;\n}\nwhile (callbacks.length \u003e 0)\ncallbacks.shift()();\n} });\n}, 100);\n}\n \n// jsFooter\n\u003c/script\u003e\n \n\n\u003c!-- jsChart --\u003e \n\n\u003cscript type\u003d\"text/javascript\" src\u003d\"https://www.google.com/jsapi?callback\u003ddisplayChartLineChartID17e4818619a5d\"\u003e\u003c/script\u003e\n \n\n\u003c!-- divChart --\u003e\n\n\u003cdiv id\u003d\"LineChartID17e4818619a5d\" style\u003d\"width: 500; height: automatic;\"\u003e\n\u003c/div\u003e\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455138857313_92355963", - "id": "20160210-221417_1400405266", - "dateCreated": "Feb 10, 2016 10:14:17 AM", - "dateStarted": "Jan 29, 2017 3:17:08 AM", - "dateFinished": "Jan 29, 2017 3:17:08 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%r pairs(iris)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:58:27 AM", - "config": { - "colWidth": 4.0, - "enabled": true, - "editorMode": "ace/mode/r", - "results": [ - { - "graph": { - "mode": "table", - "height": 1857.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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Lne5S3OZy1wmBd9LX/rSqT3X5z73ueYpT3lK82d/9mfNJS5xieYBD3hA79pPf/rTc0L6/Oc/3xxzzDHNXnvt1fttGhsHH3xwc5GLXKQ5/PDDe5d75zvf2ZxwwgmpVNzvfvdrbnzjG/d+qxury4FhfenqV79644Oe/exnN2c5y1mm9qCvfe1rm5e97GXNe97znl2uecc73rG5wAUukPse8pCHTK1vE9z77rtvc41rXKP50pe+1Bx//PG9+771rW/NcXSxi10sn3efffbp/VY3tg8H9tg+j1qftMuBy13ucs3d7na35gMf+EDzlre8pSfgCb3b3e52zf7779/c+973TqFLIE+DTKYveMELGtb0Ax/4wF0E/Ic+9KHGpPTxj388J6rHPOYx07hlXuMf/uEfGopLP7385S9PAc/a2W+//aqA72fQiv6/UV9iXV/1qldtKHMU2DOd6UxTe0L3/Ld/+7dmzz333O2a7lMUzP/3//7fbr9PusPzHHnkkTl2CXr3v+AFL5iXo0xT3C960Ys2F7rQhSa9RT1vxTlQXfQr/gInbT7h/stf/rJh7dz1rnftXYZrvkwIrA6TxrTo8pe/fHoFbnnLW6YSUa7LbX+2s50t/zVBTfOe//Ef/9GcfPLJqbCU+5VvQv+sZz1rTsp4UWn1OTCsL5122mnpzqbw6YPTdF5e5zrXaQ477LDdlAYhIOECivPNbnazVJinxeVLXepSKdw/8pGPNJ67CHfX1+/f//73N094whOaF77whdO6Zb3OinGgWvAr9sKm1VzuvXve857NIx/5yOayl71s77J/+Id/mJOFHYTeec5znt5vW91guXPNf+Yzn2lMiHe/+91zQiTcS2zSRHXuc597q7fqne/5WFXHHnts853vfCeVmaLAnPnMv9dvz372s/fOqRury4Fhfela17pW86Y3vanx3sXhWbklNDWrJ/7jP/7j5tRTT81QAE/Y3//936dnbFr3e9/73pcCvOued+2jjz467/l///d/zU1vetPm/ve//7RuWa+zQhz4/Qy3Qo2uTd0aB1gud77znVPAmoC4+mj8X/3qV5u/+Zu/aV73utc1rJ2vfe1rPWt+a3f87dni+a961auab37zm82f/umfpnD/8Ic/nBMuS/pf/uVfmuOOO67ZsWPHNG6X13j84x/fHHrooc2NbnSjnMzPe97zNp/+9KfT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iRdffHE0U0v817/+1e5RO/nkk+Pdd9+d286PPvoo9u3bN7cMJz///HPHwLIixXvvvddx51ildO6550YTpqLFZc6wpp2pn0aPHp3tn3322b5PP4wfPz47vtVWW2X7tJ1rp5lmmjhkyBDfX3bZZePuu+/u+8a4ozF937f8zdGSPvj+HXfcEYcNG+b7JmFHSwTh+++880487bTT4k477eSPduWVV0Zjut7evfbay683waTkY1900UVZe9KzlbM1wSMaQ4omwJa8R0cqcM0118QLL7yw5COZidP7yQS4mMYHuPJuJnx33XXXbN/WOn1/4YUXjg8//LDvX3755dEyfPk8YlpUyXvWcwHeD961PLrnnnsi76CoPARuvPHGaKliyytcUOqbb76Jxtgj21pSXWnwn376abjqqqsCGtahhx4ajNGG008/3d7tEA4//PBgwAVjAP7bJmTfpty7NvH7b7RCyBi6S/lI+BCSFRoU5z/77LMw11xz+XrJqquuGg477LAwzzzzuCZvk4UnDvCLOsk/tKb9998/rL766mHdddd1rfq9996r+OkxS2EZAVsIzfaoo47K6tluu+2yfTIwofX+/vvvrlVzAi1+7NixWZl+/fr5Phr7bLPN5v2JNSb1MX2OQwv07bffuoaP5eeHH37wNmCdmXrqqYMJjf43//zz+zh68cUX/RokbbR82muMPzz66KN+vJx/POsRRxwRBgwY4OOqnGu4H/g8++yz5RTvtGVuueUW14YSAIUWjyuuuMIPYwVCc4KYN6abbjqPB844wSrEeijjWiQEKkEARzne7R5mNS78M8UntxrmHXgH21tvvTV8/PHHueVb62RdrcEzwa+//vqBifvMM8/0SRnmCyOA0cMwrrvuOsfm0ksv9Qn/5Zdf9t/JJJcmg19//dUZtmmift60Nd/yD09H037dZMx97rvvvvDTTz8F03h93zSOrGxn2EFIuvPOO8Pw4cOdecL0MF1XSuuss46buvEoRcBCQMM8nghzeaL11lsv/Pbbb96H3Bd68sknfaJOZZIQR9+wnIKAR+5ls+x4keuvvz6kF++rr75y8zwvKPuvvfZaePXVV73OcePGhbfeeivcfvvtAeYx44wz+vWY+TfeeGN/drMQuKBRLlPA1E6KSMYk9yyHVlxxRRdIklBSzjWdrQzLLJtsskmDzFyY4xMl4fHnn3/O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\" alt\u003d\"plot of chunk unnamed-chunk-1\" width\u003d\"100%\"\u003e\u003c/p\u003e" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455137735427_-1023869289", - "id": "20160210-215535_1815168219", - "dateCreated": "Feb 10, 2016 9:55:35 AM", - "dateStarted": "Jan 29, 2017 2:58:27 AM", - "dateFinished": "Jan 29, 2017 2:58:28 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%r \nplot(iris, col \u003d heat.colors(3))", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 2:58:24 AM", - "config": { - "colWidth": 4.0, - "enabled": true, - "editorMode": "ace/mode/r", - "results": [ - { - "graph": { - "mode": "table", - "height": 399.66668701171875, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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wF+BL1UfSQkoASWgBJSACnitA0pACSgBJaAErkACfivgZalYyxJ3UmeDLG8o6ylLlH1fgixN67lG1j9OHTzHZXnYzAS57vxwIWWTZ/REWVIydZAyecqX+rjuX14EZHlhWXLT1yBLa3J5K1+TO56tMrM2tizD7Gt9vpA6llbdT+thYmNjU+q21HFf16NPKy89duEE0qufUk/279/vc8aHDtFj0nkhs31eREQEzu+DJUtpD7JUrC/tQtKk5alNlir39JfS52cUxMdDeovTyHLSaZUzozxz4rxfzqKPjIxEnTp1sGXLlnOcEYwZMwb79u1z1ojv3r07WrZsmSHTbt26pax3/Mgjjzg/L5OLpHLffvvtaNasmXNeViPKKEglfPHFF5300nBeeumllEsyWzbptB9+mC5xGf755x80atQIr7zySkp+TZo0gUQJsq6xyyXutDRcTgROnjyJvn37Qupir169Miza3XffjRo1amDlypX47LPPzqnbaV3cu3dv1K5dG8uWLcMcOqfxpQ4MGTLE+dnQo48+mlaW5xzLTB0TAT1s2DAn73Xr1uGLL744J6/z/1iyZAlmzJjhHJ45cyZkHfRq1aqdn0z/zkIC6dXP3bt3O77L5SfF4ntB+kVvYdWqVZB+VK5LHTLT58l6+PLT0M2bN+Pxxx9H/fr1naykH5W136+++mpHMX3vvfdS3+KcfRHcffr0QdOmTbFp0yZ8+umnKee/+eYbiM8SWf9d6rW0nfTCtGnT8McffzgK6IMPPgguU5uSdNCgQc5PqNesWQPJMyNnYykX5tQONR6/C7Ie+80332xzVHtO2VkRbDo6sDliOue4tz9YMW1WKpsa6znJ6LPXpnOLTK0j/uSTT9qyhjI10X+tf3whZZMCUQu2b731VptejFLKRw3VZsWzKfhtWjFSjuvO5UXgueeesylI7c8//zzDgnG0YM+bN89J9/rrr9sU2F6v4QjYpiLgpOncubNT57xewJOS/4ABA+wJEyZklNTObB2jsLbFB4JcJ+2JAj/De0iC+fPn23TM41NaTXRpCaRXPyls7fXr1zs369ixo9ebcuRucyBit2nT5l/pMtPnedrI4sWL7WeeeSYlLzprceqVHLj33nttWntSzp2/I/WOgtc5TAFuc5CWkoTLvdiSNweAKcfS25F00q+KDBg/fnxKMo7cbVnbXoKs2+9p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\u003d\" alt\u003d\"plot of chunk unnamed-chunk-1\" width\u003d\"100%\"\u003e\u003c/p\u003e" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455137737773_-549089146", - "id": "20160210-215537_582262164", - "dateCreated": "Feb 10, 2016 9:55:37 AM", - "dateStarted": "Jan 29, 2017 2:58:24 AM", - "dateFinished": "Jan 29, 2017 2:58:25 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%r\nlibrary(ggplot2)\npres_rating \u003c- data.frame(\n rating \u003d as.numeric(presidents),\n year \u003d as.numeric(floor(time(presidents))),\n quarter \u003d as.numeric(cycle(presidents))\n)\np \u003c- ggplot(pres_rating, aes(x\u003dyear, y\u003dquarter, fill\u003drating))\np + geom_raster()", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:04:03 AM", - "config": { - "colWidth": 4.0, - "enabled": true, - "editorMode": "ace/mode/r", - "results": [ - { - "graph": { - "mode": "table", - "height": 449.66668701171875, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - }, - "editorHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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\u003d\" alt\u003d\"plot of chunk unnamed-chunk-1\" width\u003d\"100%\"\u003e\u003c/p\u003e" - } - ] - }, - "apps": [], - "jobName": "paragraph_1438930880648_-1572054429", - "id": "20150807-090120_1060568667", - "dateCreated": "Aug 7, 2015 9:01:20 AM", - "dateStarted": "Jan 29, 2017 3:04:03 AM", - "dateFinished": "Jan 29, 2017 3:04:04 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "GoogleViz: Bubble Chart", - "text": "%r\nlibrary(googleVis)\nbubble \u003c- gvisBubbleChart(Fruits, idvar\u003d\"Fruit\", \n xvar\u003d\"Sales\", yvar\u003d\"Expenses\",\n colorvar\u003d\"Year\", sizevar\u003d\"Profit\",\n options\u003dlist(\n hAxis\u003d\u0027{minValue:75, maxValue:125}\u0027))\nprint(bubble, tag \u003d \u0027chart\u0027)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:14:35 AM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/r", - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 189.6666717529297, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - }, - "editorHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\n\u003c!-- BubbleChart generated in R 3.3.2 by googleVis 0.6.2 package --\u003e\n\n\u003c!-- Sun Jan 29 03:14:35 2017 --\u003e\n\n\u003c!-- jsHeader --\u003e\n\n\u003cscript type\u003d\"text/javascript\"\u003e\n \n// jsData \nfunction gvisDataBubbleChartID17e4815dd498c () {\nvar data \u003d new google.visualization.DataTable();\nvar datajson \u003d\n[\n [\n\"Apples\",\n98,\n78,\n\"2008\",\n20\n],\n[\n\"Apples\",\n111,\n79,\n\"2009\",\n32\n],\n[\n\"Apples\",\n89,\n76,\n\"2010\",\n13\n],\n[\n\"Oranges\",\n96,\n81,\n\"2008\",\n15\n],\n[\n\"Bananas\",\n85,\n76,\n\"2008\",\n9\n],\n[\n\"Oranges\",\n93,\n80,\n\"2009\",\n13\n],\n[\n\"Bananas\",\n94,\n78,\n\"2009\",\n16\n],\n[\n\"Oranges\",\n98,\n91,\n\"2010\",\n7\n],\n[\n\"Bananas\",\n81,\n71,\n\"2010\",\n10\n] \n];\ndata.addColumn(\u0027string\u0027,\u0027Fruit\u0027);\ndata.addColumn(\u0027number\u0027,\u0027Sales\u0027);\ndata.addColumn(\u0027number\u0027,\u0027Expenses\u0027);\ndata.addColumn(\u0027string\u0027,\u0027Year\u0027);\ndata.addColumn(\u0027number\u0027,\u0027Profit\u0027);\ndata.addRows(datajson);\nreturn(data);\n}\n \n// jsDrawChart\nfunction drawChartBubbleChartID17e4815dd498c() {\nvar data \u003d gvisDataBubbleChartID17e4815dd498c();\nvar options \u003d {};\noptions[\"hAxis\"] \u003d {minValue:75, maxValue:125};\n\n var chart \u003d new google.visualization.BubbleChart(\n document.getElementById(\u0027BubbleChartID17e4815dd498c\u0027)\n );\n chart.draw(data,options);\n \n\n}\n \n \n// jsDisplayChart\n(function() {\nvar pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\nvar callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\nvar chartid \u003d \"corechart\";\n \n// Manually see if chartid is in pkgs (not all browsers support Array.indexOf)\nvar i, newPackage \u003d true;\nfor (i \u003d 0; newPackage \u0026\u0026 i \u003c pkgs.length; i++) {\nif (pkgs[i] \u003d\u003d\u003d chartid)\nnewPackage \u003d false;\n}\nif (newPackage)\n pkgs.push(chartid);\n \n// Add the drawChart function to the global list of callbacks\ncallbacks.push(drawChartBubbleChartID17e4815dd498c);\n})();\nfunction displayChartBubbleChartID17e4815dd498c() {\n var pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\n var callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\n window.clearTimeout(window.__gvisLoad);\n // The timeout is set to 100 because otherwise the container div we are\n // targeting might not be part of the document yet\n window.__gvisLoad \u003d setTimeout(function() {\n var pkgCount \u003d pkgs.length;\n google.load(\"visualization\", \"1\", { packages:pkgs, callback: function() {\n if (pkgCount !\u003d pkgs.length) {\n // Race condition where another setTimeout call snuck in after us; if\n // that call added a package, we must not shift its callback\n return;\n}\nwhile (callbacks.length \u003e 0)\ncallbacks.shift()();\n} });\n}, 100);\n}\n \n// jsFooter\n\u003c/script\u003e\n \n\n\u003c!-- jsChart --\u003e \n\n\u003cscript type\u003d\"text/javascript\" src\u003d\"https://www.google.com/jsapi?callback\u003ddisplayChartBubbleChartID17e4815dd498c\"\u003e\u003c/script\u003e\n \n\n\u003c!-- divChart --\u003e\n\n\u003cdiv id\u003d\"BubbleChartID17e4815dd498c\" style\u003d\"width: 500; height: automatic;\"\u003e\n\u003c/div\u003e\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455141578555_-1713165000", - "id": "20160210-225938_1538591791", - "dateCreated": "Feb 10, 2016 10:59:38 AM", - "dateStarted": "Jan 29, 2017 3:14:35 AM", - "dateFinished": "Jan 29, 2017 3:14:35 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "GoogleViz: Geo Chart", - "text": "%r\nlibrary(googleVis)\ngeo \u003d gvisGeoChart(Exports, locationvar \u003d \"Country\", colorvar\u003d\"Profit\", options\u003dlist(Projection \u003d \"kavrayskiy-vii\"))\nprint(geo, tag \u003d \u0027chart\u0027)", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:14:38 AM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/r", - "results": [ - { - "graph": { - "mode": "table", - "height": 336.66668701171875, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "r", - "editOnDblClick": false - }, - "editorHide": false, - "title": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\n\u003c!-- GeoChart generated in R 3.3.2 by googleVis 0.6.2 package --\u003e\n\n\u003c!-- Sun Jan 29 03:14:38 2017 --\u003e\n\n\u003c!-- jsHeader --\u003e\n\n\u003cscript type\u003d\"text/javascript\"\u003e\n \n// jsData \nfunction gvisDataGeoChartID17e485996beba () {\nvar data \u003d new google.visualization.DataTable();\nvar datajson \u003d\n[\n [\n\"Germany\",\n3\n],\n[\n\"Brazil\",\n4\n],\n[\n\"United States\",\n5\n],\n[\n\"France\",\n4\n],\n[\n\"Hungary\",\n3\n],\n[\n\"India\",\n2\n],\n[\n\"Iceland\",\n1\n],\n[\n\"Norway\",\n4\n],\n[\n\"Spain\",\n5\n],\n[\n\"Turkey\",\n1\n] \n];\ndata.addColumn(\u0027string\u0027,\u0027Country\u0027);\ndata.addColumn(\u0027number\u0027,\u0027Profit\u0027);\ndata.addRows(datajson);\nreturn(data);\n}\n \n// jsDrawChart\nfunction drawChartGeoChartID17e485996beba() {\nvar data \u003d gvisDataGeoChartID17e485996beba();\nvar options \u003d {};\noptions[\"width\"] \u003d 556;\noptions[\"height\"] \u003d 347;\noptions[\"Projection\"] \u003d \"kavrayskiy-vii\";\n\n var chart \u003d new google.visualization.GeoChart(\n document.getElementById(\u0027GeoChartID17e485996beba\u0027)\n );\n chart.draw(data,options);\n \n\n}\n \n \n// jsDisplayChart\n(function() {\nvar pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\nvar callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\nvar chartid \u003d \"geochart\";\n \n// Manually see if chartid is in pkgs (not all browsers support Array.indexOf)\nvar i, newPackage \u003d true;\nfor (i \u003d 0; newPackage \u0026\u0026 i \u003c pkgs.length; i++) {\nif (pkgs[i] \u003d\u003d\u003d chartid)\nnewPackage \u003d false;\n}\nif (newPackage)\n pkgs.push(chartid);\n \n// Add the drawChart function to the global list of callbacks\ncallbacks.push(drawChartGeoChartID17e485996beba);\n})();\nfunction displayChartGeoChartID17e485996beba() {\n var pkgs \u003d window.__gvisPackages \u003d window.__gvisPackages || [];\n var callbacks \u003d window.__gvisCallbacks \u003d window.__gvisCallbacks || [];\n window.clearTimeout(window.__gvisLoad);\n // The timeout is set to 100 because otherwise the container div we are\n // targeting might not be part of the document yet\n window.__gvisLoad \u003d setTimeout(function() {\n var pkgCount \u003d pkgs.length;\n google.load(\"visualization\", \"1\", { packages:pkgs, callback: function() {\n if (pkgCount !\u003d pkgs.length) {\n // Race condition where another setTimeout call snuck in after us; if\n // that call added a package, we must not shift its callback\n return;\n}\nwhile (callbacks.length \u003e 0)\ncallbacks.shift()();\n} });\n}, 100);\n}\n \n// jsFooter\n\u003c/script\u003e\n \n\n\u003c!-- jsChart --\u003e \n\n\u003cscript type\u003d\"text/javascript\" src\u003d\"https://www.google.com/jsapi?callback\u003ddisplayChartGeoChartID17e485996beba\"\u003e\u003c/script\u003e\n \n\n\u003c!-- divChart --\u003e\n\n\u003cdiv id\u003d\"GeoChartID17e485996beba\" style\u003d\"width: 556; height: 347;\"\u003e\n\u003c/div\u003e\n\n\n\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1455140544963_1486338978", - "id": "20160210-224224_735421242", - "dateCreated": "Feb 10, 2016 10:42:24 AM", - "dateStarted": "Jan 29, 2017 3:14:38 AM", - "dateFinished": "Jan 29, 2017 3:14:38 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n\n## Congratulations, it\u0027s done.\n### You can create your own notebook in \u0027Notebook\u0027 menu. Good luck!", - "user": "anonymous", - "dateUpdated": "Jan 29, 2017 3:12:06 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "markdown", - "editOnDblClick": true - }, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch2\u003eCongratulations, it\u0026rsquo;s done.\u003c/h2\u003e\n\u003ch3\u003eYou can create your own notebook in \u0026lsquo;Notebook\u0026rsquo; menu. Good luck!\u003c/h3\u003e\n\u003c/div\u003e" - } - ] - }, - "apps": [], - "jobName": "paragraph_1485626988585_-946362813", - "id": "20170129-030948_1379298104", - "dateCreated": "Jan 29, 2017 3:09:48 AM", - "dateStarted": "Jan 29, 2017 3:12:06 AM", - "dateFinished": "Jan 29, 2017 3:12:06 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - } - ], - "name": "Zeppelin Tutorial/R (SparkR)", - "id": "2BWJFTXKJ", - "angularObjects": { - "2C9A5UJ3F:shared_process": [], - "2C8D7ETGW:shared_process": [], - "2C9S19J4N:shared_process": [], - "2C734G5GU:shared_process": [], - "2C7F9HJVB:shared_process": [], - "2C7RMKT4T:shared_process": [], - "2C6UPN6XS:shared_process": [], - "2C8MCDYHM:shared_process": [], - "2C7GPJHE2:shared_process": [], - "2C81DYM51:shared_process": [], - "2C7Z5PJKA:shared_process": [], - "2C7KKEX6R:shared_process": [], - "2C8G679A7:shared_process": [], - "2C96T367K:shared_process": [], - "2C79TYUDA:shared_process": [], - "2C82EG3YP:shared_process": [], - "2C8C4BYC9:shared_process": [], - "2C77RB7Q2:shared_process": [], - "2C9ENJ461:shared_process": [] - }, - "config": { - "looknfeel": "default" - }, - "info": {} -} diff --git a/smart-zeppelin/notebook/2BYEZ5EVK/note.json b/smart-zeppelin/notebook/2BYEZ5EVK/note.json deleted file mode 100644 index 83a79135f7e..00000000000 --- a/smart-zeppelin/notebook/2BYEZ5EVK/note.json +++ /dev/null @@ -1,887 +0,0 @@ -{ - "paragraphs": [ - { - "text": "%md\n\n### The [Apache Mahout](http://mahout.apache.org/)™ project\u0027s goal is to build an environment for quickly creating scalable performant machine learning applications.\n\n#### Apache Mahout software provides three major features:\n\n- A simple and extensible programming environment and framework for building scalable algorithms\n- A wide variety of premade algorithms for Scala + Apache Spark, H2O, Apache Flink\n- Samsara, a vector math experimentation environment with R-like syntax which works at scale\n\n#### In other words:\n\n*Apache Mahout provides a unified API for quickly creating machine learning algorithms on a variety of engines.*\n\n#### Getting Started\n\nApache Mahout is a collection of Libraries that enhance Apache Flink, Apache Spark, and others. Currently Zeppelin support the Flink and Spark Engines. A convenience script is provided to setup the nessecary imports and configurations to run Mahout on Spark and Flink. \n\nWe can use Apache Mahout\u0027s R-Like Domain Specific Language (DSL) inline with native Flink or Spark code. We must however, first declare a few imports that are different for Spark and Flink\n\n__References:__\n\n[Mahout-Samsara\u0027s In-Core Linear Algebra DSL Reference](http://mahout.apache.org/users/environment/in-core-reference.html)\n[Mahout-Samsara\u0027s Distributed Linear Algebra DSL Reference](http://mahout.apache.org/users/environment/out-of-core-reference.html)\n[Getting Started with the Mahout-Samsara Shell](http://mahout.apache.org/users/sparkbindings/play-with-shell.html)\n", - "dateUpdated": "Sep 28, 2016 10:01:52 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "editorHide": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475013396125_39313566", - "id": "20160927-155636_1798325301", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003ch3\u003eThe \u003ca href\u003d\"http://mahout.apache.org/\"\u003eApache Mahout\u003c/a\u003e™ project\u0027s goal is to build an environment for quickly creating scalable performant machine learning applications.\u003c/h3\u003e\n\u003ch4\u003eApache Mahout software provides three major features:\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eA simple and extensible programming environment and framework for building scalable algorithms\u003c/li\u003e\n\u003cli\u003eA wide variety of premade algorithms for Scala + Apache Spark, H2O, Apache Flink\u003c/li\u003e\n\u003cli\u003eSamsara, a vector math experimentation environment with R-like syntax which works at scale\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eIn other words:\u003c/h4\u003e\n\u003cp\u003e\u003cem\u003eApache Mahout provides a unified API for quickly creating machine learning algorithms on a variety of engines.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eReferences:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href\u003d\"http://mahout.apache.org/users/environment/in-core-reference.html\"\u003eMahout-Samsara\u0027s In-Core Linear Algebra DSL Reference\u003c/a\u003e\n\u003cbr /\u003e\u003ca href\u003d\"http://mahout.apache.org/users/environment/out-of-core-reference.html\"\u003eMahout-Samsara\u0027s Distributed Linear Algebra DSL Reference\u003c/a\u003e\n\u003cbr /\u003e\u003ca href\u003d\"http://mahout.apache.org/users/sparkbindings/play-with-shell.html\"\u003eGetting Started with the Mahout-Samsara Shell\u003c/a\u003e\u003c/p\u003e\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 3:56:36 AM", - "dateStarted": "Sep 27, 2016 4:02:55 AM", - "dateFinished": "Sep 27, 2016 4:02:55 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n\n#### \"Installing\" the Apache Mahout dependencies and configuring a new Spark and Flink interpreter\n\nThe following two paragraphs are convenience paragraphs. You **only need to run them once** to create two new interpreters `%spark.mahout` and `%flink.mahout`. These are intended for users who don\u0027t have Apache Mahout already installed. They assume you started Apache Zeppelin from the top level directory or from the bin. You can tell which one is you by weather you started Zeppelin by typing `./zeppelin-daemon.sh start` or `bin/zeppelin-daemon.sh start`. If you started Zeppelin from somewhere else you will also need to run them from the command line.\n\nThey both run a python script which may be found at `ZEPPELIN_HOME/scripts/mahout/add_mahout.py`\n\nIn short this script:\n- Downloads Apache Mahout\n- Creates a new Flink interpreter with dependencies.\n- Creates a new Spark interpreter with dependencies and modified configuration to use Kryo serialization.\n\n__You only need to run this script once ever.__ (Maybe again if for some reason you delete `conf/interpreter.json`) \n", - "dateUpdated": "Sep 27, 2016 4:31:15 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "editorHide": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475015019489_-1704057033", - "id": "20160927-162339_341514150", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003ch4\u003e\u0026ldquo;Installing\u0026rdquo; the Apache Mahout dependencies and configuring a new Spark and Flink interpreter\u003c/h4\u003e\n\u003cp\u003eThe following two paragraphs are convenience paragraphs. You \u003cstrong\u003eonly need to run them once\u003c/strong\u003e to create two new interpreters \u003ccode\u003e%spark.mahout\u003c/code\u003e and \u003ccode\u003e%flink.mahout\u003c/code\u003e. These are intended for users who don\u0027t have Apache Mahout already installed. They assume you started Apache Zeppelin from the top level directory or from the bin. You can tell which one is you by weather you started Zeppelin by typing \u003ccode\u003e./zeppelin-daemon.sh start\u003c/code\u003e or \u003ccode\u003ebin/zeppelin-daemon.sh start\u003c/code\u003e. If you started Zeppelin from somewhere else you will also need to run them from the command line.\u003c/p\u003e\n\u003cp\u003eThey both run a python script which may be found at \u003ccode\u003eZEPPELIN_HOME/scripts/mahout/add_mahout.py\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIn short this script:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDownloads Apache Mahout\u003c/li\u003e\n\u003cli\u003eCreates a new Flink interpreter with dependencies.\u003c/li\u003e\n\u003cli\u003eCreates a new Spark interpreter with dependencies and modified configuration to use Kryo serialization.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eYou only need to run this script once ever.\u003c/strong\u003e (Maybe again if for some reason you delete \u003ccode\u003econf/interpreter.json\u003c/code\u003e)\u003c/p\u003e\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 4:23:39 AM", - "dateStarted": "Sep 27, 2016 4:31:12 AM", - "dateFinished": "Sep 27, 2016 4:31:13 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Convenience Paragraph if you started Zeppelin by \u0027./zeppelin-daemon.sh start\u0027", - "text": "%sh\n\npython ../scripts/mahout/add_mahout.py", - "dateUpdated": "Dec 17, 2016 3:41:45 PM", - "config": { - "colWidth": 12.0, - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - }, - "enabled": true, - "editorMode": "ace/mode/sh", - "title": true, - "results": {}, - "editorSetting": { - "language": "sh", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475014957043_-748248820", - "id": "20160927-162237_1864782562", - "dateCreated": "Sep 27, 2016 4:22:37 AM", - "status": "READY", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Convenience Paragraph if you started Zeppelin by \u0027bin/zeppelin-daemon.sh start\u0027", - "text": "%sh\npython scripts/mahout/add_mahout_interpreters.py", - "dateUpdated": "Dec 17, 2016 3:41:46 PM", - "config": { - "colWidth": 12.0, - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - }, - "enabled": true, - "editorMode": "ace/mode/sh", - "title": true, - "results": {}, - "editorSetting": { - "language": "sh", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475018789604_-139338572", - "id": "20160927-172629_1189436716", - "dateCreated": "Sep 27, 2016 5:26:29 AM", - "status": "READY", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n\nAfter the interpreters are created you will need to \u0027bind\u0027 them by clicking on the little gear in the top right corner, scrolling to the top, and clicking on `mahoutFlink` and `mahoutSpark` so that they are highlighted in blue.\n\n#### Running Mahout code\n\nYou will need to import certain libraries, and declare the _Mahout Distributed Context_ when you first start your notebook using the interpreters. \n\nIf using Apache Flink the code you need to run is:\n```scala\n%flinkMahout\n\nimport org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\n\n\nimplicit val ctx \u003d new FlinkDistributedContext(benv)\n```\n\nIf using Apache Spark the code you need to run is\n```scala\n%sparkMahout\n\nimport org.apache.mahout.math._\nimport org.apache.mahout.math.scalabindings._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.scalabindings.RLikeOps._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.sparkbindings._\n\nimplicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d sc2sdc(sc)\n```\n\n__Note: For Apache Mahout on Apache Spark you must be running Spark 1.5.x or 1.6.x. We are working hard on supporting Spark 2.0__\nIn the meantime, feel free to play with Mahout on Flink and then simple _copy and paste your Mahout code to Spark once it is supported!_\n\n### A Side by Side Example\n", - "dateUpdated": "Sep 28, 2016 12:36:44 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475014730618_1513783554", - "id": "20160927-161850_1560940440", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cp\u003eAfter the interpreters are created you will need to \u0027bind\u0027 them by clicking on the little gear in the top right corner, scrolling to the top, and clicking on \u003ccode\u003emahoutFlink\u003c/code\u003e and \u003ccode\u003emahoutSpark\u003c/code\u003e so that they are highlighted in blue.\u003c/p\u003e\n\u003ch4\u003eRunning Mahout code\u003c/h4\u003e\n\u003cp\u003eYou will need to import certain libraries, and declare the \u003cem\u003eMahout Distributed Context\u003c/em\u003e when you first start your notebook using the interpreters.\u003c/p\u003e\n\u003cp\u003eIf using Apache Flink the code you need to run is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class\u003d\"scala\"\u003e%flinkMahout\n\nimport org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\n\n\n@transient implicit val ctx \u003d new FlinkDistributedContext(benv)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf using Apache Spark the code you need to run is\u003c/p\u003e\n\u003cpre\u003e\u003ccode class\u003d\"scala\"\u003e%sparkMahout\n\nimport org.apache.mahout.math._\nimport org.apache.mahout.math.scalabindings._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.scalabindings.RLikeOps._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.sparkbindings._\n\nimplicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d sc2sdc(sc)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eNote: For Apache Mahout on Apache Spark you must be running Spark 1.5.x or 1.6.x. We are working hard on supporting Spark 2.0\u003c/strong\u003e\n\u003cbr /\u003eIn the meantime, feel free to play with Mahout on Flink and then simple \u003cem\u003ecopy and paste your Mahout code to Spark once it is supported!\u003c/em\u003e\u003c/p\u003e\n\u003ch3\u003eA Side by Side Example\u003c/h3\u003e\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 4:18:50 AM", - "dateStarted": "Sep 28, 2016 10:17:05 AM", - "dateFinished": "Sep 28, 2016 10:17:06 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%flinkMahout\n\n// Imports and creating the distributed context, similar but not exactly the same ///////////////////////////////////////////\nimport org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\n\n\nimplicit val ctx \u003d new FlinkDistributedContext(benv)\n\n// CODE IS EXACTLY THE SAME FROM HERE ON - R-Like DSL ////////////////////////////////////////////////////////////////////////////////\n\nval drmData \u003d drmParallelize(dense(\n (2, 2, 10.5, 10, 29.509541), // Apple Cinnamon Cheerios\n (1, 2, 12, 12, 18.042851), // Cap\u0027n\u0027Crunch\n (1, 1, 12, 13, 22.736446), // Cocoa Puffs\n (2, 1, 11, 13, 32.207582), // Froot Loops\n (1, 2, 12, 11, 21.871292), // Honey Graham Ohs\n (2, 1, 16, 8, 36.187559), // Wheaties Honey Gold\n (6, 2, 17, 1, 50.764999), // Cheerios\n (3, 2, 13, 7, 40.400208), // Clusters\n (3, 3, 13, 4, 45.811716)), numPartitions \u003d 2)\n \ndrmData.collect(::, 0 until 4)\n\nval drmX \u003d drmData(::, 0 until 4)\nval y \u003d drmData.collect(::, 4)\nval drmXtX \u003d drmX.t %*% drmX\nval drmXty \u003d drmX.t %*% y\n\n\nval XtX \u003d drmXtX.collect\nval Xty \u003d drmXty.collect(::, 0)\nval beta \u003d solve(XtX, Xty)\n\n", - "dateUpdated": "Sep 28, 2016 1:41:59 PM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/markdown", - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475015779325_-1869239670", - "id": "20160927-163619_899520006", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "import org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\nctx: org.apache.mahout.flinkbindings.FlinkDistributedContext \u003d org.apache.mahout.flinkbindings.FlinkDistributedContext@4452b0a5\nwarning: Class it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap not found - continuing with a stub.\ndrmData: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be\n(5,9)\nres1: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:2.0,1:2.0,2:10.5,3:10.0}\n 1 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:12.0}\n 2 \u003d\u003e\t{0:1.0,1:1.0,2:12.0,3:13.0}\n 3 \u003d\u003e\t{0:2.0,1:1.0,2:11.0,3:13.0}\n 4 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:11.0}\n 5 \u003d\u003e\t{0:2.0,1:1.0,2:16.0,3:8.0}\n 6 \u003d\u003e\t{0:6.0,1:2.0,2:17.0,3:1.0}\n 7 \u003d\u003e\t{0:3.0,1:2.0,2:13.0,3:7.0}\n 8 \u003d\u003e\t{0:3.0,1:3.0,2:13.0,3:4.0}\n}\ndrmX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true)\n(5,9)\ny: org.apache.mahout.math.Vector \u003d {0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716}\ndrmXtX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpABAnyKey(OpAt(OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true)),OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true))\ndrmXty: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpAx(OpAt(OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true)),{0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716})\n(4,4)\nXtX: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:69.0,1:40.0,2:291.0,3:137.0}\n 1 \u003d\u003e\t{0:40.0,1:32.0,2:207.0,3:128.0}\n 2 \u003d\u003e\t{0:291.0,1:207.0,2:1546.25,3:968.0}\n 3 \u003d\u003e\t{0:137.0,1:128.0,2:968.0,3:833.0}\n}\n(1,4)\nXty: org.apache.mahout.math.Vector \u003d {0:821.6857190000001,1:549.744517,2:3978.7015895000004,3:2272.7799889999997}\nbeta: org.apache.mahout.math.Vector \u003d {0:5.247349465378393,1:2.7507945784675067,2:1.1527813010791783,3:0.10312017617607437}\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 4:36:19 AM", - "dateStarted": "Sep 28, 2016 1:41:59 PM", - "dateFinished": "Sep 28, 2016 1:42:25 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%sparkMahout\n\n// Imports and creating the distributed context, similar but not exactly the same ///////////////////////////////////////////\n\nimport org.apache.mahout.math._\nimport org.apache.mahout.math.scalabindings._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.scalabindings.RLikeOps._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.sparkbindings._\n\nimplicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d sc2sdc(sc)\n\n\n// CODE IS EXACTLY THE SAME FROM HERE ON - R-Like DSL ////////////////////////////////////////////////////////////////////////////////\n\nval drmData \u003d drmParallelize(dense(\n (2, 2, 10.5, 10, 29.509541), // Apple Cinnamon Cheerios\n (1, 2, 12, 12, 18.042851), // Cap\u0027n\u0027Crunch\n (1, 1, 12, 13, 22.736446), // Cocoa Puffs\n (2, 1, 11, 13, 32.207582), // Froot Loops\n (1, 2, 12, 11, 21.871292), // Honey Graham Ohs\n (2, 1, 16, 8, 36.187559), // Wheaties Honey Gold\n (6, 2, 17, 1, 50.764999), // Cheerios\n (3, 2, 13, 7, 40.400208), // Clusters\n (3, 3, 13, 4, 45.811716)), numPartitions \u003d 2)\n \ndrmData.collect(::, 0 until 4)\n\nval drmX \u003d drmData(::, 0 until 4)\nval y \u003d drmData.collect(::, 4)\nval drmXtX \u003d drmX.t %*% drmX\nval drmXty \u003d drmX.t %*% y\n\n\nval XtX \u003d drmXtX.collect\nval Xty \u003d drmXty.collect(::, 0)\nval beta \u003d solve(XtX, Xty)\n", - "dateUpdated": "Sep 28, 2016 1:45:09 PM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475016737629_-774084480", - "id": "20160927-165217_1266863511", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\nimport org.apache.mahout.math._\n\nimport org.apache.mahout.math.scalabindings._\n\nimport org.apache.mahout.math.drm._\n\nimport org.apache.mahout.math.scalabindings.RLikeOps._\n\nimport org.apache.mahout.math.drm.RLikeDrmOps._\n\nimport org.apache.mahout.sparkbindings._\n\nsdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d org.apache.mahout.sparkbindings.SparkDistributedContext@32c46474\n\ndrmData: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9\n\n\n\n\n\n\n\n\n\n\n\n\nres2: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:2.0,1:2.0,2:10.5,3:10.0}\n 1 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:12.0}\n 2 \u003d\u003e\t{0:1.0,1:1.0,2:12.0,3:13.0}\n 3 \u003d\u003e\t{0:2.0,1:1.0,2:11.0,3:13.0}\n 4 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:11.0}\n 5 \u003d\u003e\t{0:2.0,1:1.0,2:16.0,3:8.0}\n 6 \u003d\u003e\t{0:6.0,1:2.0,2:17.0,3:1.0}\n 7 \u003d\u003e\t{0:3.0,1:2.0,2:13.0,3:7.0}\n 8 \u003d\u003e\t{0:3.0,1:3.0,2:13.0,3:4.0}\n}\n\ndrmX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true)\n\ny: org.apache.mahout.math.Vector \u003d {0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716}\n\ndrmXtX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpABAnyKey(OpAt(OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true)),OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true))\n\ndrmXty: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpAx(OpAt(OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true)),{0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716})\n\n\n\n\n\n\n\nXtX: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:69.0,1:40.0,2:291.0,3:137.0}\n 1 \u003d\u003e\t{0:40.0,1:32.0,2:207.0,3:128.0}\n 2 \u003d\u003e\t{0:291.0,1:207.0,2:1546.25,3:968.0}\n 3 \u003d\u003e\t{0:137.0,1:128.0,2:968.0,3:833.0}\n}\n\nXty: org.apache.mahout.math.Vector \u003d {0:821.6857190000001,1:549.744517,2:3978.7015894999995,3:2272.779989}\n\nbeta: org.apache.mahout.math.Vector \u003d {0:5.247349465378446,1:2.750794578467531,2:1.1527813010791554,3:0.10312017617608908}\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 4:52:17 AM", - "dateStarted": "Sep 28, 2016 1:45:09 PM", - "dateFinished": "Sep 28, 2016 1:45:23 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Use Resource Pools with Zeppelin", - "text": "%md\n\n### Taking advantage of Zeppelin Resource Pools\n\nOne of the major motivations for integrating Apache Mahout with Apache Zeppelin was the many benefits that come from leveraging the resource pools. A resource pool is a block of memory that can be acccessed by all interpreters and is useful for sharing small variables between the interpreters. \n\nThe Spark interpreter has a simple interface for accessing the ResourcePools, the Flink interface is less documented but can be reverse engineered from code (thanks open source!)\n\n\nCollect betas from Spark and Flink- compare in Python\n\nCreate Matrix in Flink and Spark - visualize with R", - "dateUpdated": "Sep 27, 2016 5:55:31 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "title": true, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475016792277_-1100474141", - "id": "20160927-165312_1668894932", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003ch3\u003eTaking advantage of Zeppelin Resource Pools\u003c/h3\u003e\n\u003cp\u003eOne of the major motivations for integrating Apache Mahout with Apache Zeppelin was the many benefits that come from leveraging the resource pools. A resource pool is a block of memory that can be acccessed by all interpreters and is useful for sharing small variables between the interpreters.\u003c/p\u003e\n\u003cp\u003eThe Spark interpreter has a simple interface for accessing the ResourcePools, the Flink interface is less documented but can be reverse engineered from code (thanks open source!)\u003c/p\u003e\n\u003cp\u003eCollect betas from Spark and Flink- compare in Python\u003c/p\u003e\n\u003cp\u003eCreate Matrix in Flink and Spark - visualize with R\u003c/p\u003e\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 4:53:12 AM", - "dateStarted": "Sep 27, 2016 5:40:35 AM", - "dateFinished": "Sep 27, 2016 5:40:36 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Flink ResourcePools", - "text": "%flinkMahout\n\nimport org.apache.zeppelin.interpreter.InterpreterContext\n\nval resourcePool \u003d InterpreterContext.get().getResourcePool()\n\nresourcePool.put(\"flinkBeta\", beta.asFormatString)\n", - "dateUpdated": "Sep 28, 2016 1:42:35 PM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475019635571_-1705373112", - "id": "20160927-174035_1591078106", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "import org.apache.zeppelin.interpreter.InterpreterContext\nresourcePool: org.apache.zeppelin.resource.ResourcePool \u003d org.apache.zeppelin.resource.DistributedResourcePool@3fdd93cc\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 5:40:35 AM", - "dateStarted": "Sep 28, 2016 1:42:35 PM", - "dateFinished": "Sep 28, 2016 1:42:36 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Spark ResourcePools", - "text": "%sparkMahout\n\n\n\n\nz.put(\"sparkBeta\", beta.asFormatString)", - "dateUpdated": "Sep 28, 2016 1:45:35 PM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "title": true, - "results": [] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475019751650_-1885234738", - "id": "20160927-174231_1288588876", - "results": { - "code": "SUCCESS", - "msg": [] - }, - "dateCreated": "Sep 27, 2016 5:42:31 AM", - "dateStarted": "Sep 28, 2016 1:45:35 PM", - "dateFinished": "Sep 28, 2016 1:45:36 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Collect Results in Python and Evaluate Differences", - "text": "%spark.pyspark\n\nimport ast\n\nflinkBetaDict \u003d ast.literal_eval(z.get(\"flinkBeta\"))\nsparkBetaDict \u003d ast.literal_eval(z.get(\"sparkBeta\"))\n\nprint \"----------------- differences between betas calulated in Flink and Spark-----------------\"\nfor i in range(0,4):\n print \"beta\", i, \": \" , flinkBetaDict[i] - sparkBetaDict[i]", - "dateUpdated": "Sep 28, 2016 1:45:37 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "editorMode": "ace/mode/python", - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475020470280_1661203311", - "id": "20160927-175430_1451783515", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "----------------- differences between betas calulated in Flink and Spark-----------------\nbeta 0 : -5.24025267623e-14\nbeta 1 : -2.44249065418e-14\nbeta 2 : 2.28705943073e-14\nbeta 3 : -1.47104550763e-14\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 5:54:30 AM", - "dateStarted": "Sep 28, 2016 1:45:38 PM", - "dateFinished": "Sep 28, 2016 1:45:38 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n\n## Plotting Mahout with R\n\nThe following examples show how we can leverage R to plot our results from Mahout\n", - "dateUpdated": "Sep 28, 2016 12:34:33 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475087633007_-566041383", - "id": "20160928-123353_147363530", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003ch2\u003ePlotting Mahout with R\u003c/h2\u003e\n\u003cp\u003eThe following examples show how we can leverage R to plot our results from Mahout\u003c/p\u003e\n" - } - ] - }, - "dateCreated": "Sep 28, 2016 12:33:53 PM", - "dateStarted": "Sep 28, 2016 12:34:30 PM", - "dateFinished": "Sep 28, 2016 12:34:30 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%flinkMahout\nval mxRnd \u003d Matrices.symmetricUniformView(5000, 2, 1234)\nval drmRand \u003d drmParallelize(mxRnd)\n\n\nval drmSin \u003d drmRand.mapBlock() {case (keys, block) \u003d\u003e \n val blockB \u003d block.like()\n for (i \u003c- 0 until block.nrow) {\n blockB(i, 0) \u003d block(i, 0) \n blockB(i, 1) \u003d Math.sin((block(i, 0) * 8))\n }\n keys -\u003e blockB\n}\n\nresourcePool.put(\"flinkSinDrm\", drm.drmSampleToTSV(drmSin, 0.85))", - "dateUpdated": "Sep 28, 2016 1:52:44 PM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "results": [ - { - "graph": { - "mode": "table", - "height": 284.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475020580886_2102494975", - "id": "20160927-175620_816809523", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "mxRnd: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:0.4586377101191827,1:0.07261898163580698}\n 1 \u003d\u003e\t{0:0.48977896201757654,1:0.2695201068510176}\n 2 \u003d\u003e\t{0:0.33215452109376786,1:0.2148377346657124}\n 3 \u003d\u003e\t{0:0.4497098649240723,1:0.4331127334380502}\n 4 \u003d\u003e\t{0:-0.03782634247193647,1:-0.32353833540588983}\n 5 \u003d\u003e\t{0:0.15137106418749705,1:0.422446220403861}\n 6 \u003d\u003e\t{0:0.2714115385692545,1:-0.4495233989067956}\n 7 \u003d\u003e\t{0:0.02468155133492185,1:0.49474128114887833}\n 8 \u003d\u003e\t{0:-0.2269662536373416,1:-0.14808249195411455}\n 9 \u003d\u003e\t{0:0.050870692759856756,1:-0.4797329808849356}\n... }\ndrmRand: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@72c5b7be\ndrmSin: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@72c5b7be,\u003cfunction1\u003e,-1,-1,true)\n(2,5000)\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 5:56:20 AM", - "dateStarted": "Sep 28, 2016 1:42:42 PM", - "dateFinished": "Sep 28, 2016 1:42:52 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%sparkMahout\nval mxRnd \u003d Matrices.symmetricUniformView(5000, 2, 1234)\nval drmRand \u003d drmParallelize(mxRnd)\n\n\nval drmSin \u003d drmRand.mapBlock() {case (keys, block) \u003d\u003e \n val blockB \u003d block.like()\n for (i \u003c- 0 until block.nrow) {\n blockB(i, 0) \u003d block(i, 0) \n blockB(i, 1) \u003d Math.sin((block(i, 0) * 8))\n }\n keys -\u003e blockB\n}\n\nz.put(\"sparkSinDrm\", org.apache.mahout.math.drm.drmSampleToTSV(drmSin, 0.85))\n", - "dateUpdated": "Sep 27, 2016 6:38:39 AM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475021390512_-2030189316", - "id": "20160927-180950_1754833838", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\n\n\n\n\n\n\n\n\n\n\n\n\nmxRnd: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:0.4586377101191827,1:0.07261898163580698}\n 1 \u003d\u003e\t{0:0.48977896201757654,1:0.2695201068510176}\n 2 \u003d\u003e\t{0:0.33215452109376786,1:0.2148377346657124}\n 3 \u003d\u003e\t{0:0.4497098649240723,1:0.4331127334380502}\n 4 \u003d\u003e\t{0:-0.03782634247193647,1:-0.32353833540588983}\n 5 \u003d\u003e\t{0:0.15137106418749705,1:0.422446220403861}\n 6 \u003d\u003e\t{0:0.2714115385692545,1:-0.4495233989067956}\n 7 \u003d\u003e\t{0:0.02468155133492185,1:0.49474128114887833}\n 8 \u003d\u003e\t{0:-0.2269662536373416,1:-0.14808249195411455}\n 9 \u003d\u003e\t{0:0.050870692759856756,1:-0.4797329808849356}\n... }\n\ndrmRand: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@1d6a6ecf\n\ndrmSin: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@1d6a6ecf,\u003cfunction1\u003e,-1,-1,true)\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 6:09:50 AM", - "dateStarted": "Sep 27, 2016 6:38:39 AM", - "dateFinished": "Sep 27, 2016 6:38:40 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%spark.r {\"imageWidth\": \"400px\"}\n\nlibrary(\"ggplot2\")\n\nflinkSinStr \u003d z.get(\"flinkSinDrm\")\nsparkSinStr \u003d z.get(\"sparkSinDrm\")\n\nflinkData \u003c- read.table(text\u003d flinkSinStr, sep\u003d\"\\t\", header\u003dFALSE)\nsparkData \u003c- read.table(text\u003d sparkSinStr, sep\u003d\"\\t\", header\u003dFALSE)\n\nplot(flinkData, col\u003d\"red\")\n# Graph trucks with red dashed line and square points\npoints(sparkData, col\u003d\"blue\")\n\n# Create a title with a red, bold/italic font\ntitle(main\u003d\"Sampled Mahout Sin Graph in R\", col.main\u003d\"black\", font.main\u003d4)\n\nlegend(\"bottomright\", c(\"Apache Flink\", \"Apache Spark\"), col\u003d c(\"red\", \"blue\"), pch\u003d c(22, 22)) \n\n", - "dateUpdated": "Sep 28, 2016 1:52:26 PM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/r", - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475021654999_1062405375", - "id": "20160927-181414_1420533932", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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\" alt\u003d\"plot of chunk unnamed-chunk-1\" width\u003d\"400px\" /\u003e\u003c/p\u003e" - } - ] - }, - "dateCreated": "Sep 27, 2016 6:14:14 AM", - "dateStarted": "Sep 27, 2016 6:42:20 AM", - "dateFinished": "Sep 27, 2016 6:42:20 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Create a Gaussian Matrix", - "text": "%flinkMahout\n\nval mxRnd3d \u003d Matrices.symmetricUniformView(5000, 3, 1234)\nval drmRand3d \u003d drmParallelize(mxRnd3d)\n\nval drmGauss \u003d drmRand3d.mapBlock() {case (keys, block) \u003d\u003e\n val blockB \u003d block.like()\n for (i \u003c- 0 until block.nrow) {\n val x: Double \u003d block(i, 0)\n val y: Double \u003d block(i, 1)\n val z: Double \u003d block(i, 2)\n\n blockB(i, 0) \u003d x\n blockB(i, 1) \u003d y\n blockB(i, 2) \u003d Math.exp(-((Math.pow(x, 2)) + (Math.pow(y, 2)))/2)\n }\n keys -\u003e blockB\n}\n\nresourcePool.put(\"flinkGaussDrm\", drm.drmSampleToTSV(drmGauss, 50.0))", - "dateUpdated": "Sep 28, 2016 1:53:22 PM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/scala", - "tableHide": true, - "title": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475021740078_127388926", - "id": "20160927-181540_1706054053", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "mxRnd3d: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:0.4586377101191827,1:0.07261898163580698,2:-0.4120814898385057}\n 1 \u003d\u003e\t{0:0.48977896201757654,1:0.2695201068510176,2:0.2035624121801051}\n 2 \u003d\u003e\t{0:0.33215452109376786,1:0.2148377346657124,2:0.22923597484837382}\n 3 \u003d\u003e\t{0:0.4497098649240723,1:0.4331127334380502,2:-0.26063522630725094}\n 4 \u003d\u003e\t{0:-0.03782634247193647,1:-0.32353833540588983,2:-0.4423256266785404}\n 5 \u003d\u003e\t{0:0.15137106418749705,1:0.422446220403861,2:-0.20452218901606223}\n 6 \u003d\u003e\t{0:0.2714115385692545,1:-0.4495233989067956,2:0.13402344186662743}\n 7 \u003d\u003e\t{0:0.02468155133492185,1:0.49474128114887833,2:-0.484577970998106}\n 8 \u003d\u003e\t{0:-0.2269662536373416,1:-0.14808249195411455,2:-0.16159073199184967}\n 9 \u003d\u003e\t{0:0.050870692759856756,1:-0.4797329808849356,2:0.30230792168515175}\n... }\ndrmRand3d: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@448a1f4e\ndrmGauss: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@448a1f4e,\u003cfunction1\u003e,-1,-1,true)\n(3,5000)\n" - } - ] - }, - "dateCreated": "Sep 27, 2016 6:15:40 AM", - "dateStarted": "Sep 28, 2016 1:50:54 PM", - "dateFinished": "Sep 28, 2016 1:51:00 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%spark.r {\"imageWidth\": \"400px\"}\n\nlibrary(scatterplot3d)\n\n\nflinkGaussStr \u003d z.get(\"flinkGaussDrm\")\nflinkData \u003c- read.table(text\u003d flinkGaussStr, sep\u003d\"\\t\", header\u003dFALSE)\n\nscatterplot3d(flinkData, color\u003d\"green\")\n\n", - "dateUpdated": "Sep 28, 2016 1:54:56 PM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/r", - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475023444293_-1038534869", - "id": "20160927-184404_773885252", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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\u003d\u003d\" alt\u003d\"plot of chunk unnamed-chunk-1\" width\u003d\"400px\" /\u003e\u003c/p\u003e" - } - ] - }, - "dateCreated": "Sep 27, 2016 6:44:04 AM", - "dateStarted": "Sep 28, 2016 1:52:10 PM", - "dateFinished": "Sep 28, 2016 1:52:10 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n\n**NOTE** To install `scatterplot3d` on Ubuntu use:\n\n```sh\nsudo apt-get install r-cran-scatterplot3d\n```\n\n", - "dateUpdated": "Sep 28, 2016 1:54:37 PM", - "config": { - "colWidth": 6.0, - "enabled": true, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {}, - "map": { - "baseMapType": "Streets", - "isOnline": true, - "pinCols": [] - } - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475091302527_1223653372", - "id": "20160928-133502_1743267136", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cp\u003e\u003cstrong\u003eNOTE\u003c/strong\u003e To install \u003ccode\u003escatterplot3d\u003c/code\u003e on Ubuntu use:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class\u003d\"sh\"\u003esudo apt-get install r-cran-scatterplot3d\n\u003c/code\u003e\u003c/pre\u003e\n" - } - ] - }, - "dateCreated": "Sep 28, 2016 1:35:02 AM", - "dateStarted": "Sep 28, 2016 1:54:32 PM", - "dateFinished": "Sep 28, 2016 1:54:33 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n", - "dateUpdated": "Sep 28, 2016 1:54:32 PM", - "config": {}, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1475092472681_-955530461", - "id": "20160928-135432_2099340527", - "dateCreated": "Sep 28, 2016 1:54:32 PM", - "status": "READY", - "progressUpdateIntervalMs": 500 - } - ], - "name": "Zeppelin Tutorial/Using Mahout", - "id": "2BYEZ5EVK", - "angularObjects": { - "2C6WUGPNH:shared_process": [], - "2C4A8RJNB:shared_process": [], - "2C4DTK2ZT:shared_process": [], - "2C6XKJWBR:shared_process": [], - "2C6AHZPMK:shared_process": [], - "2C5SU66WQ:shared_process": [], - "2C6AMJ98Q:shared_process": [], - "2C4AJZK72:shared_process": [], - "2C3STPSD7:shared_process": [], - "2C4FJN9CK:shared_process": [], - "2C3CW6JBY:shared_process": [], - "2C5UPQX6Q:shared_process": [], - "2C5873KN4:shared_process": [], - "2C5719XN4:shared_process": [], - "2C52DE5G3:shared_process": [], - "2C4G28E63:shared_process": [], - "2C6CU96BC:shared_process": [], - "2C49A6WY3:shared_process": [], - "2C3NE73HG:shared_process": [] - }, - "config": {}, - "info": {} -} diff --git a/smart-zeppelin/notebook/2C2AUG798/note.json b/smart-zeppelin/notebook/2C2AUG798/note.json deleted file mode 100644 index 23ab3df67c8..00000000000 --- a/smart-zeppelin/notebook/2C2AUG798/note.json +++ /dev/null @@ -1,779 +0,0 @@ -{ - "paragraphs": [ - { - "text": "%md\n## Introduction\nIn this tutorial we will go through some of the basic features of Zeppelin\u0027s built-in matplotlib integration. \n\n### Prerequisites\n`matplotlib` must be installed to your local python installation. (use `pip install matplotlib` or `conda install matplotlib` if you have `conda`). Additionally, you will need Zeppelin\u0027s matplotlib backend files which are usually found in `$ZEPPELIN_HOME/lib/python`. Although Zeppelin should automatically find this directory, it might be a good idea to add it to your `PYTHONPATH` just in case. \n\n### Interpreters\nMost of the examples shown in this tutorial can be used interchangeably with either the `python` or `pyspark` interpreters. Iterative plotting using the Angular Display System is currently only available for `pyspark`, but this functionality will eventually be added to the base `python` interpreter. \n\n### macOS\nMake sure locale is set, to avoid `ValueError: unknown locale: UTF-8`\n\n### virtualenv\nIn case you want to use virtualenv or conda env:\n - configure python interpreter property -\u003e `absolute/path/to/venv/bin/python`\n - see *Working with Matplotlib in Virtual environments* in the [Matplotlib FAQ](http://matplotlib.org/faq/virtualenv_faq.html)\n \n### A simple example\nLet\u0027s start by making a very simple line plot:", - "user": "anonymous", - "dateUpdated": "Dec 17, 2016 3:33:25 PM", - "config": { - "tableHide": false, - "colWidth": 12.0, - "editorMode": "ace/mode/text", - "editorHide": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ], - "editorSetting": { - "language": "text", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627954_-1473548609", - "id": "20160614-174657_1772993700", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch2\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eIn this tutorial we will go through some of the basic features of Zeppelin\u0026rsquo;s built-in matplotlib integration. \u003c/p\u003e\n\u003ch3\u003ePrerequisites\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ematplotlib\u003c/code\u003e must be installed to your local python installation. (use \u003ccode\u003epip install matplotlib\u003c/code\u003e or \u003ccode\u003econda install matplotlib\u003c/code\u003e if you have \u003ccode\u003econda\u003c/code\u003e). Additionally, you will need Zeppelin\u0026rsquo;s matplotlib backend files which are usually found in \u003ccode\u003e$ZEPPELIN_HOME/interpreter/lib/python\u003c/code\u003e. Although Zeppelin should automatically find this directory, it might be a good idea to add it to your \u003ccode\u003ePYTHONPATH\u003c/code\u003e just in case. \u003c/p\u003e\n\u003ch3\u003eInterpreters\u003c/h3\u003e\n\u003cp\u003eMost of the examples shown in this tutorial can be used interchangeably with either the \u003ccode\u003epython\u003c/code\u003e or \u003ccode\u003epyspark\u003c/code\u003e interpreters. Iterative plotting using the Angular Display System is currently only available for \u003ccode\u003epyspark\u003c/code\u003e, but this functionality will eventually be added to the base \u003ccode\u003epython\u003c/code\u003e interpreter. \u003c/p\u003e\n\u003ch3\u003emacOS\u003c/h3\u003e\n\u003cp\u003eMake sure locale is set, to avoid \u003ccode\u003eValueError: unknown locale: UTF-8\u003c/code\u003e\u003c/p\u003e\n\u003ch3\u003evirtualenv\u003c/h3\u003e\n\u003cp\u003eIn case you want to use virtualenv or conda env:\u003cbr/\u003e - configure python interpreter property -\u0026gt; \u003ccode\u003eabsolute/path/to/venv/bin/python\u003c/code\u003e\u003cbr/\u003e - see \u003cem\u003eWorking with Matplotlib in Virtual environments\u003c/em\u003e in the \u003ca href\u003d\"http://matplotlib.org/faq/virtualenv_faq.html\"\u003eMatplotlib FAQ\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eA simple example\u003c/h3\u003e\n\u003cp\u003eLet\u0026rsquo;s start by making a very simple line plot:\u003c/p\u003e\n\u003c/div\u003e" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "dateStarted": "Dec 17, 2016 3:33:25 PM", - "dateFinished": "Dec 17, 2016 3:33:25 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%python\nimport matplotlib.pyplot as plt\nplt.plot([1, 2, 3])", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/python", - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627958_-1475087605", - "id": "20161101-192232_289486976", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,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\u003d\u003d style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\nNotice how an explicit call to `show()` is not necessary. This is accomplished via a post-execute hook which tells Zeppelin to plot all currently open matplotlib figures after executing the rest of the paragraph.\n### Plotting multiple figures\nWe can easily plot multiple figures at once too:", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627958_-1475087605", - "id": "20160617-002131_1552178409", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cp\u003eNotice how an explicit call to \u003ccode\u003eshow()\u003c/code\u003e is not necessary. This is accomplished via a post-execute hook which tells Zeppelin to plot all currently open matplotlib figures after executing the rest of the paragraph.\u003c/p\u003e\n\u003ch3\u003ePlotting multiple figures\u003c/h3\u003e\n\u003cp\u003eWe can easily plot multiple figures at once too:\u003c/p\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%python\n# Figure 1\nplt.plot([1, 2, 3])\n\n# Figure 2\nplt.figure()\nplt.plot([3, 2, 1])", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/python", - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627959_-1475472354", - "id": "20161101-193533_2096366908", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,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\u003d\u003d style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,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 style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n### Changing the default inline plotting behavior\nBoth the `python` and `pyspark` include a built-in function for changing some default inline plotting behavior. For example, we can change the default size of each figure in pixels to 400x300 in svg format using: ", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "tableHide": false, - "colWidth": 12.0, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627959_-1475472354", - "id": "20160614-174421_274483707", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003ch3\u003eChanging the default inline plotting behavior\u003c/h3\u003e\n\u003cp\u003eBoth the \u003ccode\u003epython\u003c/code\u003e and \u003ccode\u003epyspark\u003c/code\u003e include a built-in function for changing some default inline plotting behavior. For example, we can change the default size of each figure in pixels to 400x300 in svg format using:\u003c/p\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%python\nz.configure_mpl(width\u003d400, height\u003d300, fmt\u003d\u0027svg\u0027)\nplt.plot([1, 2, 3])", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/scala", - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": { - "f1": "defaultValue" - }, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627959_-1475472354", - "id": "20160616-234947_579056637", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,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\u003d style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n### Iteratively updating a plot\n#### (a) Using multiple plots\nNow let\u0027s show an example where we update each element of the plot in a separate paragraph. However, you may have noticed that each matplotlib figure instance gets closed immediately after its shown. To fix this, we set the `close` property to `False` in our configuration:", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 394.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627960_-1477396098", - "id": "20160617-140439_1111727405", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003ch3\u003eIteratively updating a plot\u003c/h3\u003e\n\u003ch4\u003e(a) Using multiple plots\u003c/h4\u003e\n\u003cp\u003eNow let\u0027s show an example where we update each element of the plot in a separate paragraph. However, you may have noticed that each matplotlib figure instance gets closed immediately after its shown. To fix this, we set the \u003ccode\u003eclose\u003c/code\u003e property to \u003ccode\u003eFalse\u003c/code\u003e in our configuration:\u003c/p\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "title": "First line", - "text": "%python\nplt.close() # Added here to reset the first plot when rerunning the paragraph\nz.configure_mpl(width\u003d600, height\u003d400, fmt\u003d\u0027png\u0027, close\u003dFalse)\nplt.plot([1, 2, 3], label\u003dr\u0027$y\u003dx$\u0027)", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "title": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 389.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627960_-1477396098", - "id": "20161101-195657_1336292109", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,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\u003d\u003d style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Second line", - "text": "%python\nplt.plot([3, 2, 1], label\u003dr\u0027$y\u003d3-x$\u0027)", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/python", - "title": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 289.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627961_-1477780847", - "id": "20161101-195937_907325325", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,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\u003d\u003d style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Label axes", - "text": "%python\nplt.xlabel(r\u0027$x$\u0027, fontsize\u003d20)\nplt.ylabel(r\u0027$y$\u0027, fontsize\u003d20)", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/python", - "title": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627962_-1476626600", - "id": "20161101-200014_2113468597", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAYAAAByNR6YAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl4lOW9//F32CVEAkICRBaJERCzEyKLIYKcyCpwKLglYTExSAWPeE7Lz1r1aF1KsSKKCWCEaG25sCQBwSCKAcEAMWYTkUUMkrAJCpYUWZL5/fGc2lpBGZjMPTPP53VdXBeQYeZjM3B/+n2euW8/h8PhQERERERcppHpACIiIiK+RgVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMVUsERERERcTAVLRERExMV8vmCdPn2a+Ph4oqOjCQ8P5/HHHz/v42bMmEFYWBhRUVGUlZW5OaWIiIj4kiamAzS05s2b8/7779OyZUvq6uoYMGAAw4YNo2/fvt8/5u233+bzzz9n9+7dbN26lYyMDLZs2WIwtYiIiHgzn59gAbRs2RKwplnnzp3Dz8/vB1/Pz88nJSUFgPj4eE6cOMHhw4fdnlNERER8gy0KVn19PdHR0XTo0IGhQ4cSFxf3g6/X1NTQuXPn738dEhJCTU2Nu2OKiIiIj7BFwWrUqBGlpaVUV1ezdetWPv30U9ORRERExIf5/D1Y/+rKK6/k5ptvpqCggOuvv/773w8JCWH//v3f/7q6upqQkJAf/fl/v7QoIiIiF8/hcJiO4DY+P8E6evQoJ06cAODUqVOsW7eOnj17/uAxo0ePJicnB4AtW7YQGBhIcHDweZ/v7hV3c93869iyfwsOh0M/vPjHo48+ajyDfuh7qh/6fvrqj6IiB2FhDu6+28E339inWP2Dz0+wDh48SGpqKvX19dTX1zNx4kSGDx9OVlYWfn5+pKenM3z4cNasWcO1116Lv78/r7766gWf77Wxr/Hmp28y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 style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Add legend", - "text": "%python\nplt.legend(loc\u003d\u0027upper center\u0027, fontsize\u003d20)", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/python", - "title": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 86.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627962_-1476626600", - "id": "20161101-200141_1493024813", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,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\u003d\u003d style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Add title", - "text": "%python\nplt.title(\u0027Inline plotting example\u0027, fontsize\u003d20)", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/python", - "title": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627963_-1477011349", - "id": "20161101-200445_78775142", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,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 style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n####(b) Using a single plot\nTo iteratively update a single plot, we can leverage Zeppelin\u0027s built-in Angular Display System. Currently this feature is only available for the `pyspark` interpreter for raster (png and jpg) formats. To enable this, we must set a special `angular` flag to `True` in our configuration:", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627963_-1477011349", - "id": "20161101-200541_1283841564", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003ch4\u003e(b) Using a single plot\u003c/h4\u003e\n\u003cp\u003eTo iteratively update a single plot, we can leverage Zeppelin\u0027s built-in Angular Display System. Currently this feature is only available for the \u003ccode\u003epyspark\u003c/code\u003e interpreter for raster (png and jpg) formats. To enable this, we must set a special \u003ccode\u003eangular\u003c/code\u003e flag to \u003ccode\u003eTrue\u003c/code\u003e in our configuration.\u003c/p\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "title": "First line (figure will be displayed here)", - "text": "%pyspark\nimport matplotlib.pyplot as plt\nplt.close() # Added here to reset the plot when rerunning the paragraph\nz.configure_mpl(angular\u003dTrue, close\u003dFalse)\nplt.plot([1, 2, 3], label\u003dr\u0027$y\u003dx$\u0027)", - "user": "anonymous", - "dateUpdated": "Nov 2, 2016 2:55:37 PM", - "config": { - "colWidth": 7.0, - "editorMode": "ace/mode/python", - "title": true, - "enabled": true, - "results": [ - { - "graph": { - "mode": "table", - "height": 389.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - } - } - ] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627963_-1477011349", - "id": "20161101-200754_739212093", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv style\u003d\u0027width:auto;height:auto\u0027\u003e\u003cimg src\u003ddata:image/png;base64,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\u003d\u003d style\u003d\u0027width\u003dauto;height:auto\u0027\u003e\u003cdiv\u003e\n" - } - ] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "dateStarted": "Nov 2, 2016 2:54:53 PM", - "dateFinished": "Nov 2, 2016 2:55:04 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Second line", - "text": "%pyspark\nplt.plot([3, 2, 1], label\u003dr\u0027$y\u003d3-x$\u0027)", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 5.0, - "title": true, - "enabled": true, - "results": [] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627964_-1478935094", - "id": "20161101-200854_1676504884", - "results": { - "code": "SUCCESS", - "msg": [] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Label axes", - "text": "%pyspark\nplt.xlabel(r\u0027$x$\u0027, fontsize\u003d20)\nplt.ylabel(r\u0027$y$\u0027, fontsize\u003d20)", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 5.0, - "title": true, - "enabled": true, - "results": [] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627964_-1478935094", - "id": "20161101-200851_314384892", - "results": { - "code": "SUCCESS", - "msg": [] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Add legend", - "text": "%pyspark\nplt.legend(loc\u003d\u0027upper center\u0027, fontsize\u003d20)", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 5.0, - "editorMode": "ace/mode/python", - "title": true, - "enabled": true, - "results": [] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627964_-1478935094", - "id": "20161101-201552_651686132", - "results": { - "code": "SUCCESS", - "msg": [] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "title": "Add title", - "text": "%pyspark\nplt.title(\u0027Inline plotting example\u0027, fontsize\u003d20)", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 5.0, - "editorMode": "ace/mode/python", - "title": true, - "enabled": true, - "results": [] - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627965_-1479319843", - "id": "20161101-202024_1645454710", - "results": { - "code": "SUCCESS", - "msg": [] - }, - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - }, - { - "text": "", - "dateUpdated": "Nov 2, 2016 2:53:47 PM", - "config": { - "colWidth": 12.0, - "graph": { - "mode": "table", - "height": 300.0, - "optionOpen": false, - "keys": [], - "values": [], - "groups": [], - "scatter": {} - }, - "enabled": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1478123627965_-1479319843", - "id": "20161102-124716_1703649609", - "dateCreated": "Nov 2, 2016 2:53:47 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - } - ], - "name": "Zeppelin Tutorial/Matplotlib (Python • PySpark)", - "id": "2C2AUG798", - "angularObjects": { - "2C6WUGPNH:shared_process": [], - "2C4A8RJNB:shared_process": [], - "2C4DTK2ZT:shared_process": [], - "2C6XKJWBR:shared_process": [], - "2C6AHZPMK:shared_process": [], - "2C5SU66WQ:shared_process": [], - "2C6AMJ98Q:shared_process": [], - "2C4AJZK72:shared_process": [], - "2C3STPSD7:shared_process": [], - "2C4FJN9CK:shared_process": [], - "2C3CW6JBY:shared_process": [], - "2C5UPQX6Q:shared_process": [], - "2C5873KN4:shared_process": [], - "2C5719XN4:shared_process": [], - "2C52DE5G3:shared_process": [], - "2C4G28E63:shared_process": [], - "2C6CU96BC:shared_process": [], - "2C49A6WY3:shared_process": [], - "2C3NE73HG:shared_process": [] - }, - "config": {}, - "info": {} -} diff --git a/smart-zeppelin/notebook/2C35YU814/note.json b/smart-zeppelin/notebook/2C35YU814/note.json deleted file mode 100644 index 09ed8c6e01c..00000000000 --- a/smart-zeppelin/notebook/2C35YU814/note.json +++ /dev/null @@ -1,806 +0,0 @@ -{ - "paragraphs": [ - { - "text": "%md\n### Intro\nThis notebook is an example of how to use **Apache Flink** for processing simple data sets. We will take an open airline data set from [stat-computing.org](http://stat-computing.org) and find out who was the most popular carrier during 1998-2000 years. Next we will build a chart that shows flights distribution by months and look how it changes from year to year. We will use Zeppelin `%table` display system to build charts.", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 11:55:42 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "markdown", - "editOnDblClick": true - }, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952101049_-1120777567", - "id": "20170109-115501_192763014", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch3\u003eIntro\u003c/h3\u003e\n\u003cp\u003eThis notebook is an example of how to use \u003cstrong\u003eApache Flink\u003c/strong\u003e for processing simple data sets. We will take an open airline data set from \u003ca href\u003d\"http://stat-computing.org\"\u003estat-computing.org\u003c/a\u003e and find out who was the most popular carrier during 1998-2000 years. Next we will build a chart that shows flights distribution by months and look how it changes from year to year. We will use Zeppelin \u003ccode\u003e%table\u003c/code\u003e display system to build charts.\u003c/p\u003e\n\u003c/div\u003e" - } - ] - }, - "dateCreated": "Jan 9, 2017 11:55:01 AM", - "dateStarted": "Jan 9, 2017 11:55:42 AM", - "dateFinished": "Jan 9, 2017 11:55:44 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n### Getting the data\nFirst we need to download and unpack the data. We will get three big data sets with flight details (one pack for each year) and a small one with carriers names. In total we will get for about 1,5 GB of data. To be able to process such amount of data it is recommended to increase `shell.command.timeout.millisecs` value in `%sh` interpreter settings up to several minutes. You can find interpreters configuration by clicking on `Interpreter` in a drop-down menu from the top right corner of the Zeppelin web-ui.", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 11:56:08 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "editorHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952142017_284386712", - "id": "20170109-115542_1487437739", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch3\u003eGetting the data\u003c/h3\u003e\n\u003cp\u003eFirst we need to download and unpack the data. We will get three big data sets with flight details (one pack for each year) and a small one with carriers names. In total we will get for about 1,5 GB of data. To be able to process such amount of data it is recommended to increase \u003ccode\u003eshell.command.timeout.millisecs\u003c/code\u003e value in \u003ccode\u003e%sh\u003c/code\u003e interpreter settings up to several minutes. You can find interpreters configuration by clicking on \u003ccode\u003eInterpreter\u003c/code\u003e in a drop-down menu from the top right corner of the Zeppelin web-ui.\u003c/p\u003e\n\u003c/div\u003e" - } - ] - }, - "dateCreated": "Jan 9, 2017 11:55:42 AM", - "dateStarted": "Jan 9, 2017 11:56:07 AM", - "dateFinished": "Jan 9, 2017 11:56:07 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%sh\n\nrm /tmp/flights98.csv.bz2\ncurl -o /tmp/flights98.csv.bz2 \"http://stat-computing.org/dataexpo/2009/1998.csv.bz2\"\nrm /tmp/flights98.csv\nbzip2 -d /tmp/flights98.csv.bz2\nchmod 666 /tmp/flights98.csv", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 11:59:02 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "sh", - "editOnDblClick": false - }, - "editorMode": "ace/mode/sh", - "tableHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952167547_-566831096", - "id": "20170109-115607_1634441713", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "rm: cannot remove \u0027/tmp/flights98.csv.bz2\u0027: No such file or directory\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 73.1M 0 64295 0 0 51646 0 0:24:44 0:00:01 0:24:43 51642\r 0 73.1M 0 358k 0 0 160k 0 0:07:47 0:00:02 0:07:45 160k\r 1 73.1M 1 1209k 0 0 373k 0 0:03:20 0:00:03 0:03:17 373k\r 4 73.1M 4 3204k 0 0 773k 0 0:01:36 0:00:04 0:01:32 773k\r 7 73.1M 7 5508k 0 0 1071k 0 0:01:09 0:00:05 0:01:04 1145k\r 10 73.1M 10 7875k 0 0 1280k 0 0:00:58 0:00:06 0:00:52 1592k\r 13 73.1M 13 10.1M 0 0 1458k 0 0:00:51 0:00:07 0:00:44 2049k\r 17 73.1M 17 12.7M 0 0 1608k 0 0:00:46 0:00:08 0:00:38 2422k\r 20 73.1M 20 14.9M 0 0 1671k 0 0:00:44 0:00:09 0:00:35 2413k\r 23 73.1M 23 17.1M 0 0 1728k 0 0:00:43 0:00:10 0:00:33 2403k\r 26 73.1M 26 19.4M 0 0 1787k 0 0:00:41 0:00:11 0:00:30 2411k\r 29 73.1M 29 21.7M 0 0 1837k 0 0:00:40 0:00:12 0:00:28 2379k\r 32 73.1M 32 24.1M 0 0 1879k 0 0:00:39 0:00:13 0:00:26 2322k\r 36 73.1M 36 26.4M 0 0 1916k 0 0:00:39 0:00:14 0:00:25 2365k\r 39 73.1M 39 28.5M 0 0 1930k 0 0:00:38 0:00:15 0:00:23 2341k\r 41 73.1M 41 30.6M 0 0 1943k 0 0:00:38 0:00:16 0:00:22 2292k\r 44 73.1M 44 32.6M 0 0 1947k 0 0:00:38 0:00:17 0:00:21 2215k\r 47 73.1M 47 34.6M 0 0 1952k 0 0:00:38 0:00:18 0:00:20 2145k\r 50 73.1M 50 36.6M 0 0 1960k 0 0:00:38 0:00:19 0:00:19 2082k\r 52 73.1M 52 38.3M 0 0 1947k 0 0:00:38 0:00:20 0:00:18 1998k\r 55 73.1M 55 40.4M 0 0 1956k 0 0:00:38 0:00:21 0:00:17 1996k\r 57 73.1M 57 42.2M 0 0 1951k 0 0:00:38 0:00:22 0:00:16 1965k\r 60 73.1M 60 44.0M 0 0 1948k 0 0:00:38 0:00:23 0:00:15 1932k\r 62 73.1M 62 45.4M 0 0 1927k 0 0:00:38 0:00:24 0:00:14 1803k\r 63 73.1M 63 46.5M 0 0 1896k 0 0:00:39 0:00:25 0:00:14 1688k\r 65 73.1M 65 47.7M 0 0 1868k 0 0:00:40 0:00:26 0:00:14 1496k\r 66 73.1M 66 48.8M 0 0 1843k 0 0:00:40 0:00:27 0:00:13 1363k\r 68 73.1M 68 50.0M 0 0 1820k 0 0:00:41 0:00:28 0:00:13 1227k\r 69 73.1M 69 51.1M 0 0 1786k 0 0:00:41 0:00:29 0:00:12 1126k\r 71 73.1M 71 52.0M 0 0 1769k 0 0:00:42 0:00:30 0:00:12 1131k\r 72 73.1M 72 53.0M 0 0 1744k 0 0:00:42 0:00:31 0:00:11 1098k\r 73 73.1M 73 54.0M 0 0 1723k 0 0:00:43 0:00:32 0:00:11 1070k\r 75 73.1M 75 55.1M 0 0 1702k 0 0:00:43 0:00:33 0:00:10 1040k\r 76 73.1M 76 56.0M 0 0 1681k 0 0:00:44 0:00:34 0:00:10 1048k\r 77 73.1M 77 56.9M 0 0 1659k 0 0:00:45 0:00:35 0:00:10 993k\r 79 73.1M 79 57.8M 0 0 1638k 0 0:00:45 0:00:36 0:00:09 972k\r 80 73.1M 80 58.7M 0 0 1618k 0 0:00:46 0:00:37 0:00:09 946k\r 81 73.1M 81 59.6M 0 0 1600k 0 0:00:46 0:00:38 0:00:08 921k\r 82 73.1M 82 60.5M 0 0 1582k 0 0:00:47 0:00:39 0:00:08 906k\r 83 73.1M 83 61.4M 0 0 1566k 0 0:00:47 0:00:40 0:00:07 917k\r 85 73.1M 85 62.1M 0 0 1546k 0 0:00:48 0:00:41 0:00:07 887k\r 86 73.1M 86 63.0M 0 0 1532k 0 0:00:48 0:00:42 0:00:06 892k\r 87 73.1M 87 63.9M 0 0 1517k 0 0:00:49 0:00:43 0:00:06 882k\r 88 73.1M 88 64.8M 0 0 1503k 0 0:00:49 0:00:44 0:00:05 878k\r 89 73.1M 89 65.6M 0 0 1489k 0 0:00:50 0:00:45 0:00:05 872k\r 91 73.1M 91 66.5M 0 0 1477k 0 0:00:50 0:00:46 0:00:04 904k\r 92 73.1M 92 67.4M 0 0 1465k 0 0:00:51 0:00:47 0:00:04 897k\r 93 73.1M 93 68.2M 0 0 1451k 0 0:00:51 0:00:48 0:00:03 889k\r 94 73.1M 94 69.2M 0 0 1441k 0 0:00:51 0:00:49 0:00:02 897k\r 95 73.1M 95 70.1M 0 0 1430k 0 0:00:52 0:00:50 0:00:02 904k\r 97 73.1M 97 71.0M 0 0 1421k 0 0:00:52 0:00:51 0:00:01 910k\r 98 73.1M 98 71.9M 0 0 1413k 0 0:00:52 0:00:52 --:--:-- 923k\r 99 73.1M 99 72.8M 0 0 1403k 0 0:00:53 0:00:53 --:--:-- 941k\r100 73.1M 100 73.1M 0 0 1401k 0 0:00:53 0:00:53 --:--:-- 941k\nrm: cannot remove \u0027/tmp/flights98.csv\u0027: No such file or directory\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 11:56:07 AM", - "dateStarted": "Jan 9, 2017 11:57:37 AM", - "dateFinished": "Jan 9, 2017 11:58:50 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%sh\n\nrm /tmp/flights99.csv.bz2\ncurl -o /tmp/flights99.csv.bz2 \"http://stat-computing.org/dataexpo/2009/1999.csv.bz2\"\nrm /tmp/flights99.csv\nbzip2 -d /tmp/flights99.csv.bz2\nchmod 666 /tmp/flights99.csv", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 11:59:59 AM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "sh", - "editOnDblClick": false - }, - "editorMode": "ace/mode/sh", - "tableHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952257873_-1874269156", - "id": "20170109-115737_1346880844", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "rm: cannot remove \u0027/tmp/flights99.csv.bz2\u0027: No such file or directory\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 75.7M 0 5520 0 0 9851 0 2:14:25 --:--:-- 2:14:25 9839\r 0 75.7M 0 88819 0 0 64302 0 0:20:35 0:00:01 0:20:34 64268\r 0 75.7M 0 181k 0 0 25316 0 0:52:18 0:00:07 0:52:11 25316\r 0 75.7M 0 548k 0 0 67331 0 0:19:39 0:00:08 0:19:31 67327\r 1 75.7M 1 817k 0 0 89344 0 0:14:49 0:00:09 0:14:40 89337\r 1 75.7M 1 1042k 0 0 100k 0 0:12:54 0:00:10 0:12:44 105k\r 3 75.7M 3 2461k 0 0 218k 0 0:05:55 0:00:11 0:05:44 239k\r 6 75.7M 6 5069k 0 0 412k 0 0:03:08 0:00:12 0:02:56 985k\r 11 75.7M 11 9165k 0 0 690k 0 0:01:52 0:00:13 0:01:39 1744k\r 14 75.7M 14 11.2M 0 0 796k 0 0:01:37 0:00:14 0:01:23 2109k\r 19 75.7M 19 14.8M 0 0 995k 0 0:01:17 0:00:15 0:01:02 2910k\r 24 75.7M 24 18.6M 0 0 1174k 0 0:01:06 0:00:16 0:00:50 3331k\r 29 75.7M 29 22.5M 0 0 1338k 0 0:00:57 0:00:17 0:00:40 3613k\r 35 75.7M 35 26.5M 0 0 1486k 0 0:00:52 0:00:18 0:00:34 3603k\r 40 75.7M 40 30.3M 0 0 1610k 0 0:00:48 0:00:19 0:00:29 4025k\r 45 75.7M 45 34.2M 0 0 1731k 0 0:00:44 0:00:20 0:00:24 3980k\r 50 75.7M 50 38.2M 0 0 1840k 0 0:00:42 0:00:21 0:00:21 4011k\r 55 75.7M 55 42.2M 0 0 1940k 0 0:00:39 0:00:22 0:00:17 4020k\r 60 75.7M 60 46.2M 0 0 2032k 0 0:00:38 0:00:23 0:00:15 4026k\r 65 75.7M 65 49.9M 0 0 2106k 0 0:00:36 0:00:24 0:00:12 4017k\r 70 75.7M 70 53.5M 0 0 2169k 0 0:00:35 0:00:25 0:00:10 3945k\r 75 75.7M 75 57.2M 0 0 2229k 0 0:00:34 0:00:26 0:00:08 3884k\r 80 75.7M 80 61.1M 0 0 2293k 0 0:00:33 0:00:27 0:00:06 3868k\r 86 75.7M 86 65.5M 0 0 2372k 0 0:00:32 0:00:28 0:00:04 3956k\r 92 75.7M 92 70.4M 0 0 2464k 0 0:00:31 0:00:29 0:00:02 4200k\r100 75.7M 100 75.7M 0 0 2565k 0 0:00:30 0:00:30 --:--:-- 4585k\nrm: cannot remove \u0027/tmp/flights99.csv\u0027: No such file or directory\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 11:57:37 AM", - "dateStarted": "Jan 9, 2017 11:59:04 AM", - "dateFinished": "Jan 9, 2017 11:59:53 AM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%sh\n\nrm /tmp/flights00.csv.bz2\ncurl -o /tmp/flights00.csv.bz2 \"http://stat-computing.org/dataexpo/2009/2000.csv.bz2\"\nrm /tmp/flights00.csv\nbzip2 -d /tmp/flights00.csv.bz2\nchmod 666 /tmp/flights00.csv", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:01:42 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "sh", - "editOnDblClick": false - }, - "editorMode": "ace/mode/sh", - "tableHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952312038_-1315320949", - "id": "20170109-115832_608069986", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "rm: cannot remove \u0027/tmp/flights00.csv.bz2\u0027: No such file or directory\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0\r 0 78.7M 0 5520 0 0 3016 0 7:36:06 0:00:01 7:36:05 3014\r 0 78.7M 0 39987 0 0 15337 0 1:29:41 0:00:02 1:29:39 15332\r 0 78.7M 0 87755 0 0 24531 0 0:56:04 0:00:03 0:56:01 24526\r 0 78.7M 0 157k 0 0 33950 0 0:40:31 0:00:04 0:40:27 33944\r 0 78.7M 0 221k 0 0 40878 0 0:33:39 0:00:05 0:33:34 53734\r 0 78.7M 0 308k 0 0 47250 0 0:29:06 0:00:06 0:29:00 63943\r 0 78.7M 0 398k 0 0 52806 0 0:26:03 0:00:07 0:25:56 71903\r 0 78.7M 0 437k 0 0 36667 0 0:37:31 0:00:12 0:37:19 41697\r 0 78.7M 0 703k 0 0 57158 0 0:24:04 0:00:12 0:23:52 71137\r 1 78.7M 1 851k 0 0 64259 0 0:21:24 0:00:13 0:21:11 80471\r 1 78.7M 1 1171k 0 0 82442 0 0:16:41 0:00:14 0:16:27 109k\r 1 78.7M 1 1546k 0 0 79861 0 0:17:13 0:00:19 0:16:54 97134\r 3 78.7M 3 3181k 0 0 154k 0 0:08:41 0:00:20 0:08:21 327k\r 4 78.7M 4 3466k 0 0 160k 0 0:08:21 0:00:21 0:08:00 308k\r 4 78.7M 4 3565k 0 0 136k 0 0:09:50 0:00:26 0:09:24 216k\r 8 78.7M 8 7196k 0 0 270k 0 0:04:57 0:00:26 0:04:31 501k\r 10 78.7M 10 8459k 0 0 307k 0 0:04:22 0:00:27 0:03:55 894k\r 11 78.7M 11 9386k 0 0 327k 0 0:04:06 0:00:28 0:03:38 768k\r 15 78.7M 15 11.9M 0 0 413k 0 0:03:14 0:00:29 0:02:45 1093k\r 18 78.7M 18 14.5M 0 0 487k 0 0:02:45 0:00:30 0:02:15 2553k\r 22 78.7M 22 17.7M 0 0 574k 0 0:02:20 0:00:31 0:01:49 2195k\r 25 78.7M 25 19.9M 0 0 626k 0 0:02:08 0:00:32 0:01:36 2375k\r 28 78.7M 28 22.1M 0 0 676k 0 0:01:59 0:00:33 0:01:26 2726k\r 31 78.7M 31 24.7M 0 0 734k 0 0:01:49 0:00:34 0:01:15 2643k\r 34 78.7M 34 27.3M 0 0 789k 0 0:01:42 0:00:35 0:01:07 2638k\r 38 78.7M 38 30.0M 0 0 841k 0 0:01:35 0:00:36 0:00:59 2513k\r 40 78.7M 40 32.1M 0 0 874k 0 0:01:32 0:00:37 0:00:55 2457k\r 43 78.7M 43 34.1M 0 0 906k 0 0:01:28 0:00:38 0:00:50 2445k\r 45 78.7M 45 35.7M 0 0 925k 0 0:01:27 0:00:39 0:00:48 2250k\r 47 78.7M 47 37.4M 0 0 946k 0 0:01:25 0:00:40 0:00:45 2062k\r 49 78.7M 49 39.3M 0 0 968k 0 0:01:23 0:00:41 0:00:42 1907k\r 52 78.7M 52 41.0M 0 0 987k 0 0:01:21 0:00:42 0:00:39 1859k\r 54 78.7M 54 42.5M 0 0 1000k 0 0:01:20 0:00:43 0:00:37 1729k\r 55 78.7M 55 43.9M 0 0 1008k 0 0:01:19 0:00:44 0:00:35 1651k\r 57 78.7M 57 45.4M 0 0 1020k 0 0:01:18 0:00:45 0:00:33 1625k\r 59 78.7M 59 46.6M 0 0 1027k 0 0:01:18 0:00:46 0:00:32 1512k\r 60 78.7M 60 47.7M 0 0 1027k 0 0:01:18 0:00:47 0:00:31 1376k\r 61 78.7M 61 48.6M 0 0 1024k 0 0:01:18 0:00:48 0:00:30 1236k\r 62 78.7M 62 49.5M 0 0 1020k 0 0:01:18 0:00:49 0:00:29 1125k\r 64 78.7M 64 50.4M 0 0 1021k 0 0:01:18 0:00:50 0:00:28 1027k\r 65 78.7M 65 51.3M 0 0 1018k 0 0:01:19 0:00:51 0:00:28 941k\r 66 78.7M 66 52.1M 0 0 1016k 0 0:01:19 0:00:52 0:00:27 910k\r 67 78.7M 67 53.0M 0 0 1014k 0 0:01:19 0:00:53 0:00:26 909k\r 68 78.7M 68 53.7M 0 0 1006k 0 0:01:20 0:00:54 0:00:26 868k\r 69 78.7M 69 54.6M 0 0 1006k 0 0:01:20 0:00:55 0:00:25 858k\r 70 78.7M 70 55.3M 0 0 1002k 0 0:01:20 0:00:56 0:00:24 831k\r 71 78.7M 71 56.1M 0 0 998k 0 0:01:20 0:00:57 0:00:23 807k\r 72 78.7M 72 56.9M 0 0 994k 0 0:01:21 0:00:58 0:00:23 787k\r 73 78.7M 73 57.6M 0 0 991k 0 0:01:21 0:00:59 0:00:22 823k\r 74 78.7M 74 58.4M 0 0 988k 0 0:01:21 0:01:00 0:00:21 784k\r 75 78.7M 75 59.2M 0 0 985k 0 0:01:21 0:01:01 0:00:20 791k\r 76 78.7M 76 60.0M 0 0 982k 0 0:01:22 0:01:02 0:00:20 797k\r 77 78.7M 77 60.8M 0 0 980k 0 0:01:22 0:01:03 0:00:19 808k\r 78 78.7M 78 61.6M 0 0 977k 0 0:01:22 0:01:04 0:00:18 812k\r 79 78.7M 79 62.4M 0 0 975k 0 0:01:22 0:01:05 0:00:17 824k\r 80 78.7M 80 63.4M 0 0 976k 0 0:01:22 0:01:06 0:00:16 870k\r 82 78.7M 82 64.9M 0 0 984k 0 0:01:21 0:01:07 0:00:14 1006k\r 85 78.7M 85 66.9M 0 0 1000k 0 0:01:20 0:01:08 0:00:12 1254k\r 88 78.7M 88 69.4M 0 0 1022k 0 0:01:18 0:01:09 0:00:09 1602k\r 92 78.7M 92 72.5M 0 0 1053k 0 0:01:16 0:01:10 0:00:06 2064k\r 96 78.7M 96 76.1M 0 0 1089k 0 0:01:13 0:01:11 0:00:02 2600k\r100 78.7M 100 78.7M 0 0 1116k 0 0:01:12 0:01:12 --:--:-- 3022k\nrm: cannot remove \u0027/tmp/flights00.csv\u0027: No such file or directory\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 11:58:32 AM", - "dateStarted": "Jan 9, 2017 12:00:01 PM", - "dateFinished": "Jan 9, 2017 12:01:34 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%sh\n\nrm /tmp/carriers.csv\ncurl -o /tmp/carriers.csv \"http://stat-computing.org/dataexpo/2009/carriers.csv\"\nchmod 666 /tmp/carriers.csv", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:01:48 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "sh", - "editOnDblClick": false - }, - "editorMode": "ace/mode/sh", - "tableHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952329229_2136292082", - "id": "20170109-115849_1794095031", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "rm: cannot remove \u0027/tmp/carriers.csv\u0027: No such file or directory\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 9 43758 9 4140 0 0 7588 0 0:00:05 --:--:-- 0:00:05 7582\r100 43758 100 43758 0 0 46357 0 --:--:-- --:--:-- --:--:-- 46353\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 11:58:49 AM", - "dateStarted": "Jan 9, 2017 12:01:44 PM", - "dateFinished": "Jan 9, 2017 12:01:45 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n### Preparing the data\nThe `flights\u003cYY\u003e.csv` contains various data but we only need the information about the year, the month and the carrier who served the flight. Let\u0027s retrieve this information and create `DataSets`.", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:01:51 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "markdown", - "editOnDblClick": true - }, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952363836_-1769111757", - "id": "20170109-115923_963126574", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch3\u003ePreparing the data\u003c/h3\u003e\n\u003cp\u003eThe \u003ccode\u003eflights\u0026lt;YY\u0026gt;.csv\u003c/code\u003e contains various data but we only need the information about the year, the month and the carrier who served the flight. Let\u0026rsquo;s retrieve this information and create \u003ccode\u003eDataSets\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e" - } - ] - }, - "dateCreated": "Jan 9, 2017 11:59:23 AM", - "dateStarted": "Jan 9, 2017 12:01:51 PM", - "dateFinished": "Jan 9, 2017 12:01:53 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%flink\n\ncase class Flight(year: Int, month: Int, carrierCode: String)\ncase class Carrier(code: String, name: String)\n\nval flights98 \u003d benv.readCsvFile[Flight](\"/tmp/flights98.csv\", ignoreFirstLine \u003d true, includedFields \u003d Array(0, 1, 8))\nval flights99 \u003d benv.readCsvFile[Flight](\"/tmp/flights99.csv\", ignoreFirstLine \u003d true, includedFields \u003d Array(0, 1, 8))\nval flights00 \u003d benv.readCsvFile[Flight](\"/tmp/flights00.csv\", ignoreFirstLine \u003d true, includedFields \u003d Array(0, 1, 8))\nval flights \u003d flights98.union(flights99).union(flights00)\nval carriers \u003d benv.readCsvFile[Carrier](\"/tmp/carriers.csv\", ignoreFirstLine \u003d true, quoteCharacter \u003d \u0027\"\u0027)", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:02:38 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "lineNumbers": true, - "tableHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952511284_-589624871", - "id": "20170109-120151_872852428", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "defined class Flight\ndefined class Carrier\nflights98: org.apache.flink.api.scala.DataSet[Flight] \u003d org.apache.flink.api.scala.DataSet@7cd81fd5\nflights99: org.apache.flink.api.scala.DataSet[Flight] \u003d org.apache.flink.api.scala.DataSet@58242e79\nflights00: org.apache.flink.api.scala.DataSet[Flight] \u003d org.apache.flink.api.scala.DataSet@13f866c0\nflights: org.apache.flink.api.scala.DataSet[Flight] \u003d org.apache.flink.api.scala.DataSet@2aad2530\ncarriers: org.apache.flink.api.scala.DataSet[Carrier] \u003d org.apache.flink.api.scala.DataSet@148c977b\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:01:51 PM", - "dateStarted": "Jan 9, 2017 12:02:10 PM", - "dateFinished": "Jan 9, 2017 12:02:29 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n### Choosing the carrier\nNow we will search for the most popular carrier during the whole time period.", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:03:08 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "markdown", - "editOnDblClick": true - }, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952530113_212237809", - "id": "20170109-120210_773710997", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch3\u003eChoosing the carrier\u003c/h3\u003e\n\u003cp\u003eNow we will search for the most popular carrier during the whole time period.\u003c/p\u003e\n\u003c/div\u003e" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:02:10 PM", - "dateStarted": "Jan 9, 2017 12:03:08 PM", - "dateFinished": "Jan 9, 2017 12:03:08 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%flink\n\nimport org.apache.flink.api.common.operators.Order\nimport org.apache.flink.api.java.aggregation.Aggregations\n\ncase class CarrierFlightsCount(carrierCode: String, count: Int)\ncase class CountByMonth(month: Int, count: Int)\n\nval carriersFlights \u003d flights\n .map(f \u003d\u003e CarrierFlightsCount(f.carrierCode, 1))\n .groupBy(\"carrierCode\")\n .sum(\"count\")\n\nval maxFlights \u003d carriersFlights\n .aggregate(Aggregations.MAX, \"count\")\n\nval bestCarrier \u003d carriersFlights\n .join(maxFlights)\n .where(\"count\")\n .equalTo(\"count\")\n .map(_._1)\n \nval carrierName \u003d bestCarrier\n .join(carriers)\n .where(\"carrierCode\")\n .equalTo(\"code\")\n .map(_._2.name)\n .collect\n .head", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:04:04 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "lineNumbers": true, - "tableHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952588708_-1770095793", - "id": "20170109-120308_1328511597", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "import org.apache.flink.api.common.operators.Order\nimport org.apache.flink.api.java.aggregation.Aggregations\ndefined class CarrierFlightsCount\ndefined class CountByMonth\ncarriersFlights: org.apache.flink.api.scala.AggregateDataSet[CarrierFlightsCount] \u003d org.apache.flink.api.scala.AggregateDataSet@2c59be0b\nmaxFlights: org.apache.flink.api.scala.AggregateDataSet[CarrierFlightsCount] \u003d org.apache.flink.api.scala.AggregateDataSet@53e5fad9\nbestCarrier: org.apache.flink.api.scala.DataSet[CarrierFlightsCount] \u003d org.apache.flink.api.scala.DataSet@64b7b1b3\ncarrierName: String \u003d Delta Air Lines Inc.\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:03:08 PM", - "dateStarted": "Jan 9, 2017 12:03:41 PM", - "dateFinished": "Jan 9, 2017 12:03:58 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%flink\n\nprintln(s\"\"\"The most popular carrier is:\n$carrierName\n\"\"\")", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:09:18 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "lineNumbers": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952621624_-1222400539", - "id": "20170109-120341_952212268", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "The most popular carrier is:\nDelta Air Lines Inc.\n\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:03:41 PM", - "dateStarted": "Jan 9, 2017 12:04:09 PM", - "dateFinished": "Jan 9, 2017 12:04:10 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n### Calculating flights\nThe last step is to filter **Delta Air Lines** flights and group them by months.", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:04:26 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "markdown", - "editOnDblClick": true - }, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952649646_-1553253944", - "id": "20170109-120409_2003276881", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch3\u003eCalculating flights\u003c/h3\u003e\n\u003cp\u003eThe last step is to filter \u003cstrong\u003eDelta Air Lines\u003c/strong\u003e flights and group them by months.\u003c/p\u003e\n\u003c/div\u003e" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:04:09 PM", - "dateStarted": "Jan 9, 2017 12:04:26 PM", - "dateFinished": "Jan 9, 2017 12:04:26 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "flights grouping", - "text": "%flink\n\ndef countFlightsPerMonth(flights: DataSet[Flight],\n carrier: DataSet[CarrierFlightsCount]) \u003d {\n val carrierFlights \u003d flights\n .join(carrier)\n .where(\"carrierCode\")\n .equalTo(\"carrierCode\")\n .map(_._1)\n \n carrierFlights\n .map(flight \u003d\u003e CountByMonth(flight.month, 1))\n .groupBy(\"month\")\n .sum(\"count\")\n .sortPartition(\"month\", Order.ASCENDING)\n}\n\nval bestCarrierFlights_98 \u003d countFlightsPerMonth(flights98, bestCarrier)\nval bestCarrierFlights_99 \u003d countFlightsPerMonth(flights99, bestCarrier)\nval bestCarrierFlights_00 \u003d countFlightsPerMonth(flights00, bestCarrier)", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:05:06 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "lineNumbers": true, - "title": true, - "tableHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952665972_667547355", - "id": "20170109-120425_2018337048", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "countFlightsPerMonth: (flights: org.apache.flink.api.scala.DataSet[Flight], carrier: org.apache.flink.api.scala.DataSet[CarrierFlightsCount])org.apache.flink.api.scala.DataSet[CountByMonth]\nbestCarrierFlights_98: org.apache.flink.api.scala.DataSet[CountByMonth] \u003d org.apache.flink.api.scala.PartitionSortedDataSet@2aa64309\nbestCarrierFlights_99: org.apache.flink.api.scala.DataSet[CountByMonth] \u003d org.apache.flink.api.scala.PartitionSortedDataSet@35fe60c4\nbestCarrierFlights_00: org.apache.flink.api.scala.DataSet[CountByMonth] \u003d org.apache.flink.api.scala.PartitionSortedDataSet@4621410f\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:04:25 PM", - "dateStarted": "Jan 9, 2017 12:04:50 PM", - "dateFinished": "Jan 9, 2017 12:04:51 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "making a results table", - "text": "%flink\n\ndef monthAsString(month: Int): String \u003d {\n month match {\n case 1 \u003d\u003e \"Jan\"\n case 2 \u003d\u003e \"Feb\"\n case 3 \u003d\u003e \"Mar\"\n case 4 \u003d\u003e \"Apr\"\n case 5 \u003d\u003e \"May\"\n case 6 \u003d\u003e \"Jun\"\n case 7 \u003d\u003e \"Jul\"\n case 8 \u003d\u003e \"Aug\"\n case 9 \u003d\u003e \"Sept\"\n case 10 \u003d\u003e \"Oct\"\n case 11 \u003d\u003e \"Nov\"\n case 12 \u003d\u003e \"Dec\"\n }\n}\n\n// We should put all the results into a common DataFrame\n// to show them in a common picture\nval bestCarrierFlights \u003d bestCarrierFlights_98\n .join(bestCarrierFlights_99)\n .where(\"month\")\n .equalTo(\"month\")\n .map(tuple \u003d\u003e (tuple._1.month, tuple._1.count, tuple._2.count))\n .join(bestCarrierFlights_00)\n .where(0)\n .equalTo(\"month\")\n .map(tuple \u003d\u003e (tuple._1._1, tuple._1._2, tuple._1._3, tuple._2.count))\n .collect\n \nvar flightsByMonthTable \u003d s\"Month\\t1998\\t1999\\t2000\\n\"\nbestCarrierFlights.foreach(data \u003d\u003e flightsByMonthTable +\u003d s\"${monthAsString(data._1)}\\t${data._2}\\t${data._3}\\t${data._4}\\n\")", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:06:03 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "lineNumbers": true, - "title": true, - "tableHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952690164_-1061667443", - "id": "20170109-120450_1574916350", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "monthAsString: (month: Int)String\nbestCarrierFlights: Seq[(Int, Int, Int, Int)] \u003d Buffer((1,78523,77745,78055), (2,71101,70498,71090), (3,78906,77812,78453), (4,75726,75343,75247), (5,77937,77226,76797), (6,75432,75840,74846), (7,77521,77264,75776), (8,78104,78141,77654), (9,74840,75067,73696), (10,76145,77829,77425), (11,73552,74411,73659), (12,77308,76954,75331))\nflightsByMonthTable: String \u003d \n\"Month\t1998\t1999\t2000\n\"\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:04:50 PM", - "dateStarted": "Jan 9, 2017 12:05:24 PM", - "dateFinished": "Jan 9, 2017 12:05:59 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "\"Delta Air Lines\" flights count by months", - "text": "%flink\n\nprintln(s\"\"\"%table\n$flightsByMonthTable\n\"\"\")", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:06:17 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": { - "0": { - "graph": { - "mode": "lineChart", - "height": 300.0, - "optionOpen": false, - "setting": { - "lineChart": {} - }, - "commonSetting": {}, - "keys": [ - { - "name": "Month", - "index": 0.0, - "aggr": "sum" - } - ], - "groups": [], - "values": [ - { - "name": "1998", - "index": 1.0, - "aggr": "sum" - }, - { - "name": "1999", - "index": 2.0, - "aggr": "sum" - }, - { - "name": "2000", - "index": 3.0, - "aggr": "sum" - } - ] - }, - "helium": {} - } - }, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "title": true, - "lineNumbers": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952724460_191505697", - "id": "20170109-120524_2037622815", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TABLE", - "data": "Month\t1998\t1999\t2000\nJan\t78523\t77745\t78055\nFeb\t71101\t70498\t71090\nMar\t78906\t77812\t78453\nApr\t75726\t75343\t75247\nMay\t77937\t77226\t76797\nJun\t75432\t75840\t74846\nJul\t77521\t77264\t75776\nAug\t78104\t78141\t77654\nSept\t74840\t75067\t73696\nOct\t76145\t77829\t77425\nNov\t73552\t74411\t73659\nDec\t77308\t76954\t75331\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:05:24 PM", - "dateStarted": "Jan 9, 2017 12:06:07 PM", - "dateFinished": "Jan 9, 2017 12:06:08 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n### Results\nLooking at this chart we can say that February is the most unpopular month, but this is only because it has less days (28 or 29) than the other months (30 or 31). To receive more fair picture we should calculate the average flights count per day for each month.", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:06:34 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "markdown", - "editOnDblClick": true - }, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952767719_-1010557136", - "id": "20170109-120607_67673280", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch3\u003eResults\u003c/h3\u003e\n\u003cp\u003eLooking at this chart we can say that February is the most unpopular month, but this is only because it has less days (28 or 29) than the other months (30 or 31). To receive more fair picture we should calculate the average flights count per day for each month.\u003c/p\u003e\n\u003c/div\u003e" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:06:07 PM", - "dateStarted": "Jan 9, 2017 12:06:34 PM", - "dateFinished": "Jan 9, 2017 12:06:34 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%flink\n\ndef daysInMonth(month: Int, year: Int): Int \u003d {\n month match {\n case 1 \u003d\u003e 31\n case 2 \u003d\u003e if (year % 4 \u003d\u003d 0) {\n 29\n } else {\n 28\n }\n case 3 \u003d\u003e 31\n case 4 \u003d\u003e 30\n case 5 \u003d\u003e 31\n case 6 \u003d\u003e 30\n case 7 \u003d\u003e 31\n case 8 \u003d\u003e 31\n case 9 \u003d\u003e 30\n case 10 \u003d\u003e 31\n case 11 \u003d\u003e 30\n case 12 \u003d\u003e 31\n }\n}\n\n\nvar flightsByDayTable \u003d s\"Month\\t1998\\t1999\\t2000\\n\"\n\nbestCarrierFlights.foreach(data \u003d\u003e flightsByDayTable +\u003d s\"${monthAsString(data._1)}\\t${data._2/daysInMonth(data._1,1998)}\\t${data._3/daysInMonth(data._1,1999)}\\t${data._4/daysInMonth(data._1,2000)}\\n\")", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:06:58 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "lineNumbers": true, - "tableHide": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952794097_-785833130", - "id": "20170109-120634_492170963", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "daysInMonth: (month: Int, year: Int)Int\nflightsByDayTable: String \u003d \n\"Month\t1998\t1999\t2000\n\"\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:06:34 PM", - "dateStarted": "Jan 9, 2017 12:06:53 PM", - "dateFinished": "Jan 9, 2017 12:06:53 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "title": "\"Delta Air Lines\" flights count by days", - "text": "%flink\n\nprintln(s\"\"\"%table\n$flightsByDayTable\n\"\"\")", - "user": "anonymous", - "dateUpdated": "Jan 9, 2017 12:10:56 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": { - "0": { - "graph": { - "mode": "lineChart", - "height": 300.0, - "optionOpen": false, - "setting": { - "lineChart": {} - }, - "commonSetting": {}, - "keys": [ - { - "name": "Month", - "index": 0.0, - "aggr": "sum" - } - ], - "groups": [], - "values": [ - { - "name": "1998", - "index": 1.0, - "aggr": "sum" - }, - { - "name": "1999", - "index": 2.0, - "aggr": "sum" - }, - { - "name": "2000", - "index": 3.0, - "aggr": "sum" - } - ] - }, - "helium": {} - } - }, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala", - "title": true, - "lineNumbers": true - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952813391_1847418990", - "id": "20170109-120653_1870236569", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TABLE", - "data": "Month\t1998\t1999\t2000\nJan\t2533\t2507\t2517\nFeb\t2539\t2517\t2451\nMar\t2545\t2510\t2530\nApr\t2524\t2511\t2508\nMay\t2514\t2491\t2477\nJun\t2514\t2528\t2494\nJul\t2500\t2492\t2444\nAug\t2519\t2520\t2504\nSept\t2494\t2502\t2456\nOct\t2456\t2510\t2497\nNov\t2451\t2480\t2455\nDec\t2493\t2482\t2430\n" - } - ] - }, - "dateCreated": "Jan 9, 2017 12:06:53 PM", - "dateStarted": "Jan 9, 2017 12:07:22 PM", - "dateFinished": "Jan 9, 2017 12:07:23 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%flink\n", - "dateUpdated": "Jan 9, 2017 12:07:22 PM", - "config": {}, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483952842919_587228425", - "id": "20170109-120722_939892827", - "dateCreated": "Jan 9, 2017 12:07:22 PM", - "status": "READY", - "progressUpdateIntervalMs": 500 - } - ], - "name": "Zeppelin Tutorial/Using Flink for batch processing", - "id": "2C35YU814", - "angularObjects": { - "2C4PVECE6:shared_process": [], - "2C4US9MUF:shared_process": [], - "2C4FYNB4G:shared_process": [], - "2C4GX28KP:shared_process": [], - "2C648AXXN:shared_process": [], - "2C3MSEJ2F:shared_process": [], - "2C6F2N6BT:shared_process": [], - "2C3US2RTN:shared_process": [], - "2C3TYMD6K:shared_process": [], - "2C3FDPZRX:shared_process": [], - "2C5TEARYX:shared_process": [], - "2C5D6NSNG:shared_process": [], - "2C6FVVEAD:shared_process": [], - "2C582KNWG:shared_process": [], - "2C6ZMVGM7:shared_process": [], - "2C6UYQG8R:shared_process": [], - "2C666VZT2:shared_process": [], - "2C4JRCY3K:shared_process": [], - "2C64W5T9D:shared_process": [] - }, - "config": { - "looknfeel": "default" - }, - "info": {} -} diff --git a/smart-zeppelin/notebook/2C57UKYWR/note.json b/smart-zeppelin/notebook/2C57UKYWR/note.json deleted file mode 100644 index 22afb2a5701..00000000000 --- a/smart-zeppelin/notebook/2C57UKYWR/note.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "paragraphs": [ - { - "text": "%md\n\n\n### [Apache Pig](http://pig.apache.org/) is a platform for analyzing large data sets that consists of a high-level language for expressing data analysis programs, coupled with infrastructure for evaluating these programs. The salient property of Pig programs is that their structure is amenable to substantial parallelization, which in turns enables them to handle very large data sets.\n\nPig\u0027s language layer currently consists of a textual language called Pig Latin, which has the following key properties:\n\n* Ease of programming. It is trivial to achieve parallel execution of simple, \"embarrassingly parallel\" data analysis tasks. Complex tasks comprised of multiple interrelated data transformations are explicitly encoded as data flow sequences, making them easy to write, understand, and maintain.\n* Optimization opportunities. The way in which tasks are encoded permits the system to optimize their execution automatically, allowing the user to focus on semantics rather than efficiency.\n* Extensibility. Users can create their own functions to do special-purpose processing.\n", - "user": "anonymous", - "dateUpdated": "Jan 22, 2017 12:48:50 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "markdown", - "editOnDblClick": true - }, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch3\u003e\u003ca href\u003d\"http://pig.apache.org/\"\u003eApache Pig\u003c/a\u003e is a platform for analyzing large data sets that consists of a high-level language for expressing data analysis programs, coupled with infrastructure for evaluating these programs. The salient property of Pig programs is that their structure is amenable to substantial parallelization, which in turns enables them to handle very large data sets.\u003c/h3\u003e\n\u003cp\u003ePig\u0026rsquo;s language layer currently consists of a textual language called Pig Latin, which has the following key properties:\u003c/p\u003e\n\u003cul\u003e\n \u003cli\u003eEase of programming. It is trivial to achieve parallel execution of simple, \u0026ldquo;embarrassingly parallel\u0026rdquo; data analysis tasks. Complex tasks comprised of multiple interrelated data transformations are explicitly encoded as data flow sequences, making them easy to write, understand, and maintain.\u003c/li\u003e\n \u003cli\u003eOptimization opportunities. The way in which tasks are encoded permits the system to optimize their execution automatically, allowing the user to focus on semantics rather than efficiency.\u003c/li\u003e\n \u003cli\u003eExtensibility. Users can create their own functions to do special-purpose processing.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e" - } - ] - }, - "apps": [], - "jobName": "paragraph_1483277502513_1156234051", - "id": "20170101-213142_1565013608", - "dateCreated": "Jan 1, 2017 9:31:42 PM", - "dateStarted": "Jan 22, 2017 12:48:50 PM", - "dateFinished": "Jan 22, 2017 12:48:51 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%md\n\nThis pig tutorial use pig to do the same thing as spark tutorial. The default mode is mapreduce, you can also use other modes like local/tez_local/tez. For mapreduce mode, you need to have hadoop installed and export `HADOOP_CONF_DIR` in `zeppelin-env.sh`\n\nThe tutorial consists of 3 steps.\n\n* Use shell interpreter to download bank.csv and upload it to hdfs\n* use `%pig` to process the data\n* use `%pig.query` to query the data", - "user": "anonymous", - "dateUpdated": "Jan 22, 2017 12:48:55 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "markdown", - "editOnDblClick": true - }, - "editorMode": "ace/mode/markdown", - "editorHide": true, - "tableHide": false - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003cp\u003eThis pig tutorial use pig to do the same thing as spark tutorial. The default mode is mapreduce, you can also use other modes like local/tez_local/tez. For mapreduce mode, you need to have hadoop installed and export \u003ccode\u003eHADOOP_CONF_DIR\u003c/code\u003e in \u003ccode\u003ezeppelin-env.sh\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eThe tutorial consists of 3 steps.\u003c/p\u003e\n\u003cul\u003e\n \u003cli\u003eUse shell interpreter to download bank.csv and upload it to hdfs\u003c/li\u003e\n \u003cli\u003euse \u003ccode\u003e%pig\u003c/code\u003e to process the data\u003c/li\u003e\n \u003cli\u003euse \u003ccode\u003e%pig.query\u003c/code\u003e to query the data\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e" - } - ] - }, - "apps": [], - "jobName": "paragraph_1483689316217_-629483391", - "id": "20170106-155516_1050601059", - "dateCreated": "Jan 6, 2017 3:55:16 PM", - "dateStarted": "Jan 22, 2017 12:48:55 PM", - "dateFinished": "Jan 22, 2017 12:48:55 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%sh\n\nwget https://s3.amazonaws.com/apache-zeppelin/tutorial/bank/bank.csv\nhadoop fs -put bank.csv .\n", - "user": "anonymous", - "dateUpdated": "Jan 22, 2017 12:51:48 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "text", - "editOnDblClick": false - }, - "editorMode": "ace/mode/text" - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "--2017-01-22 12:51:48-- https://s3.amazonaws.com/apache-zeppelin/tutorial/bank/bank.csv\nResolving s3.amazonaws.com... 52.216.80.227\nConnecting to s3.amazonaws.com|52.216.80.227|:443... connected.\nHTTP request sent, awaiting response... 200 OK\nLength: 461474 (451K) [application/octet-stream]\nSaving to: \u0027bank.csv.3\u0027\n\n 0K .......... .......... .......... .......... .......... 11% 141K 3s\n 50K .......... .......... .......... .......... .......... 22% 243K 2s\n 100K .......... .......... .......... .......... .......... 33% 449K 1s\n 150K .......... .......... .......... .......... .......... 44% 413K 1s\n 200K .......... .......... .......... .......... .......... 55% 746K 1s\n 250K .......... .......... .......... .......... .......... 66% 588K 0s\n 300K .......... .......... .......... .......... .......... 77% 840K 0s\n 350K .......... .......... .......... .......... .......... 88% 795K 0s\n 400K .......... .......... .......... .......... .......... 99% 1.35M 0s\n 450K 100% 13.2K\u003d1.1s\n\n2017-01-22 12:51:50 (409 KB/s) - \u0027bank.csv.3\u0027 saved [461474/461474]\n\n17/01/22 12:51:51 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1485058437578_-1906301827", - "id": "20170122-121357_640055590", - "dateCreated": "Jan 22, 2017 12:13:57 PM", - "dateStarted": "Jan 22, 2017 12:51:48 PM", - "dateFinished": "Jan 22, 2017 12:51:52 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%pig\n\nbankText \u003d load \u0027bank.csv\u0027 using PigStorage(\u0027;\u0027);\nbank \u003d foreach bankText generate $0 as age, $1 as job, $2 as marital, $3 as education, $5 as balance; \nbank \u003d filter bank by age !\u003d \u0027\"age\"\u0027;\nbank \u003d foreach bank generate (int)age, REPLACE(job,\u0027\"\u0027,\u0027\u0027) as job, REPLACE(marital, \u0027\"\u0027, \u0027\u0027) as marital, (int)(REPLACE(balance, \u0027\"\u0027, \u0027\u0027)) as balance;\n\n-- The following statement is optional, it depends on whether your needs.\n-- store bank into \u0027clean_bank.csv\u0027 using PigStorage(\u0027;\u0027);\n\n\n", - "user": "anonymous", - "dateUpdated": "Feb 24, 2017 5:08:08 PM", - "config": { - "colWidth": 12.0, - "editorMode": "ace/mode/pig", - "results": {}, - "enabled": true, - "editorSetting": { - "language": "pig", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [] - }, - "apps": [], - "jobName": "paragraph_1483277250237_-466604517", - "id": "20161228-140640_1560978333", - "dateCreated": "Jan 1, 2017 9:27:30 PM", - "dateStarted": "Feb 24, 2017 5:08:08 PM", - "dateFinished": "Feb 24, 2017 5:08:11 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%pig.query\n\nbank_data \u003d filter bank by age \u003c 30;\nb \u003d group bank_data by age;\nforeach b generate group, COUNT($1);\n\n", - "user": "anonymous", - "dateUpdated": "Feb 24, 2017 5:08:13 PM", - "config": { - "colWidth": 4.0, - "editorMode": "ace/mode/pig", - "results": { - "0": { - "graph": { - "mode": "multiBarChart", - "height": 300.0, - "optionOpen": false - }, - "helium": {} - } - }, - "enabled": true, - "editorSetting": { - "language": "pig", - "editOnDblClick": false - } - }, - "settings": { - "params": {}, - "forms": {} - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TABLE", - "data": "group\tcol_1\n19\t4\n20\t3\n21\t7\n22\t9\n23\t20\n24\t24\n25\t44\n26\t77\n27\t94\n28\t103\n29\t97\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1483277250238_-465450270", - "id": "20161228-140730_1903342877", - "dateCreated": "Jan 1, 2017 9:27:30 PM", - "dateStarted": "Feb 24, 2017 5:08:13 PM", - "dateFinished": "Feb 24, 2017 5:08:26 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%pig.query\n\nbank_data \u003d filter bank by age \u003c ${maxAge\u003d40};\nb \u003d group bank_data by age;\nforeach b generate group, COUNT($1) as count;", - "user": "anonymous", - "dateUpdated": "Feb 24, 2017 5:08:14 PM", - "config": { - "colWidth": 4.0, - "editorMode": "ace/mode/pig", - "results": { - "0": { - "graph": { - "mode": "pieChart", - "height": 300.0, - "optionOpen": false - }, - "helium": {} - } - }, - "enabled": true, - "editorSetting": { - "language": "pig", - "editOnDblClick": false - } - }, - "settings": { - "params": { - "maxAge": "36" - }, - "forms": { - "maxAge": { - "name": "maxAge", - "defaultValue": "40", - "hidden": false - } - } - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TABLE", - "data": "group\tcount\n19\t4\n20\t3\n21\t7\n22\t9\n23\t20\n24\t24\n25\t44\n26\t77\n27\t94\n28\t103\n29\t97\n30\t150\n31\t199\n32\t224\n33\t186\n34\t231\n35\t180\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1483277250239_-465835019", - "id": "20161228-154918_1551591203", - "dateCreated": "Jan 1, 2017 9:27:30 PM", - "dateStarted": "Feb 24, 2017 5:08:14 PM", - "dateFinished": "Feb 24, 2017 5:08:29 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%pig.query\n\nbank_data \u003d filter bank by marital\u003d\u003d\u0027${marital\u003dsingle,single|divorced|married}\u0027;\nb \u003d group bank_data by age;\nforeach b generate group, COUNT($1) as count;\n\n\n", - "user": "anonymous", - "dateUpdated": "Feb 24, 2017 5:08:15 PM", - "config": { - "colWidth": 4.0, - "editorMode": "ace/mode/pig", - "results": { - "0": { - "graph": { - "mode": "scatterChart", - "height": 300.0, - "optionOpen": false - }, - "helium": {} - } - }, - "enabled": true, - "editorSetting": { - "language": "pig", - "editOnDblClick": false - } - }, - "settings": { - "params": { - "marital": "married" - }, - "forms": { - "marital": { - "name": "marital", - "defaultValue": "single", - "options": [ - { - "value": "single" - }, - { - "value": "divorced" - }, - { - "value": "married" - } - ], - "hidden": false - } - } - }, - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TABLE", - "data": "group\tcount\n23\t3\n24\t11\n25\t11\n26\t18\n27\t26\n28\t23\n29\t37\n30\t56\n31\t104\n32\t105\n33\t103\n34\t142\n35\t109\n36\t117\n37\t100\n38\t99\n39\t88\n40\t105\n41\t97\n42\t91\n43\t79\n44\t68\n45\t76\n46\t82\n47\t78\n48\t91\n49\t87\n50\t74\n51\t63\n52\t66\n53\t75\n54\t56\n55\t68\n56\t50\n57\t78\n58\t67\n59\t56\n60\t36\n61\t15\n62\t5\n63\t7\n64\t6\n65\t4\n66\t7\n67\t5\n68\t1\n69\t5\n70\t5\n71\t5\n72\t4\n73\t6\n74\t2\n75\t3\n76\t1\n77\t5\n78\t2\n79\t3\n80\t6\n81\t1\n83\t2\n86\t1\n87\t1\n" - } - ] - }, - "apps": [], - "jobName": "paragraph_1483277250240_-480070728", - "id": "20161228-142259_575675591", - "dateCreated": "Jan 1, 2017 9:27:30 PM", - "dateStarted": "Feb 24, 2017 5:08:27 PM", - "dateFinished": "Feb 24, 2017 5:08:31 PM", - "status": "FINISHED", - "progressUpdateIntervalMs": 500 - }, - { - "text": "%pig\n", - "dateUpdated": "Jan 1, 2017 9:27:30 PM", - "config": {}, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1483277250240_-480070728", - "id": "20161228-155036_1854903164", - "dateCreated": "Jan 1, 2017 9:27:30 PM", - "status": "READY", - "errorMessage": "", - "progressUpdateIntervalMs": 500 - } - ], - "name": "Zeppelin Tutorial/Using Pig for querying data", - "id": "2C57UKYWR", - "angularObjects": { - "2C3RWCVAG:shared_process": [], - "2C9KGCHDE:shared_process": [], - "2C8X2BS16:shared_process": [] - }, - "config": {}, - "info": {} -} \ No newline at end of file diff --git a/smart-zeppelin/notebook/2CM8SHUUZ/note.json b/smart-zeppelin/notebook/2CM8SHUUZ/note.json deleted file mode 100644 index 11b025aaeb5..00000000000 --- a/smart-zeppelin/notebook/2CM8SHUUZ/note.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "paragraphs": [ - { - "text": "ll", - "user": "admin", - "dateUpdated": "Jul 6, 2017 1:15:06 PM", - "config": { - "colWidth": 12.0, - "enabled": true, - "results": {}, - "editorSetting": { - "language": "scala", - "editOnDblClick": false - }, - "editorMode": "ace/mode/scala" - }, - "settings": { - "params": {}, - "forms": {} - }, - "apps": [], - "jobName": "paragraph_1499310084885_-290637029", - "id": "20170706-110124_1728747823", - "dateCreated": "Jul 6, 2017 11:01:24 AM", - "status": "READY", - "progressUpdateIntervalMs": 500 - } - ], - "name": "Untitled Note 2", - "id": "2CM8SHUUZ", - "angularObjects": { - "2CPWJC381:shared_process": [] - }, - "config": {}, - "info": {} -} \ No newline at end of file diff --git a/smart-zeppelin/notebook/2CM9DW8NW/note.json b/smart-zeppelin/notebook/2CM9DW8NW/note.json index 2387cf3e1d3..36264710d52 100644 --- a/smart-zeppelin/notebook/2CM9DW8NW/note.json +++ b/smart-zeppelin/notebook/2CM9DW8NW/note.json @@ -15,7 +15,7 @@ "progressUpdateIntervalMs": 500 } ], - "name": "Untitled Note 3", + "name": "Smart", "id": "2CM9DW8NW", "angularObjects": { "2CPWJC381:shared_process": [] diff --git a/smart-zeppelin/pom.xml b/smart-zeppelin/pom.xml index 0e72c733792..5b0fad96780 100644 --- a/smart-zeppelin/pom.xml +++ b/smart-zeppelin/pom.xml @@ -56,8 +56,6 @@ zeppelin-interpreter zeppelin-zengine zeppelin-display - spark - zeppelin-web zeppelin-server diff --git a/smart-zeppelin/zeppelin-server/pom.xml b/smart-zeppelin/zeppelin-server/pom.xml index a79cf3dce26..30659a761b8 100644 --- a/smart-zeppelin/zeppelin-server/pom.xml +++ b/smart-zeppelin/zeppelin-server/pom.xml @@ -403,6 +403,11 @@ smart-common 1.0-SNAPSHOT + + org.smartdata + smart-interpreter + 1.0-SNAPSHOT + diff --git a/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/server/SmartZeppelinServer.java b/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/server/SmartZeppelinServer.java index 551553db6b2..5cbccd4c81d 100644 --- a/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/server/SmartZeppelinServer.java +++ b/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/server/SmartZeppelinServer.java @@ -327,7 +327,7 @@ private static Server setupJettyServer(ZeppelinConfiguration zconf) { } private void setupNotebookServer(WebAppContext webapp) { - notebookWsServer = new NotebookServer(); + notebookWsServer = new NotebookServer(engine); String maxTextMessageSize = zconf.getWebsocketMaxTextMessageSize(); final ServletHolder servletHolder = new ServletHolder(notebookWsServer); diff --git a/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java b/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java deleted file mode 100644 index 672a6bd6fa7..00000000000 --- a/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.server; - -import java.io.File; -import java.io.IOException; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.Set; - -import javax.servlet.DispatcherType; -import javax.ws.rs.core.Application; - -import com.sun.jersey.api.core.ApplicationAdapter; -import com.sun.jersey.api.core.PackagesResourceConfig; -import com.sun.jersey.api.core.ResourceConfig; -import com.sun.jersey.spi.container.servlet.ServletContainer; -import org.apache.commons.lang.StringUtils; -import org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet; -import org.apache.shiro.web.env.EnvironmentLoaderListener; -import org.apache.shiro.web.servlet.ShiroFilter; -import org.apache.zeppelin.conf.ZeppelinConfiguration; -import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars; -import org.apache.zeppelin.dep.DependencyResolver; -import org.apache.zeppelin.helium.Helium; -import org.apache.zeppelin.helium.HeliumApplicationFactory; -import org.apache.zeppelin.helium.HeliumVisualizationFactory; -import org.apache.zeppelin.interpreter.InterpreterFactory; -import org.apache.zeppelin.interpreter.InterpreterOption; -import org.apache.zeppelin.interpreter.InterpreterOutput; -import org.apache.zeppelin.interpreter.InterpreterSettingManager; -import org.apache.zeppelin.notebook.Notebook; -import org.apache.zeppelin.notebook.NotebookAuthorization; -import org.apache.zeppelin.notebook.repo.NotebookRepoSync; -import org.apache.zeppelin.rest.ConfigurationsRestApi; -import org.apache.zeppelin.rest.CredentialRestApi; -import org.apache.zeppelin.rest.HeliumRestApi; -import org.apache.zeppelin.rest.InterpreterRestApi; -import org.apache.zeppelin.rest.LoginRestApi; -import org.apache.zeppelin.rest.NotebookRepoRestApi; -import org.apache.zeppelin.rest.NotebookRestApi; -import org.apache.zeppelin.rest.SecurityRestApi; -import org.apache.zeppelin.rest.ZeppelinRestApi; -import org.apache.zeppelin.scheduler.SchedulerFactory; -import org.apache.zeppelin.search.LuceneSearch; -import org.apache.zeppelin.search.SearchService; -import org.apache.zeppelin.socket.NotebookServer; -import org.apache.zeppelin.user.Credentials; -import org.apache.zeppelin.utils.SecurityUtils; -import org.eclipse.jetty.http.HttpVersion; -import org.eclipse.jetty.server.HttpConfiguration; -import org.eclipse.jetty.server.HttpConnectionFactory; -import org.eclipse.jetty.server.SecureRequestCustomizer; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.server.handler.ContextHandlerCollection; -import org.eclipse.jetty.server.session.SessionHandler; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.FilterHolder; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.ssl.SslContextFactory; -import org.eclipse.jetty.webapp.WebAppContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Main class of Zeppelin. - */ -public class ZeppelinServer extends Application { - private static final Logger LOG = LoggerFactory.getLogger(ZeppelinServer.class); - - public static Notebook notebook; - public static Server jettyWebServer; - public static NotebookServer notebookWsServer; - public static Helium helium; - - private final InterpreterSettingManager interpreterSettingManager; - private SchedulerFactory schedulerFactory; - private InterpreterFactory replFactory; - private SearchService noteSearchService; - private NotebookRepoSync notebookRepo; - private NotebookAuthorization notebookAuthorization; - private Credentials credentials; - private DependencyResolver depResolver; - - public ZeppelinServer() throws Exception { - ZeppelinConfiguration conf = ZeppelinConfiguration.create(); - - this.depResolver = new DependencyResolver( - conf.getString(ConfVars.ZEPPELIN_INTERPRETER_LOCALREPO)); - - InterpreterOutput.limit = conf.getInt(ConfVars.ZEPPELIN_INTERPRETER_OUTPUT_LIMIT); - - HeliumApplicationFactory heliumApplicationFactory = new HeliumApplicationFactory(); - HeliumVisualizationFactory heliumVisualizationFactory; - - if (isBinaryPackage(conf)) { - /* In binary package, zeppelin-web/src/app/visualization and zeppelin-web/src/app/tabledata - * are copied to lib/node_modules/zeppelin-vis, lib/node_modules/zeppelin-tabledata directory. - * Check zeppelin/zeppelin-distribution/src/assemble/distribution.xml to see how they're - * packaged into binary package. - */ - heliumVisualizationFactory = new HeliumVisualizationFactory( - conf, - new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO)), - new File(conf.getRelativeDir("lib/node_modules/zeppelin-tabledata")), - new File(conf.getRelativeDir("lib/node_modules/zeppelin-vis"))); - } else { - heliumVisualizationFactory = new HeliumVisualizationFactory( - conf, - new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO)), - new File(conf.getRelativeDir("zeppelin-web/src/app/tabledata")), - new File(conf.getRelativeDir("zeppelin-web/src/app/visualization"))); - } - - this.helium = new Helium( - conf.getHeliumConfPath(), - conf.getHeliumDefaultLocalRegistryPath(), - heliumVisualizationFactory, - heliumApplicationFactory); - - // create visualization bundle - try { - heliumVisualizationFactory.bundle(helium.getVisualizationPackagesToBundle()); - } catch (Exception e) { - LOG.error(e.getMessage(), e); - } - - this.schedulerFactory = new SchedulerFactory(); - this.interpreterSettingManager = new InterpreterSettingManager(conf, depResolver, - new InterpreterOption(true)); - this.replFactory = new InterpreterFactory(conf, notebookWsServer, - notebookWsServer, heliumApplicationFactory, depResolver, SecurityUtils.isAuthenticated(), - interpreterSettingManager); - this.notebookRepo = new NotebookRepoSync(conf); - this.noteSearchService = new LuceneSearch(); - this.notebookAuthorization = NotebookAuthorization.init(conf); - this.credentials = new Credentials(conf.credentialsPersist(), conf.getCredentialsPath()); - notebook = new Notebook(conf, - notebookRepo, schedulerFactory, replFactory, interpreterSettingManager, notebookWsServer, - noteSearchService, notebookAuthorization, credentials); - - // to update notebook from application event from remote process. - heliumApplicationFactory.setNotebook(notebook); - // to update fire websocket event on application event. - heliumApplicationFactory.setApplicationEventListener(notebookWsServer); - - notebook.addNotebookEventListener(heliumApplicationFactory); - notebook.addNotebookEventListener(notebookWsServer.getNotebookInformationListener()); - } - - public static void main(String[] args) throws InterruptedException { - ZeppelinConfiguration conf = ZeppelinConfiguration.create(); - conf.setProperty("args", args); - - try { - startZeppelinServer(conf); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void startZeppelinServer(ZeppelinConfiguration conf) throws Exception { - jettyWebServer = setupJettyServer(conf); - - ContextHandlerCollection contexts = new ContextHandlerCollection(); - jettyWebServer.setHandler(contexts); - - // Web UI - final WebAppContext webApp = setupWebAppContext(contexts, conf); - - // Notebook server - setupNotebookServer(webApp, conf); - - // REST api - setupRestApiContextHandler(webApp, conf); - - //Below is commented since zeppelin-docs module is removed. - //final WebAppContext webAppSwagg = setupWebAppSwagger(conf); - - LOG.info("Starting zeppelin server"); - try { - jettyWebServer.start(); //Instantiates ZeppelinServer - } catch (Exception e) { - LOG.error("Error while running jettyServer", e); - System.exit(-1); - } - LOG.info("Done, zeppelin server started"); - - Runtime.getRuntime().addShutdownHook(new Thread(){ - @Override public void run() { - LOG.info("Shutting down Zeppelin Server ... "); - try { - jettyWebServer.stop(); - notebook.getInterpreterSettingManager().shutdown(); - notebook.close(); - Thread.sleep(3000); - } catch (Exception e) { - LOG.error("Error while stopping servlet container", e); - } - LOG.info("Bye"); - } - }); - - - // when zeppelin is started inside of ide (especially for eclipse) - // for graceful shutdown, input any key in console window - if (System.getenv("ZEPPELIN_IDENT_STRING") == null) { - try { - System.in.read(); - } catch (IOException e) { - LOG.error("Exception in ZeppelinServer while main ", e); - } - System.exit(0); - } - - jettyWebServer.join(); - ZeppelinServer.notebook.getInterpreterSettingManager().close(); - } - - private static Server setupJettyServer(ZeppelinConfiguration conf) { - - final Server server = new Server(); - ServerConnector connector; - - if (conf.useSsl()) { - LOG.debug("Enabling SSL for Zeppelin Server on port " + conf.getServerSslPort()); - HttpConfiguration httpConfig = new HttpConfiguration(); - httpConfig.setSecureScheme("https"); - httpConfig.setSecurePort(conf.getServerSslPort()); - httpConfig.setOutputBufferSize(32768); - httpConfig.setRequestHeaderSize(8192); - httpConfig.setResponseHeaderSize(8192); - httpConfig.setSendServerVersion(true); - - HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig); - SecureRequestCustomizer src = new SecureRequestCustomizer(); - // Only with Jetty 9.3.x - // src.setStsMaxAge(2000); - // src.setStsIncludeSubDomains(true); - httpsConfig.addCustomizer(src); - - connector = new ServerConnector( - server, - new SslConnectionFactory(getSslContextFactory(conf), HttpVersion.HTTP_1_1.asString()), - new HttpConnectionFactory(httpsConfig)); - } else { - connector = new ServerConnector(server); - } - - // Set some timeout options to make debugging easier. - int timeout = 1000 * 30; - connector.setIdleTimeout(timeout); - connector.setSoLingerTime(-1); - connector.setHost(conf.getServerAddress()); - if (conf.useSsl()) { - connector.setPort(conf.getServerSslPort()); - } else { - connector.setPort(conf.getServerPort()); - } - - server.addConnector(connector); - - return server; - } - - private static void setupNotebookServer(WebAppContext webapp, - ZeppelinConfiguration conf) { - notebookWsServer = new NotebookServer(); - String maxTextMessageSize = conf.getWebsocketMaxTextMessageSize(); - final ServletHolder servletHolder = new ServletHolder(notebookWsServer); - servletHolder.setInitParameter("maxTextMessageSize", maxTextMessageSize); - - final ServletContextHandler cxfContext = new ServletContextHandler( - ServletContextHandler.SESSIONS); - - webapp.addServlet(servletHolder, "/ws/*"); - } - - private static SslContextFactory getSslContextFactory(ZeppelinConfiguration conf) { - SslContextFactory sslContextFactory = new SslContextFactory(); - - // Set keystore - sslContextFactory.setKeyStorePath(conf.getKeyStorePath()); - sslContextFactory.setKeyStoreType(conf.getKeyStoreType()); - sslContextFactory.setKeyStorePassword(conf.getKeyStorePassword()); - sslContextFactory.setKeyManagerPassword(conf.getKeyManagerPassword()); - - if (conf.useClientAuth()) { - sslContextFactory.setNeedClientAuth(conf.useClientAuth()); - - // Set truststore - sslContextFactory.setTrustStorePath(conf.getTrustStorePath()); - sslContextFactory.setTrustStoreType(conf.getTrustStoreType()); - sslContextFactory.setTrustStorePassword(conf.getTrustStorePassword()); - } - - return sslContextFactory; - } - - private static void setupRestApiContextHandler(WebAppContext webapp, - ZeppelinConfiguration conf) throws Exception { - ResourceConfig config = new ApplicationAdapter(new ZeppelinServer()); - ServletHolder restServletHolder = new ServletHolder(new ServletContainer(config)); - - webapp.setSessionHandler(new SessionHandler()); - webapp.addServlet(restServletHolder, "/api/*"); - - String shiroIniPath = conf.getShiroPath(); - if (!StringUtils.isBlank(shiroIniPath)) { - webapp.setInitParameter("shiroConfigLocations", new File(shiroIniPath).toURI().toString()); - SecurityUtils.initSecurityManager(shiroIniPath); - webapp.addFilter(ShiroFilter.class, "/api/*", EnumSet.allOf(DispatcherType.class)); - webapp.addEventListener(new EnvironmentLoaderListener()); - } - } - - private static WebAppContext setupWebAppContext(ContextHandlerCollection contexts, - ZeppelinConfiguration conf) { - - WebAppContext webApp = new WebAppContext(); - webApp.setContextPath(conf.getServerContextPath()); - - File warPath = new File("../dist/zeppelin-web-0.7.2.war"); - //File(conf.getString(ConfVars.ZEPPELIN_WAR)); - if (warPath.isDirectory()) { - // Development mode, read from FS - // webApp.setDescriptor(warPath+"/WEB-INF/web.xml"); - webApp.setResourceBase(warPath.getPath()); - webApp.setParentLoaderPriority(true); - } else { - // use packaged WAR - webApp.setWar(warPath.getAbsolutePath()); - File warTempDirectory = new File(conf.getRelativeDir(ConfVars.ZEPPELIN_WAR_TEMPDIR)); - warTempDirectory.mkdir(); - LOG.info("ZeppelinServer Webapp path: {}", warTempDirectory.getPath()); - webApp.setTempDirectory(warTempDirectory); - } - // Explicit bind to root - webApp.addServlet(new ServletHolder(new DefaultServlet()), "/*"); - contexts.addHandler(webApp); - - webApp.addFilter(new FilterHolder(CorsFilter.class), "/*", - EnumSet.allOf(DispatcherType.class)); - - return webApp; - } - - @Override - public Set> getClasses() { - Set> classes = new HashSet<>(); - return classes; - } - - @Override - public Set getSingletons() { - Set singletons = new HashSet<>(); - - /** Rest-api root endpoint */ - ZeppelinRestApi root = new ZeppelinRestApi(); - singletons.add(root); - - NotebookRestApi notebookApi - = new NotebookRestApi(notebook, notebookWsServer, noteSearchService); - singletons.add(notebookApi); - - NotebookRepoRestApi notebookRepoApi = new NotebookRepoRestApi(notebookRepo, notebookWsServer); - singletons.add(notebookRepoApi); - - HeliumRestApi heliumApi = new HeliumRestApi(helium, notebook); - singletons.add(heliumApi); - - InterpreterRestApi interpreterApi = new InterpreterRestApi(interpreterSettingManager); - singletons.add(interpreterApi); - - CredentialRestApi credentialApi = new CredentialRestApi(credentials); - singletons.add(credentialApi); - - SecurityRestApi securityApi = new SecurityRestApi(); - singletons.add(securityApi); - - LoginRestApi loginRestApi = new LoginRestApi(); - singletons.add(loginRestApi); - - ConfigurationsRestApi settingsApi = new ConfigurationsRestApi(notebook); - singletons.add(settingsApi); - - return singletons; - } - - /** - * Check if it is source build or binary package - * @return - */ - private static boolean isBinaryPackage(ZeppelinConfiguration conf) { - return !new File(conf.getRelativeDir("zeppelin-web")).isDirectory(); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index 3e3670a466c..c746cab8553 100644 --- a/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/smart-zeppelin/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -88,6 +88,10 @@ import com.google.common.collect.Queues; import com.google.gson.reflect.TypeToken; +import org.smartdata.interpreter.SmartInterpreter; +import org.smartdata.interpreter.impl.ActionInterpreter; +import org.smartdata.interpreter.impl.RuleInterpreter; +import org.smartdata.server.SmartEngine; /** * Zeppelin websocket service. @@ -95,7 +99,6 @@ public class NotebookServer extends WebSocketServlet implements NotebookSocketListener, JobListenerFactory, AngularObjectRegistryListener, RemoteInterpreterProcessListener, ApplicationEventListener { - /** * Job manager service type */ @@ -118,7 +121,7 @@ String getKey() { final Map> noteSocketMap = new HashMap<>(); final Queue connectedSockets = new ConcurrentLinkedQueue<>(); final Map> userConnectedSockets = new ConcurrentHashMap<>(); - + private SmartEngine smartEngine; /** * This is a special endpoint in the notebook websoket, Every connection in this Queue * will be able to watch every websocket event, it doesnt need to be listed into the map of @@ -127,6 +130,10 @@ String getKey() { */ final Queue watcherSockets = Queues.newConcurrentLinkedQueue(); + public NotebookServer(SmartEngine smartEngine) { + this.smartEngine = smartEngine; + } + private Notebook notebook() { return SmartZeppelinServer.notebook; } @@ -167,7 +174,7 @@ public void onMessage(NotebookSocket conn, String msg) { LOG.debug("RECEIVE PRINCIPAL << " + messagereceived.principal); LOG.debug("RECEIVE TICKET << " + messagereceived.ticket); LOG.debug("RECEIVE ROLES << " + messagereceived.roles); - + LOG.info("messagereceived.op = " + messagereceived.op); if (LOG.isTraceEnabled()) { LOG.trace("RECEIVE MSG = " + messagereceived); } @@ -259,10 +266,11 @@ public void onMessage(NotebookSocket conn, String msg) { importNote(conn, userAndRoles, notebook, messagereceived); break; case COMMIT_PARAGRAPH: - updateParagraph(conn, userAndRoles, notebook, messagereceived); + LOG.info("COMMIT_PARAGRAPH.........................."); break; case RUN_PARAGRAPH: - runParagraph(conn, userAndRoles, notebook, messagereceived); + updateParagraph(conn, userAndRoles, notebook, messagereceived); +// runParagraph(conn, userAndRoles, notebook, messagereceived); break; case RUN_ALL_PARAGRAPHS: runAllParagraphs(conn, userAndRoles, notebook, messagereceived); @@ -1025,7 +1033,6 @@ private void moveFolderToTrash(NotebookSocket conn, HashSet userAndRoles if (folderId == null) { return; } - Folder folder = notebook.getFolder(folderId); if (folder != null && !folder.isTrash()) { String trashFolderId = Folder.TRASH_FOLDER_ID + "/" + folderId; @@ -1103,6 +1110,7 @@ private void updateParagraph(NotebookSocket conn, HashSet userAndRoles, Notebook notebook, Message fromMessage) throws IOException { String paragraphId = (String) fromMessage.get("id"); if (paragraphId == null) { + LOG.error("paragraphId is null."); return; } @@ -1118,6 +1126,15 @@ private void updateParagraph(NotebookSocket conn, HashSet userAndRoles, return; } + String text = (String) fromMessage.get("paragraph"); + String[] items = text.trim().split("\\s+"); + + StringBuilder sb = new StringBuilder(); + for (int i = 1; i < items.length; i++) { + sb.append(items[i]); + sb.append(" "); + } + Paragraph p = note.getParagraph(paragraphId); if (note.isPersonalizedMode()) { @@ -1137,10 +1154,27 @@ private void updateParagraph(NotebookSocket conn, HashSet userAndRoles, p.setTitle((String) fromMessage.get("title")); p.setText((String) fromMessage.get("paragraph")); } - - note.persist(subject); + SmartInterpreter smartInterpreter = null; + if (items[0].equals("%action")) { + smartInterpreter = new ActionInterpreter(smartEngine); + } else if (items[0].equals("%rule")) { + smartInterpreter = new RuleInterpreter(smartEngine); + } else { + p.setResult(new InterpreterResult(InterpreterResult.Code.SUCCESS, "%html " + + "Can not format " + items[0])); + broadcastParagraph(note, p); + return; + } + try { + String result = smartInterpreter.excute(sb.toString()); + p.setResult(new InterpreterResult(InterpreterResult.Code.SUCCESS, "%html " + result)); + } catch (IOException e) { + p.setReturn(new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage()), e); + p.setStatus(Status.ERROR); + } + if (note.isPersonalizedMode()) { Map userParagraphMap = note.getParagraph(paragraphId).getUserParagraphMap(); diff --git a/smart-zeppelin/zeppelin-server/src/test/java/com/webautomation/ScreenCaptureHtmlUnitDriver.java b/smart-zeppelin/zeppelin-server/src/test/java/com/webautomation/ScreenCaptureHtmlUnitDriver.java deleted file mode 100644 index adad8075e21..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/com/webautomation/ScreenCaptureHtmlUnitDriver.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.webautomation; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URL; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; -import org.openqa.selenium.Capabilities; -import org.openqa.selenium.OutputType; -import org.openqa.selenium.TakesScreenshot; -import org.openqa.selenium.WebDriverException; -import org.openqa.selenium.htmlunit.HtmlUnitDriver; -import org.openqa.selenium.internal.Base64Encoder; -import org.openqa.selenium.remote.CapabilityType; -import org.openqa.selenium.remote.DesiredCapabilities; - -import com.gargoylesoftware.htmlunit.BrowserVersion; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.WebRequest; -import com.gargoylesoftware.htmlunit.WebWindow; -import com.gargoylesoftware.htmlunit.html.HtmlElement; -import com.gargoylesoftware.htmlunit.html.HtmlPage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * from https://code.google.com/p/selenium/issues/detail?id=1361 - */ -public class ScreenCaptureHtmlUnitDriver extends HtmlUnitDriver implements TakesScreenshot { - - private static Map imagesCache = Collections.synchronizedMap(new HashMap()); - - private static Map cssjsCache = Collections.synchronizedMap(new HashMap()); - - // http://stackoverflow.com/questions/4652777/java-regex-to-get-the-urls-from-css - private final static Pattern cssUrlPattern = Pattern.compile("background(-image)?[\\s]*:[^url]*url[\\s]*\\([\\s]*([^\\)]*)[\\s]*\\)[\\s]*");// ? - - static Logger LOGGER = LoggerFactory.getLogger(ScreenCaptureHtmlUnitDriver.class); - - public ScreenCaptureHtmlUnitDriver() { - super(); - } - - public ScreenCaptureHtmlUnitDriver(boolean enableJavascript) { - super(enableJavascript); - } - - public ScreenCaptureHtmlUnitDriver(Capabilities capabilities) { - super(capabilities); - } - - public ScreenCaptureHtmlUnitDriver(BrowserVersion version) { - super(version); - DesiredCapabilities var = ((DesiredCapabilities) getCapabilities()); - var.setCapability(CapabilityType.TAKES_SCREENSHOT, true); - } - - @Override - @SuppressWarnings("unchecked") - public X getScreenshotAs(OutputType target) throws WebDriverException { - byte[] archive = new byte[0]; - try { - archive = downloadCssAndImages(getWebClient(), (HtmlPage) getCurrentWindow().getEnclosedPage()); - } catch (Exception e) { - LOGGER.error("Exception in ScreenCaptureHtmlUnitDriver while getScreenshotAs ", e); - } - if(target.equals(OutputType.BASE64)){ - return target.convertFromBase64Png(new Base64Encoder().encode(archive)); - } - if(target.equals(OutputType.FILE)){ - File f = new File("screen.tmp"); - try { - FileOutputStream scr = new FileOutputStream(f); - scr.write(archive); - scr.close(); - } catch (IOException e) { - throw new WebDriverException(e); - } - return (X) f; - } - return (X) archive; - } - - // http://stackoverflow.com/questions/2244272/how-can-i-tell-htmlunits-webclient-to-download-images-and-css - protected byte[] downloadCssAndImages(WebClient webClient, HtmlPage page) throws Exception { - WebWindow currentWindow = webClient.getCurrentWindow(); - Map urlMapping = new HashMap<>(); - Map files = new HashMap<>(); - WebWindow window = null; - try { - window = webClient.getWebWindowByName(page.getUrl().toString()+"_screenshot"); - webClient.getPage(window, new WebRequest(page.getUrl())); - } catch (Exception e) { - LOGGER.error("Exception in ScreenCaptureHtmlUnitDriver while downloadCssAndImages ", e); - window = webClient.openWindow(page.getUrl(), page.getUrl().toString()+"_screenshot"); - } - - String xPathExpression = "//*[name() = 'img' or name() = 'link' and (@type = 'text/css' or @type = 'image/x-icon') or @type = 'text/javascript']"; - List resultList = page.getByXPath(xPathExpression); - - Iterator i = resultList.iterator(); - while (i.hasNext()) { - try { - HtmlElement el = (HtmlElement) i.next(); - String resourceSourcePath = el.getAttribute("src").equals("") ? el.getAttribute("href") : el - .getAttribute("src"); - if (resourceSourcePath == null || resourceSourcePath.equals("")) - continue; - URL resourceRemoteLink = page.getFullyQualifiedUrl(resourceSourcePath); - String resourceLocalPath = mapLocalUrl(page, resourceRemoteLink, resourceSourcePath, urlMapping); - urlMapping.put(resourceSourcePath, resourceLocalPath); - if (!resourceRemoteLink.toString().endsWith(".css")) { - byte[] image = downloadImage(webClient, window, resourceRemoteLink); - files.put(resourceLocalPath, image); - } else { - String css = downloadCss(webClient, window, resourceRemoteLink); - for (String cssImagePath : getLinksFromCss(css)) { - URL cssImagelink = page.getFullyQualifiedUrl(cssImagePath.replace("\"", "").replace("\'", "") - .replace(" ", "")); - String cssImageLocalPath = mapLocalUrl(page, cssImagelink, cssImagePath, urlMapping); - files.put(cssImageLocalPath, downloadImage(webClient, window, cssImagelink)); - } - files.put(resourceLocalPath, replaceRemoteUrlsWithLocal(css, urlMapping) - .replace("resources/", "./").getBytes()); - } - } catch (Exception e) { - LOGGER.error("Exception in ScreenCaptureHtmlUnitDriver while resultList.iterator ", e); - } - } - String pagesrc = replaceRemoteUrlsWithLocal(page.getWebResponse().getContentAsString(), urlMapping); - files.put("page.html", pagesrc.getBytes()); - webClient.setCurrentWindow(currentWindow); - return createZip(files); - } - - String downloadCss(WebClient webClient, WebWindow window, URL resourceUrl) throws Exception { - if (cssjsCache.get(resourceUrl.toString()) == null) { - cssjsCache.put(resourceUrl.toString(), webClient.getPage(window, new WebRequest(resourceUrl)) - .getWebResponse().getContentAsString()); - - } - return cssjsCache.get(resourceUrl.toString()); - } - - byte[] downloadImage(WebClient webClient, WebWindow window, URL resourceUrl) throws Exception { - if (imagesCache.get(resourceUrl.toString()) == null) { - imagesCache.put( - resourceUrl.toString(), - IOUtils.toByteArray(webClient.getPage(window, new WebRequest(resourceUrl)).getWebResponse() - .getContentAsStream())); - } - return imagesCache.get(resourceUrl.toString()); - } - - public static byte[] createZip(Map files) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ZipOutputStream zipfile = new ZipOutputStream(bos); - Iterator i = files.keySet().iterator(); - String fileName = null; - ZipEntry zipentry = null; - while (i.hasNext()) { - fileName = i.next(); - zipentry = new ZipEntry(fileName); - zipfile.putNextEntry(zipentry); - zipfile.write(files.get(fileName)); - } - zipfile.close(); - return bos.toByteArray(); - } - - List getLinksFromCss(String css) { - List result = new LinkedList<>(); - Matcher m = cssUrlPattern.matcher(css); - while (m.find()) { // find next match - result.add( m.group(2)); - } - return result; - } - - String replaceRemoteUrlsWithLocal(String source, Map replacement) { - for (String object : replacement.keySet()) { - // background:url(http://org.com/images/image.gif) - source = source.replace(object, replacement.get(object)); - } - return source; - } - - String mapLocalUrl(HtmlPage page, URL link, String path, Map replacementToAdd) throws Exception { - String resultingFileName = "resources/" + FilenameUtils.getName(link.getFile()); - replacementToAdd.put(path, resultingFileName); - return resultingFileName; - } - -} \ No newline at end of file diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java deleted file mode 100644 index f8498685580..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin; - - -import com.google.common.base.Function; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.io.FileUtils; -import org.openqa.selenium.*; -import org.openqa.selenium.logging.LogEntries; -import org.openqa.selenium.logging.LogEntry; -import org.openqa.selenium.logging.LogType; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.FluentWait; -import org.openqa.selenium.support.ui.Wait; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.Date; -import java.util.concurrent.TimeUnit; - -abstract public class AbstractZeppelinIT { - protected static WebDriver driver; - - protected final static Logger LOG = LoggerFactory.getLogger(AbstractZeppelinIT.class); - protected static final long MAX_IMPLICIT_WAIT = 30; - protected static final long MAX_BROWSER_TIMEOUT_SEC = 30; - protected static final long MAX_PARAGRAPH_TIMEOUT_SEC = 60; - - protected void setTextOfParagraph(int paragraphNo, String text) { - String editorId = driver.findElement(By.xpath(getParagraphXPath(paragraphNo) + "//div[contains(@class, 'editor')]")).getAttribute("id"); - if (driver instanceof JavascriptExecutor) { - ((JavascriptExecutor) driver).executeScript("ace.edit('" + editorId + "'). setValue('" + text + "')"); - } else { - throw new IllegalStateException("This driver does not support JavaScript!"); - } - } - - protected void runParagraph(int paragraphNo) { - driver.findElement(By.xpath(getParagraphXPath(paragraphNo) + "//span[@class='icon-control-play']")).click(); - } - - - protected String getParagraphXPath(int paragraphNo) { - return "(//div[@ng-controller=\"ParagraphCtrl\"])[" + paragraphNo + "]"; - } - - protected boolean waitForParagraph(final int paragraphNo, final String state) { - By locator = By.xpath(getParagraphXPath(paragraphNo) - + "//div[contains(@class, 'control')]//span[1][contains(.,'" + state + "')]"); - WebElement element = pollingWait(locator, MAX_PARAGRAPH_TIMEOUT_SEC); - return element.isDisplayed(); - } - - protected String getParagraphStatus(final int paragraphNo) { - By locator = By.xpath(getParagraphXPath(paragraphNo) - + "//div[contains(@class, 'control')]//span[1]"); - - return driver.findElement(locator).getText(); - } - - protected boolean waitForText(final String txt, final By locator) { - try { - WebElement element = pollingWait(locator, MAX_BROWSER_TIMEOUT_SEC); - return txt.equals(element.getText()); - } catch (TimeoutException e) { - return false; - } - } - - protected WebElement pollingWait(final By locator, final long timeWait) { - Wait wait = new FluentWait<>(driver) - .withTimeout(timeWait, TimeUnit.SECONDS) - .pollingEvery(1, TimeUnit.SECONDS) - .ignoring(NoSuchElementException.class); - - return wait.until(new Function() { - public WebElement apply(WebDriver driver) { - return driver.findElement(locator); - } - }); - } - - protected static boolean endToEndTestEnabled() { - return null != System.getenv("TEST_SELENIUM"); - } - - protected void createNewNote() { - clickAndWait(By.xpath("//div[contains(@class, \"col-md-4\")]/div/h5/a[contains(.,'Create new" + - " note')]")); - - WebDriverWait block = new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC); - block.until(ExpectedConditions.visibilityOfElementLocated(By.id("noteNameModal"))); - clickAndWait(By.id("createNoteButton")); - block.until(ExpectedConditions.invisibilityOfElementLocated(By.className("pull-right"))); - } - - protected void deleteTestNotebook(final WebDriver driver) { - WebDriverWait block = new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC); - driver.findElement(By.xpath(".//*[@id='main']//button[@ng-click='moveNoteToTrash(note.id)']")) - .sendKeys(Keys.ENTER); - block.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='main']//button[@ng-click='moveNoteToTrash(note.id)']"))); - driver.findElement(By.xpath("//div[@class='modal-dialog'][contains(.,'This note will be moved to trash')]" + - "//div[@class='modal-footer']//button[contains(.,'OK')]")).click(); - ZeppelinITUtils.sleep(100, true); - } - - protected void clickAndWait(final By locator) { - pollingWait(locator, MAX_IMPLICIT_WAIT).click(); - ZeppelinITUtils.sleep(1000, true); - } - - protected void handleException(String message, Exception e) throws Exception { - LOG.error(message, e); - LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER); - for (LogEntry entry : logEntries) { - LOG.error(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage()); - } - File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); - LOG.error("ScreenShot::\ndata:image/png;base64," + new String(Base64.encodeBase64(FileUtils.readFileToByteArray(scrFile)))); - throw e; - } - -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/CommandExecutor.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/CommandExecutor.java deleted file mode 100644 index 9ac222a0848..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/CommandExecutor.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class CommandExecutor { - - public final static Logger LOG = LoggerFactory.getLogger(CommandExecutor.class); - - public enum IGNORE_ERRORS { - TRUE, - FALSE - } - - public static int NORMAL_EXIT = 0; - - private static IGNORE_ERRORS DEFAULT_BEHAVIOUR_ON_ERRORS = IGNORE_ERRORS.TRUE; - - public static Object executeCommandLocalHost(String[] command, boolean printToConsole, ProcessData.Types_Of_Data type, IGNORE_ERRORS ignore_errors) { - List subCommandsAsList = new ArrayList<>(Arrays.asList(command)); - String mergedCommand = StringUtils.join(subCommandsAsList, " "); - - LOG.info("Sending cmdlet \"" + mergedCommand + "\" to localhost"); - - ProcessBuilder processBuilder = new ProcessBuilder(command); - Process process = null; - try { - process = processBuilder.start(); - } catch (IOException e) { - throw new RuntimeException(e); - } - - ProcessData data_of_process = new ProcessData(process, printToConsole); - Object output_of_process = data_of_process.getData(type); - int exit_code = data_of_process.getExitCodeValue(); - - if (!printToConsole) - LOG.trace(output_of_process.toString()); - else - LOG.debug(output_of_process.toString()); - if (ignore_errors == IGNORE_ERRORS.FALSE && exit_code != NORMAL_EXIT) { - LOG.error(String.format("*********************Command '%s' failed with exitcode %s *********************", mergedCommand, exit_code)); - } - return output_of_process; - } - - public static Object executeCommandLocalHost(String command, boolean printToConsole, ProcessData.Types_Of_Data type) { - return executeCommandLocalHost(new String[]{"bash", "-c", command}, printToConsole, type, DEFAULT_BEHAVIOUR_ON_ERRORS); - } - -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/ProcessData.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/ProcessData.java deleted file mode 100644 index 39e40747657..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/ProcessData.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin; - - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.*; -import java.util.concurrent.TimeUnit; - -public class ProcessData { - public enum Types_Of_Data { - OUTPUT, - ERROR, - EXIT_CODE, - STREAMS_MERGED, - PROCESS_DATA_OBJECT - } - - public final static Logger LOG = LoggerFactory.getLogger(ProcessData.class); - - private Process checked_process; - private boolean printToConsole = false; - private boolean removeRedundantOutput = true; - - public ProcessData(Process connected_process, boolean printToConsole, int silenceTimeout, TimeUnit timeUnit) { - this.checked_process = connected_process; - this.printToConsole = printToConsole; - this.silenceTimeout = TimeUnit.MILLISECONDS.convert(silenceTimeout, timeUnit); - } - - public ProcessData(Process connected_process, boolean printToConsole, int silenceTimeoutSec) { - this.checked_process = connected_process; - this.printToConsole = printToConsole; - this.silenceTimeout = TimeUnit.MILLISECONDS.convert(silenceTimeoutSec, TimeUnit.SECONDS); - } - - public ProcessData(Process connected_process, boolean printToConsole) { - this.checked_process = connected_process; - this.printToConsole = printToConsole; - } - - public ProcessData(Process connected_process) { - this.checked_process = connected_process; - this.printToConsole = true; - } - - - boolean returnCodeRetrieved = false; - - private String outPutStream = null; - private String errorStream = null; - private int returnCode; - private long silenceTimeout = 10 * 60 * 1000; - private final long unconditionalExitDelayMinutes = 30; - - public static boolean isRunning(Process process) { - try { - process.exitValue(); - return false; - } catch (IllegalThreadStateException e) { - return true; - } - } - - public Object getData(Types_Of_Data type) { - //TODO get rid of Pseudo-terminal will not be allocated because stdin is not a terminal. - switch (type) { - case OUTPUT: { - return this.getOutPutStream(); - } - case ERROR: { - return this.getErrorStream(); - } - case EXIT_CODE: { - return this.getExitCodeValue(); - } - case STREAMS_MERGED: { - return this.getOutPutStream() + "\n" + this.getErrorStream(); - } - case PROCESS_DATA_OBJECT: { - this.getErrorStream(); - return this; - } - default: { - throw new IllegalArgumentException("Data Type " + type + " not supported yet!"); - } - } - } - - public int getExitCodeValue() { - try { - if (!returnCodeRetrieved) { - this.checked_process.waitFor(); - this.returnCode = this.checked_process.exitValue(); - this.returnCodeRetrieved = true; - this.checked_process.destroy(); - } - } catch (Exception inter) { - throw new RuntimeException("Couldn't finish waiting for process " + this.checked_process + " termination", inter); - } - return this.returnCode; - } - - public String getOutPutStream() { - if (this.outPutStream == null) { - try { - buildOutputAndErrorStreamData(); - } catch (Exception e) { - throw new RuntimeException("Couldn't retrieve Output Stream data from process: " + this.checked_process.toString(), e); - - } - } - this.outPutStream = this.outPutStream.replace("Pseudo-terminal will not be allocated because stdin is not a terminal.", ""); - this.errorStream = this.errorStream.replace("Pseudo-terminal will not be allocated because stdin is not a terminal.", ""); - return this.outPutStream; - } - - public String getErrorStream() { - if (this.errorStream == null) { - try { - buildOutputAndErrorStreamData(); - } catch (Exception e) { - throw new RuntimeException("Couldn't retrieve Error Stream data from process: " + this.checked_process.toString(), e); - - } - } - this.outPutStream = this.outPutStream.replace("Pseudo-terminal will not be allocated because stdin is not a terminal.", ""); - this.errorStream = this.errorStream.replace("Pseudo-terminal will not be allocated because stdin is not a terminal.", ""); - return this.errorStream; - } - - public String toString() { - StringBuilder result = new StringBuilder(); - result.append(String.format("[OUTPUT STREAM]\n%s\n", this.outPutStream)); - result.append(String.format("[ERROR STREAM]\n%s\n", this.errorStream)); - result.append(String.format("[EXIT CODE]\n%d", this.returnCode)); - return result.toString(); - } - - private void buildOutputAndErrorStreamData() throws IOException { - StringBuilder sbInStream = new StringBuilder(); - StringBuilder sbErrorStream = new StringBuilder(); - - try { - InputStream in = this.checked_process.getInputStream(); - InputStream inErrors = this.checked_process.getErrorStream(); - BufferedReader inReader = new BufferedReader(new InputStreamReader(in)); - BufferedReader inReaderErrors = new BufferedReader(new InputStreamReader(inErrors)); - LOG.trace("Started retrieving data from streams of attached process: " + this.checked_process); - - long lastStreamDataTime = System.currentTimeMillis(); //Store start time to be able to finish method if cmdlet hangs - long unconditionalExitTime = System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(unconditionalExitDelayMinutes, TimeUnit.MINUTES); // Stop after 'unconditionalExitDelayMinutes' even if process is alive and sending output - final int BUFFER_LEN = 300; - char charBuffer[] = new char[BUFFER_LEN]; //Use char buffer to read output, size can be tuned. - boolean outputProduced = true; //Flag to check if previous iteration produced any output - while (isRunning(this.checked_process) || outputProduced) { //Continue if process is alive or some output was produced on previous iteration and there may be still some data to read. - outputProduced = false; - ZeppelinITUtils.sleep(100, false); //Some local commands can exit fast, but immediate stream reading will give no output and after iteration, 'while' condition will be false so we will not read out any output while it is still there, just need to wait for some time for it to appear in streams. - - StringBuilder tempSB = new StringBuilder(); - while (inReader.ready()) { - tempSB.setLength(0); // clean temporary StringBuilder - int readCount = inReader.read(charBuffer, 0, BUFFER_LEN); //read up to 'BUFFER_LEN' chars to buffer - if (readCount < 1) { // if nothing read or error occurred - break; - } - tempSB.append(charBuffer, 0, readCount); - - sbInStream.append(tempSB); - if (tempSB.length() > 0) { - outputProduced = true; //set flag to know that we read something and there may be moire data, even if process already exited - } - - lastStreamDataTime = System.currentTimeMillis(); //remember last time data was read from streams to be sure we are not looping infinitely - } - - tempSB = new StringBuilder(); //Same, but for error stream - while (inReaderErrors.ready()) { - tempSB.setLength(0); - int readCount = inReaderErrors.read(charBuffer, 0, BUFFER_LEN); - if (readCount < 1) { - break; - } - tempSB.append(charBuffer, 0, readCount); - sbErrorStream.append(tempSB); - if (tempSB.length() > 0) { - outputProduced = true; - String temp = new String(tempSB); - temp = temp.replaceAll("Pseudo-terminal will not be allocated because stdin is not a terminal.", ""); - //TODO : error stream output need to be improved, because it outputs downloading information. - if (printToConsole) { - if (!temp.trim().equals("")) { - if (temp.toLowerCase().contains("error") || temp.toLowerCase().contains("failed")) { - LOG.warn(temp.trim()); - } else { - LOG.debug(temp.trim()); - } - } - } - } - lastStreamDataTime = System.currentTimeMillis(); - } - - - if ((System.currentTimeMillis() - lastStreamDataTime > silenceTimeout) || //Exit if silenceTimeout ms has passed from last stream read. Means process is alive but not sending any data. - (System.currentTimeMillis() > unconditionalExitTime)) { //Exit unconditionally - guards against alive process continuously sending data. - LOG.info("Conditions: " + (System.currentTimeMillis() - lastStreamDataTime > silenceTimeout) + " " + - (System.currentTimeMillis() > unconditionalExitTime)); - this.checked_process.destroy(); - try { - if ((System.currentTimeMillis() > unconditionalExitTime)) - LOG.error("!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Unconditional exit occured@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@!\nsome process hag up for more than " + unconditionalExitDelayMinutes + " minutes."); - LOG.error("!##################################!"); - StringWriter sw = new StringWriter(); - new Exception("Exited from buildOutputAndErrorStreamData by timeout").printStackTrace(new PrintWriter(sw)); //Get stack trace - String exceptionAsString = sw.toString(); - LOG.error(exceptionAsString); - } catch (Exception ignore) { - LOG.info("Exception in ProcessData while buildOutputAndErrorStreamData ", ignore); - } - break; - } - } - - in.close(); - inErrors.close(); - } finally { - this.outPutStream = sbInStream.toString(); - this.errorStream = sbErrorStream.toString(); - } - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/WebDriverManager.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/WebDriverManager.java deleted file mode 100644 index da34e7299a6..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/WebDriverManager.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin; - -import org.apache.commons.io.FileUtils; -import org.openqa.selenium.By; -import org.openqa.selenium.TimeoutException; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.chrome.ChromeDriver; -import org.openqa.selenium.firefox.FirefoxBinary; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.FirefoxProfile; -import org.openqa.selenium.safari.SafariDriver; -import org.openqa.selenium.support.ui.ExpectedCondition; -import org.openqa.selenium.support.ui.WebDriverWait; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.util.concurrent.TimeUnit; - -import static org.junit.Assert.fail; - - -public class WebDriverManager { - - public final static Logger LOG = LoggerFactory.getLogger(WebDriverManager.class); - - private static String downLoadsDir = ""; - - public static WebDriver getWebDriver() { - WebDriver driver = null; - - if (driver == null) { - try { - FirefoxBinary ffox = new FirefoxBinary(); - if ("true".equals(System.getenv("TRAVIS"))) { - ffox.setEnvironmentProperty("DISPLAY", ":99"); // xvfb is supposed to - // run with DISPLAY 99 - } - int firefoxVersion = WebDriverManager.getFirefoxVersion(); - LOG.info("Firefox version " + firefoxVersion + " detected"); - - downLoadsDir = FileUtils.getTempDirectory().toString(); - - String tempPath = downLoadsDir + "/firebug/"; - - downloadFireBug(firefoxVersion, tempPath); - - final String firebugPath = tempPath + "firebug.xpi"; - final String firepathPath = tempPath + "firepath.xpi"; - - FirefoxProfile profile = new FirefoxProfile(); - profile.setPreference("browser.download.folderList", 2); - profile.setPreference("browser.download.dir", downLoadsDir); - profile.setPreference("browser.helperApps.alwaysAsk.force", false); - profile.setPreference("browser.download.manager.showWhenStarting", false); - profile.setPreference("browser.download.manager.showAlertOnComplete", false); - profile.setPreference("browser.download.manager.closeWhenDone", true); - profile.setPreference("app.update.auto", false); - profile.setPreference("app.update.enabled", false); - profile.setPreference("dom.max_script_run_time", 0); - profile.setPreference("dom.max_chrome_script_run_time", 0); - profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/x-ustar,application/octet-stream,application/zip,text/csv,text/plain"); - profile.setPreference("network.proxy.type", 0); - - profile.addExtension(new File(firebugPath)); - profile.addExtension(new File(firepathPath)); - - driver = new FirefoxDriver(ffox, profile); - } catch (Exception e) { - LOG.error("Exception in WebDriverManager while FireFox Driver ", e); - } - } - - if (driver == null) { - try { - driver = new ChromeDriver(); - } catch (Exception e) { - LOG.error("Exception in WebDriverManager while ChromeDriver ", e); - } - } - - if (driver == null) { - try { - driver = new SafariDriver(); - } catch (Exception e) { - LOG.error("Exception in WebDriverManager while SafariDriver ", e); - } - } - - String url; - if (System.getenv("url") != null) { - url = System.getenv("url"); - } else { - url = "http://localhost:8080"; - } - - long start = System.currentTimeMillis(); - boolean loaded = false; - driver.manage().timeouts().implicitlyWait(AbstractZeppelinIT.MAX_IMPLICIT_WAIT, - TimeUnit.SECONDS); - driver.get(url); - - while (System.currentTimeMillis() - start < 60 * 1000) { - // wait for page load - try { - (new WebDriverWait(driver, 30)).until(new ExpectedCondition() { - @Override - public Boolean apply(WebDriver d) { - return d.findElement(By.xpath("//i[@uib-tooltip='WebSocket Connected']")) - .isDisplayed(); - } - }); - loaded = true; - break; - } catch (TimeoutException e) { - LOG.info("Exception in WebDriverManager while WebDriverWait ", e); - driver.navigate().to(url); - } - } - - if (loaded == false) { - fail(); - } - - return driver; - } - - private static void downloadFireBug(int firefoxVersion, String tempPath) { - String firebugUrlString = null; - if (firefoxVersion < 23) - firebugUrlString = "http://getfirebug.com/releases/firebug/1.11/firebug-1.11.4.xpi"; - else if (firefoxVersion >= 23 && firefoxVersion < 30) - firebugUrlString = "http://getfirebug.com/releases/firebug/1.12/firebug-1.12.8.xpi"; - else if (firefoxVersion >= 30 && firefoxVersion < 33) - firebugUrlString = "http://getfirebug.com/releases/firebug/2.0/firebug-2.0.7.xpi"; - else if (firefoxVersion >= 33) - firebugUrlString = "http://getfirebug.com/releases/firebug/2.0/firebug-2.0.17.xpi"; - - - LOG.info("firebug version: " + firefoxVersion + ", will be downloaded to " + tempPath); - try { - File firebugFile = new File(tempPath + "firebug.xpi"); - URL firebugUrl = new URL(firebugUrlString); - if (!firebugFile.exists()) { - FileUtils.copyURLToFile(firebugUrl, firebugFile); - } - - - File firepathFile = new File(tempPath + "firepath.xpi"); - URL firepathUrl = new URL("https://addons.cdn.mozilla.net/user-media/addons/11900/firepath-0.9.7.1-fx.xpi"); - if (!firepathFile.exists()) { - FileUtils.copyURLToFile(firepathUrl, firepathFile); - } - - } catch (IOException e) { - LOG.error("Download of firebug version: " + firefoxVersion + ", falied in path " + tempPath); - } - LOG.info("Download of firebug version: " + firefoxVersion + ", successful"); - } - - public static int getFirefoxVersion() { - try { - String firefoxVersionCmd = "firefox -v"; - if (System.getProperty("os.name").startsWith("Mac OS")) { - firefoxVersionCmd = "/Applications/Firefox.app/Contents/MacOS/" + firefoxVersionCmd; - } - String versionString = (String) CommandExecutor.executeCommandLocalHost(firefoxVersionCmd, false, ProcessData.Types_Of_Data.OUTPUT); - return Integer.valueOf(versionString.replaceAll("Mozilla Firefox", "").trim().substring(0, 2)); - } catch (Exception e) { - LOG.error("Exception in WebDriverManager while getWebDriver ", e); - return -1; - } - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinITUtils.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinITUtils.java deleted file mode 100644 index 402a18d4270..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinITUtils.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin; - - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.openqa.selenium.WebDriver; -import java.util.concurrent.TimeUnit; - -public class ZeppelinITUtils { - - public final static Logger LOG = LoggerFactory.getLogger(ZeppelinITUtils.class); - - public static void sleep(long millis, boolean logOutput) { - if (logOutput) { - LOG.info("Starting sleeping for " + (millis / 1000) + " seconds..."); - LOG.info("Caller: " + Thread.currentThread().getStackTrace()[2]); - } - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - LOG.error("Exception in WebDriverManager while getWebDriver ", e); - } - if (logOutput) { - LOG.info("Finished."); - } - } - - public static void restartZeppelin() { - CommandExecutor.executeCommandLocalHost("../bin/zeppelin-daemon.sh restart", - false, ProcessData.Types_Of_Data.OUTPUT); - //wait for server to start. - sleep(5000, false); - } - - public static void turnOffImplicitWaits(WebDriver driver) { - driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); - } - - public static void turnOnImplicitWaits(WebDriver driver) { - driver.manage().timeouts().implicitlyWait(AbstractZeppelinIT.MAX_IMPLICIT_WAIT, - TimeUnit.SECONDS); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java deleted file mode 100644 index 9abbe28525f..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zeppelin.integration; - -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.zeppelin.AbstractZeppelinIT; -import org.apache.zeppelin.WebDriverManager; -import org.apache.zeppelin.ZeppelinITUtils; -import org.apache.zeppelin.conf.ZeppelinConfiguration; -import org.hamcrest.CoreMatchers; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ErrorCollector; -import org.openqa.selenium.By; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * Created for org.apache.zeppelin.integration on 13/06/16. - */ -public class AuthenticationIT extends AbstractZeppelinIT { - private static final Logger LOG = LoggerFactory.getLogger(AuthenticationIT.class); - - @Rule - public ErrorCollector collector = new ErrorCollector(); - static String shiroPath; - static String authShiro = "[users]\n" + - "admin = password1, admin\n" + - "finance1 = finance1, finance\n" + - "finance2 = finance2, finance\n" + - "hr1 = hr1, hr\n" + - "hr2 = hr2, hr\n" + - "[main]\n" + - "sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager\n" + - "securityManager.sessionManager = $sessionManager\n" + - "securityManager.sessionManager.globalSessionTimeout = 86400000\n" + - "shiro.loginUrl = /api/login\n" + - "[roles]\n" + - "admin = *\n" + - "hr = *\n" + - "finance = *\n" + - "[urls]\n" + - "/api/version = anon\n" + - "/** = authc"; - - static String originalShiro = ""; - - - @BeforeClass - public static void startUp() { - if (!endToEndTestEnabled()) { - return; - } - - try { - System.setProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_HOME.getVarName(), "../"); - ZeppelinConfiguration conf = ZeppelinConfiguration.create(); - shiroPath = conf.getRelativeDir(String.format("%s/shiro.ini", conf.getConfDir())); - File file = new File(shiroPath); - if (file.exists()) { - originalShiro = StringUtils.join(FileUtils.readLines(file, "UTF-8"), "\n"); - } - FileUtils.write(file, authShiro, "UTF-8"); - } catch (IOException e) { - LOG.error("Error in AuthenticationIT startUp::", e); - } - ZeppelinITUtils.restartZeppelin(); - driver = WebDriverManager.getWebDriver(); - } - - - @AfterClass - public static void tearDown() { - if (!endToEndTestEnabled()) { - return; - } - try { - if (!StringUtils.isBlank(shiroPath)) { - File file = new File(shiroPath); - if (StringUtils.isBlank(originalShiro)) { - FileUtils.deleteQuietly(file); - } else { - FileUtils.write(file, originalShiro, "UTF-8"); - } - } - } catch (IOException e) { - LOG.error("Error in AuthenticationIT tearDown::", e); - } - ZeppelinITUtils.restartZeppelin(); - driver.quit(); - } - - private void authenticationUser(String userName, String password) { - pollingWait(By.xpath( - "//div[contains(@class, 'navbar-collapse')]//li//button[contains(.,'Login')]"), - MAX_BROWSER_TIMEOUT_SEC).click(); - ZeppelinITUtils.sleep(1000, false); - pollingWait(By.xpath("//*[@id='userName']"), MAX_BROWSER_TIMEOUT_SEC).sendKeys(userName); - pollingWait(By.xpath("//*[@id='password']"), MAX_BROWSER_TIMEOUT_SEC).sendKeys(password); - pollingWait(By.xpath("//*[@id='NoteImportCtrl']//button[contains(.,'Login')]"), - MAX_BROWSER_TIMEOUT_SEC).click(); - ZeppelinITUtils.sleep(1000, false); - } - - private void testShowNotebookListOnNavbar() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - pollingWait(By.xpath("//li[@class='dropdown notebook-list-dropdown']"), - MAX_BROWSER_TIMEOUT_SEC).click(); - assertTrue(driver.findElements(By.xpath("//a[@class=\"notebook-list-item ng-scope\"]")).size() > 0); - pollingWait(By.xpath("//li[@class='dropdown notebook-list-dropdown']"), - MAX_BROWSER_TIMEOUT_SEC).click(); - pollingWait(By.xpath("//li[@class='dropdown notebook-list-dropdown']"), - MAX_BROWSER_TIMEOUT_SEC).click(); - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testShowNotebookListOnNavbar ", e); - } - } - - private void logoutUser(String userName) throws URISyntaxException { - ZeppelinITUtils.sleep(500, false); - driver.findElement(By.xpath("//div[contains(@class, 'navbar-collapse')]//li[contains(.,'" + - userName + "')]")).click(); - ZeppelinITUtils.sleep(500, false); - driver.findElement(By.xpath("//div[contains(@class, 'navbar-collapse')]//li[contains(.,'" + - userName + "')]//a[@ng-click='navbar.logout()']")).click(); - ZeppelinITUtils.sleep(2000, false); - if (driver.findElement(By.xpath("//*[@id='loginModal']//div[contains(@class, 'modal-header')]/button")) - .isDisplayed()) { - driver.findElement(By.xpath("//*[@id='loginModal']//div[contains(@class, 'modal-header')]/button")).click(); - } - driver.get(new URI(driver.getCurrentUrl()).resolve("/#/").toString()); - ZeppelinITUtils.sleep(500, false); - } - - // @Test - public void testSimpleAuthentication() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - AuthenticationIT authenticationIT = new AuthenticationIT(); - authenticationIT.authenticationUser("admin", "password1"); - - collector.checkThat("Check is user logged in", true, - CoreMatchers.equalTo(driver.findElement(By.partialLinkText("Create new note")) - .isDisplayed())); - - authenticationIT.logoutUser("admin"); - } catch (Exception e) { - handleException("Exception in AuthenticationIT while testCreateNewButton ", e); - } - } - - @Test - public void testGroupPermission() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - AuthenticationIT authenticationIT = new AuthenticationIT(); - authenticationIT.authenticationUser("finance1", "finance1"); - createNewNote(); - - String noteId = driver.getCurrentUrl().substring(driver.getCurrentUrl().lastIndexOf("/") + 1); - - pollingWait(By.xpath("//span[@uib-tooltip='Note permissions']"), - MAX_BROWSER_TIMEOUT_SEC).click(); - pollingWait(By.xpath(".//*[@id='selectOwners']/following::span//input"), - MAX_BROWSER_TIMEOUT_SEC).sendKeys("finance "); - pollingWait(By.xpath(".//*[@id='selectReaders']/following::span//input"), - MAX_BROWSER_TIMEOUT_SEC).sendKeys("finance "); - pollingWait(By.xpath(".//*[@id='selectWriters']/following::span//input"), - MAX_BROWSER_TIMEOUT_SEC).sendKeys("finance "); - pollingWait(By.xpath("//button[@ng-click='savePermissions()']"), MAX_BROWSER_TIMEOUT_SEC) - .sendKeys(Keys.ENTER); - - pollingWait(By.xpath("//div[@class='modal-dialog'][contains(.,'Permissions Saved ')]" + - "//div[@class='modal-footer']//button[contains(.,'OK')]"), - MAX_BROWSER_TIMEOUT_SEC).click(); - authenticationIT.logoutUser("finance1"); - - authenticationIT.authenticationUser("hr1", "hr1"); - try { - WebElement element = pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + noteId + "')]"), - MAX_BROWSER_TIMEOUT_SEC); - collector.checkThat("Check is user has permission to view this note link", false, - CoreMatchers.equalTo(element.isDisplayed())); - } catch (Exception e) { - //This should have failed, nothing to worry. - } - - driver.get(new URI(driver.getCurrentUrl()).resolve("/#/notebook/" + noteId).toString()); - - List privilegesModal = driver.findElements( - By.xpath("//div[@class='modal-content']//div[@class='bootstrap-dialog-header']" + - "//div[contains(.,'Insufficient privileges')]")); - collector.checkThat("Check is user has permission to view this note", 1, - CoreMatchers.equalTo(privilegesModal.size())); - driver.findElement( - By.xpath("//div[@class='modal-content'][contains(.,'Insufficient privileges')]" + - "//div[@class='modal-footer']//button[2]")).click(); - authenticationIT.logoutUser("hr1"); - - authenticationIT.authenticationUser("finance2", "finance2"); - try { - WebElement element = pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + noteId + "')]"), - MAX_BROWSER_TIMEOUT_SEC); - collector.checkThat("Check is user has permission to view this note link", true, - CoreMatchers.equalTo(element.isDisplayed())); - } catch (Exception e) { - //This should have failed, nothing to worry. - } - - driver.get(new URI(driver.getCurrentUrl()).resolve("/#/notebook/" + noteId).toString()); - - privilegesModal = driver.findElements( - By.xpath("//div[@class='modal-content']//div[@class='bootstrap-dialog-header']" + - "//div[contains(.,'Insufficient privileges')]")); - collector.checkThat("Check is user has permission to view this note", 0, - CoreMatchers.equalTo(privilegesModal.size())); - deleteTestNotebook(driver); - authenticationIT.logoutUser("finance2"); - - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testGroupPermission ", e); - } - } - -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/InterpreterIT.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/InterpreterIT.java deleted file mode 100644 index 9587cd689d0..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/InterpreterIT.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.integration; - -import org.apache.zeppelin.AbstractZeppelinIT; -import org.apache.zeppelin.WebDriverManager; -import org.hamcrest.CoreMatchers; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ErrorCollector; -import org.openqa.selenium.By; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.ui.Select; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class InterpreterIT extends AbstractZeppelinIT { - private static final Logger LOG = LoggerFactory.getLogger(InterpreterIT.class); - - @Rule - public ErrorCollector collector = new ErrorCollector(); - - @Before - public void startUp() { - if (!endToEndTestEnabled()) { - return; - } - driver = WebDriverManager.getWebDriver(); - } - - @After - public void tearDown() { - if (!endToEndTestEnabled()) { - return; - } - driver.quit(); - } - - @Test - public void testShowDescriptionOnInterpreterCreate() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - // navigate to interpreter page - WebElement settingButton = driver.findElement(By.xpath("//button[@class='nav-btn dropdown-toggle ng-scope']")); - settingButton.click(); - WebElement interpreterLink = driver.findElement(By.xpath("//a[@href='#/interpreter']")); - interpreterLink.click(); - - WebElement createButton = driver.findElement(By.xpath("//button[contains(., 'Create')]")); - createButton.click(); - - Select select = new Select(driver.findElement(By.xpath("//select[@ng-change='newInterpreterGroupChange()']"))); - select.selectByVisibleText("spark"); - - collector.checkThat("description of interpreter property is displayed", - driver.findElement(By.xpath("//tr/td[contains(text(), 'spark.app.name')]/following-sibling::td[2]")).getText(), - CoreMatchers.equalTo("The name of spark application.")); - - } catch (Exception e) { - handleException("Exception in InterpreterIT while testShowDescriptionOnInterpreterCreate ", e); - } - } -} \ No newline at end of file diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java deleted file mode 100644 index ca1da0ffa3e..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java +++ /dev/null @@ -1,702 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.integration; - - -import org.apache.commons.lang.StringUtils; -import org.apache.zeppelin.AbstractZeppelinIT; -import org.apache.zeppelin.WebDriverManager; -import org.apache.zeppelin.ZeppelinITUtils; -import org.hamcrest.CoreMatchers; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ErrorCollector; -import org.openqa.selenium.By; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; -import org.openqa.selenium.support.ui.Select; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ParagraphActionsIT extends AbstractZeppelinIT { - private static final Logger LOG = LoggerFactory.getLogger(ParagraphActionsIT.class); - - - @Rule - public ErrorCollector collector = new ErrorCollector(); - - @Before - public void startUp() { - if (!endToEndTestEnabled()) { - return; - } - driver = WebDriverManager.getWebDriver(); - } - - @After - public void tearDown() { - if (!endToEndTestEnabled()) { - return; - } - - driver.quit(); - } - - @Test - public void testCreateNewButton() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - Actions action = new Actions(driver); - waitForParagraph(1, "READY"); - Integer oldNosOfParas = driver.findElements(By.xpath("//div[@ng-controller=\"ParagraphCtrl\"]")).size(); - collector.checkThat("Before Insert New : the number of paragraph ", - oldNosOfParas, - CoreMatchers.equalTo(1)); - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - driver.findElement(By.xpath(getParagraphXPath(1) + "//ul/li/a[@ng-click=\"insertNew('below')\"]")).click(); - waitForParagraph(2, "READY"); - Integer newNosOfParas = driver.findElements(By.xpath("//div[@ng-controller=\"ParagraphCtrl\"]")).size(); - collector.checkThat("After Insert New (using Insert New button) : number of paragraph", - oldNosOfParas + 1, - CoreMatchers.equalTo(newNosOfParas)); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - driver.findElement(By.xpath(getParagraphXPath(1) + "//ul/li/a[@ng-click='removeParagraph(paragraph)']")).click(); - ZeppelinITUtils.sleep(1000, false); - driver.findElement(By.xpath("//div[@class='modal-dialog'][contains(.,'delete this paragraph')]" + - "//div[@class='modal-footer']//button[contains(.,'OK')]")).click(); - ZeppelinITUtils.sleep(1000, false); - - setTextOfParagraph(1, " original paragraph "); - - WebElement newPara = driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class,'new-paragraph')][1]")); - action.moveToElement(newPara).click().build().perform(); - ZeppelinITUtils.sleep(1000, false); - waitForParagraph(1, "READY"); - - collector.checkThat("Paragraph is created above", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo(StringUtils.EMPTY)); - setTextOfParagraph(1, " this is above "); - - newPara = driver.findElement(By.xpath(getParagraphXPath(2) + "//div[contains(@class,'new-paragraph')][2]")); - action.moveToElement(newPara).click().build().perform(); - - waitForParagraph(3, "READY"); - - collector.checkThat("Paragraph is created below", - driver.findElement(By.xpath(getParagraphXPath(3) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo(StringUtils.EMPTY)); - setTextOfParagraph(3, " this is below "); - - collector.checkThat("The output field of paragraph1 contains", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo(" this is above ")); - collector.checkThat("The output field paragraph2 contains", - driver.findElement(By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo(" original paragraph ")); - collector.checkThat("The output field paragraph3 contains", - driver.findElement(By.xpath(getParagraphXPath(3) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo(" this is below ")); - collector.checkThat("The current number of paragraphs after creating paragraph above and below", - driver.findElements(By.xpath("//div[@ng-controller=\"ParagraphCtrl\"]")).size(), - CoreMatchers.equalTo(3)); - - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testCreateNewButton ", e); - } - - } - - @Test - public void testRemoveButton() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - waitForParagraph(1, "READY"); - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - driver.findElement(By.xpath(getParagraphXPath(1) + "//ul/li/a[@ng-click=\"insertNew('below')\"]")) - .click(); - waitForParagraph(2, "READY"); - Integer oldNosOfParas = driver.findElements(By.xpath - ("//div[@ng-controller=\"ParagraphCtrl\"]")).size(); - collector.checkThat("Before Remove : Number of paragraphs are ", - oldNosOfParas, - CoreMatchers.equalTo(2)); - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - - clickAndWait(By.xpath(getParagraphXPath(1) + "//ul/li/a[@ng-click='removeParagraph(paragraph)']")); - - clickAndWait(By.xpath("//div[@class='modal-dialog'][contains(.,'delete this paragraph')" + - "]//div[@class='modal-footer']//button[contains(.,'OK')]")); - - Integer newNosOfParas = driver.findElements(By.xpath - ("//div[@ng-controller=\"ParagraphCtrl\"]")).size(); - collector.checkThat("After Remove : Number of paragraphs are", - newNosOfParas, - CoreMatchers.equalTo(oldNosOfParas - 1)); - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testRemoveButton ", e); - } - } - - @Test - public void testMoveUpAndDown() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - waitForParagraph(1, "READY"); - setTextOfParagraph(1, "1"); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - driver.findElement(By.xpath(getParagraphXPath(1) + "//ul/li/a[@ng-click=\"insertNew('below')\"]")).click(); - - - waitForParagraph(2, "READY"); - setTextOfParagraph(2, "2"); - - - collector.checkThat("The paragraph1 value contains", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo("1")); - collector.checkThat("The paragraph1 value contains", - driver.findElement(By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo("2")); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - clickAndWait(By.xpath(getParagraphXPath(1) + "//ul/li/a[@ng-click='moveDown(paragraph)']")); - - collector.checkThat("The paragraph1 value contains", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo("2")); - collector.checkThat("The paragraph1 value contains", - driver.findElement(By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo("1")); - - driver.findElement(By.xpath(getParagraphXPath(2) + "//span[@class='icon-settings']")).click(); - clickAndWait(By.xpath(getParagraphXPath(2) + "//ul/li/a[@ng-click='moveUp(paragraph)']")); - - collector.checkThat("The paragraph1 value contains", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo("1")); - collector.checkThat("The paragraph1 value contains", - driver.findElement(By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'editor')]")).getText(), - CoreMatchers.equalTo("2")); - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testMoveUpAndDown ", e); - } - - } - - @Test - public void testDisableParagraphRunButton() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - waitForParagraph(1, "READY"); - setTextOfParagraph(1, "println (\"abcd\")"); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - clickAndWait(By.xpath(getParagraphXPath(1) + "//ul/li/a[@ng-click='toggleEnableDisable(paragraph)']")); - collector.checkThat("The play button class was ", - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-control-play shortcut-icon']")).isDisplayed(), CoreMatchers.equalTo(false) - ); - - driver.findElement(By.xpath(".//*[@id='main']//button[contains(@ng-click, 'runAllParagraphs')]")).sendKeys(Keys.ENTER); - ZeppelinITUtils.sleep(1000, true); - driver.findElement(By.xpath("//div[@class='modal-dialog'][contains(.,'Run all paragraphs?')]" + - "//div[@class='modal-footer']//button[contains(.,'OK')]")).click(); - ZeppelinITUtils.sleep(2000, false); - - collector.checkThat("Paragraph status is ", - getParagraphStatus(1), CoreMatchers.equalTo("READY") - ); - - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testDisableParagraphRunButton ", e); - } - - } - - @Test - public void testRunOnSelectionChange() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - String xpathToRunOnSelectionChangeCheckbox = getParagraphXPath(1) + "//ul/li/form/input[contains(@ng-checked, 'true')]"; - String xpathToDropdownMenu = getParagraphXPath(1) + "//select"; - String xpathToResultText = getParagraphXPath(1) + "//div[contains(@id,\"_html\")]"; - - createNewNote(); - - waitForParagraph(1, "READY"); - setTextOfParagraph(1, "%md My selection is ${my selection=1,1|2|3}"); - runParagraph(1); - waitForParagraph(1, "FINISHED"); - - // 1. 'RunOnSelectionChange' is true by default - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - collector.checkThat("'Run on selection change' checkbox will be shown under dropdown menu ", - driver.findElement(By.xpath(getParagraphXPath(1) + "//ul/li/form/input[contains(@ng-click, 'turnOnAutoRun(paragraph)')]")).isDisplayed(), - CoreMatchers.equalTo(true)); - - Select dropDownMenu = new Select(driver.findElement(By.xpath((xpathToDropdownMenu)))); - dropDownMenu.selectByVisibleText("2"); - waitForParagraph(1, "FINISHED"); - collector.checkThat("If 'RunOnSelectionChange' is true, the paragraph result will be updated right after click any options in the dropdown menu ", - driver.findElement(By.xpath(xpathToResultText)).getText(), - CoreMatchers.equalTo("My selection is 2")); - - // 2. set 'RunOnSelectionChange' to false - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - driver.findElement(By.xpath(xpathToRunOnSelectionChangeCheckbox)).click(); - collector.checkThat("If 'Run on selection change' checkbox is unchecked, 'paragraph.config.runOnSelectionChange' will be false ", - driver.findElement(By.xpath(getParagraphXPath(1) + "//ul/li/span[contains(@ng-if, 'paragraph.config.runOnSelectionChange == false')]")).isDisplayed(), - CoreMatchers.equalTo(true)); - - Select sameDropDownMenu = new Select(driver.findElement(By.xpath((xpathToDropdownMenu)))); - sameDropDownMenu.selectByVisibleText("1"); - waitForParagraph(1, "FINISHED"); - collector.checkThat("If 'RunOnSelectionChange' is false, the paragraph result won't be updated even if we select any options in the dropdown menu ", - driver.findElement(By.xpath(xpathToResultText)).getText(), - CoreMatchers.equalTo("My selection is 2")); - - // run paragraph manually by pressing ENTER - driver.findElement(By.xpath(xpathToDropdownMenu)).sendKeys(Keys.ENTER); - waitForParagraph(1, "FINISHED"); - collector.checkThat("Even if 'RunOnSelectionChange' is set as false, still can run the paragraph by pressing ENTER ", - driver.findElement(By.xpath(xpathToResultText)).getText(), - CoreMatchers.equalTo("My selection is 1")); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testRunOnSelectionChange ", e); - } - } - - @Test - public void testClearOutputButton() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - waitForParagraph(1, "READY"); - String xpathToOutputField = getParagraphXPath(1) + "//div[contains(@id,\"_text\")]"; - setTextOfParagraph(1, "println (\"abcd\")"); - collector.checkThat("Before Run Output field contains ", - driver.findElements(By.xpath(xpathToOutputField)).size(), - CoreMatchers.equalTo(0)); - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@ng-click='runParagraph(getEditorValue())']")).click(); - waitForParagraph(1, "FINISHED"); - collector.checkThat("After Run Output field contains ", - driver.findElement(By.xpath(xpathToOutputField)).getText(), - CoreMatchers.equalTo("abcd")); - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - clickAndWait(By.xpath(getParagraphXPath(1) + - "//ul/li/a[@ng-click='clearParagraphOutput(paragraph)']")); - collector.checkThat("After Clear Output field contains ", - driver.findElements(By.xpath(xpathToOutputField)).size(), - CoreMatchers.equalTo(0)); - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testClearOutputButton ", e); - } - - } - - @Test - public void testWidth() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - waitForParagraph(1, "READY"); - - collector.checkThat("Default Width is 12 ", - driver.findElement(By.xpath("//div[contains(@class,'col-md-12')]")).isDisplayed(), - CoreMatchers.equalTo(true)); - for (Integer newWidth = 1; newWidth <= 11; newWidth++) { - clickAndWait(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")); - String visibleText = newWidth.toString(); - new Select(driver.findElement(By.xpath(getParagraphXPath(1) - + "//ul/li/a/form/select[(@ng-model='paragraph.config.colWidth')]"))).selectByVisibleText(visibleText); - collector.checkThat("New Width is : " + newWidth, - driver.findElement(By.xpath("//div[contains(@class,'col-md-" + newWidth + "')]")).isDisplayed(), - CoreMatchers.equalTo(true)); - } - deleteTestNotebook(driver); - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testWidth ", e); - } - - } - - @Test - public void testTitleButton() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - waitForParagraph(1, "READY"); - - String xpathToTitle = getParagraphXPath(1) + "//div[contains(@class, 'title')]/div"; - String xpathToSettingIcon = getParagraphXPath(1) + "//span[@class='icon-settings']"; - String xpathToShowTitle = getParagraphXPath(1) + "//ul/li/a[@ng-show='!paragraph.config.title']"; - String xpathToHideTitle = getParagraphXPath(1) + "//ul/li/a[@ng-show='paragraph.config.title']"; - - ZeppelinITUtils.turnOffImplicitWaits(driver); - Integer titleElems = driver.findElements(By.xpath(xpathToTitle)).size(); - collector.checkThat("Before Show Title : The title doesn't exist", - titleElems, - CoreMatchers.equalTo(0)); - ZeppelinITUtils.turnOnImplicitWaits(driver); - - clickAndWait(By.xpath(xpathToSettingIcon)); - collector.checkThat("Before Show Title : The title option in option panel of paragraph is labeled as", - driver.findElement(By.xpath(xpathToShowTitle)).getText(), - CoreMatchers.allOf(CoreMatchers.startsWith("Show title"), CoreMatchers.containsString("Ctrl+"), - CoreMatchers.anyOf(CoreMatchers.containsString("Option"), CoreMatchers.containsString("Alt")), - CoreMatchers.containsString("+T"))); - - clickAndWait(By.xpath(xpathToShowTitle)); - collector.checkThat("After Show Title : The title field contains", - driver.findElement(By.xpath(xpathToTitle)).getText(), - CoreMatchers.equalTo("Untitled")); - - clickAndWait(By.xpath(xpathToSettingIcon)); - collector.checkThat("After Show Title : The title option in option panel of paragraph is labeled as", - driver.findElement(By.xpath(xpathToHideTitle)).getText(), - CoreMatchers.allOf(CoreMatchers.startsWith("Hide title"), CoreMatchers.containsString("Ctrl+"), - CoreMatchers.anyOf(CoreMatchers.containsString("Option"), CoreMatchers.containsString("Alt")), - CoreMatchers.containsString("+T"))); - - clickAndWait(By.xpath(xpathToHideTitle)); - ZeppelinITUtils.turnOffImplicitWaits(driver); - titleElems = driver.findElements(By.xpath(xpathToTitle)).size(); - collector.checkThat("After Hide Title : The title field is hidden", - titleElems, - CoreMatchers.equalTo(0)); - ZeppelinITUtils.turnOnImplicitWaits(driver); - - driver.findElement(By.xpath(xpathToSettingIcon)).click(); - driver.findElement(By.xpath(xpathToShowTitle)).click(); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'title')]")).click(); - driver.findElement(By.xpath(getParagraphXPath(1) + "//input")).sendKeys("NEW TITLE" + Keys.ENTER); - ZeppelinITUtils.sleep(500, false); - collector.checkThat("After Editing the Title : The title field contains ", - driver.findElement(By.xpath(xpathToTitle)).getText(), - CoreMatchers.equalTo("NEW TITLE")); - driver.navigate().refresh(); - ZeppelinITUtils.sleep(1000, false); - collector.checkThat("After Page Refresh : The title field contains ", - driver.findElement(By.xpath(xpathToTitle)).getText(), - CoreMatchers.equalTo("NEW TITLE")); - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testTitleButton ", e); - } - - } - - @Test - public void testShowAndHideLineNumbers() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - waitForParagraph(1, "READY"); - String xpathToLineNumberField = getParagraphXPath(1) + "//div[contains(@class, 'ace_gutter-layer')]"; - String xpathToShowLineNumberButton = getParagraphXPath(1) + "//ul/li/a[@ng-click='showLineNumbers(paragraph)']"; - String xpathToHideLineNumberButton = getParagraphXPath(1) + "//ul/li/a[@ng-click='hideLineNumbers(paragraph)']"; - - collector.checkThat("Before \"Show line number\" the Line Number is Enabled ", - driver.findElement(By.xpath(xpathToLineNumberField)).isDisplayed(), - CoreMatchers.equalTo(false)); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - collector.checkThat("Before \"Show line number\" The option panel in paragraph has button labeled ", - driver.findElement(By.xpath(xpathToShowLineNumberButton)).getText(), - CoreMatchers.allOf(CoreMatchers.startsWith("Show line numbers"), CoreMatchers.containsString("Ctrl+"), - CoreMatchers.anyOf(CoreMatchers.containsString("Option"), CoreMatchers.containsString("Alt")), - CoreMatchers.containsString("+M"))); - - - clickAndWait(By.xpath(xpathToShowLineNumberButton)); - collector.checkThat("After \"Show line number\" the Line Number is Enabled ", - driver.findElement(By.xpath(xpathToLineNumberField)).isDisplayed(), - CoreMatchers.equalTo(true)); - - clickAndWait(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")); - collector.checkThat("After \"Show line number\" The option panel in paragraph has button labeled ", - driver.findElement(By.xpath(xpathToHideLineNumberButton)).getText(), - CoreMatchers.allOf(CoreMatchers.startsWith("Hide line numbers"), CoreMatchers.containsString("Ctrl+"), - CoreMatchers.anyOf(CoreMatchers.containsString("Option"), CoreMatchers.containsString("Alt")), - CoreMatchers.containsString("+M"))); - - clickAndWait(By.xpath(xpathToHideLineNumberButton)); - collector.checkThat("After \"Hide line number\" the Line Number is Enabled", - driver.findElement(By.xpath(xpathToLineNumberField)).isDisplayed(), - CoreMatchers.equalTo(false)); - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testShowAndHideLineNumbers ", e); - } - } - - @Test - public void testEditOnDoubleClick() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - Actions action = new Actions(driver); - - waitForParagraph(1, "READY"); - - setTextOfParagraph(1, "%md"); - driver.findElement(By.xpath(getParagraphXPath(1) + "//textarea")).sendKeys(Keys.ARROW_RIGHT); - driver.findElement(By.xpath(getParagraphXPath(1) + "//textarea")).sendKeys(Keys.ENTER); - driver.findElement(By.xpath(getParagraphXPath(1) + "//textarea")).sendKeys(Keys.SHIFT + "3"); - driver.findElement(By.xpath(getParagraphXPath(1) + "//textarea")).sendKeys(" abc"); - - runParagraph(1); - waitForParagraph(1, "FINISHED"); - - collector.checkThat("Markdown editor is hidden after run ", - driver.findElements(By.xpath(getParagraphXPath(1) + "//div[contains(@ng-if, 'paragraph.config.editorHide')]")).size(), - CoreMatchers.equalTo(0)); - - collector.checkThat("Markdown editor is shown after run ", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@ng-show, 'paragraph.config.tableHide')]")).isDisplayed(), - CoreMatchers.equalTo(true)); - - // to check if editOnDblClick field is fetched correctly after refresh - driver.navigate().refresh(); - waitForParagraph(1, "FINISHED"); - - action.doubleClick(driver.findElement(By.xpath(getParagraphXPath(1)))).perform(); - ZeppelinITUtils.sleep(1000, false); - collector.checkThat("Markdown editor is shown after double click ", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@ng-if, 'paragraph.config.editorHide')]")).isDisplayed(), - CoreMatchers.equalTo(true)); - - collector.checkThat("Markdown editor is hidden after double click ", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@ng-show, 'paragraph.config.tableHide')]")).isDisplayed(), - CoreMatchers.equalTo(false)); - - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testEditOnDoubleClick ", e); - } - } - - @Test - public void testSingleDynamicFormTextInput() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - setTextOfParagraph(1, "%spark println(\"Hello \"+z.input(\"name\", \"world\")) "); - - runParagraph(1); - waitForParagraph(1, "FINISHED"); - collector.checkThat("Output text is equal to value specified initially", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.equalTo("Hello world")); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//input")).clear(); - driver.findElement(By.xpath(getParagraphXPath(1) + "//input")).sendKeys("Zeppelin"); - - collector.checkThat("After new data in text input form, output should not be changed", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.equalTo("Hello world")); - - runParagraph(1); - waitForParagraph(1, "FINISHED"); - collector.checkThat("Only after running the paragraph, we can see the newly updated output", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.equalTo("Hello Zeppelin")); - - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testSingleDynamicFormTextInput ", e); - } - } - - @Test - public void testSingleDynamicFormSelectForm() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - setTextOfParagraph(1, "%spark println(\"Howdy \"+z.select(\"names\", Seq((\"1\",\"Alice\"), " + - "(\"2\",\"Bob\"),(\"3\",\"stranger\"))))"); - - runParagraph(1); - waitForParagraph(1, "FINISHED"); - collector.checkThat("Output text should not display any of the options in select form", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.equalTo("Howdy ")); - - Select dropDownMenu = new Select(driver.findElement(By.xpath("(" + (getParagraphXPath(1) + "//select)[1]")))); - dropDownMenu.selectByVisibleText("Alice"); - collector.checkThat("After selection in drop down menu, output should display the newly selected option", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.equalTo("Howdy 1")); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - clickAndWait(By.xpath(getParagraphXPath(1) + "//ul/li/form/input[contains(@ng-checked, 'true')]")); - - Select sameDropDownMenu = new Select(driver.findElement(By.xpath("(" + (getParagraphXPath(1) + "//select)[1]")))); - sameDropDownMenu.selectByVisibleText("Bob"); - collector.checkThat("After 'Run on selection change' checkbox is unchecked, the paragraph should not run if selecting a different option", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.equalTo("Howdy 1")); - - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testSingleDynamicFormSelectForm ", e); - } - } - - @Test - public void testSingleDynamicFormCheckboxForm() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - setTextOfParagraph(1, "%spark val options = Seq((\"han\",\"Han\"), (\"leia\",\"Leia\"), " + - "(\"luke\",\"Luke\")); println(\"Greetings \"+z.checkbox(\"skywalkers\",options).mkString(\" and \"))"); - - runParagraph(1); - waitForParagraph(1, "FINISHED"); - collector.checkThat("Output text should display all of the options included in check boxes", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.containsString("Greetings han and leia and luke")); - - WebElement firstCheckbox = driver.findElement(By.xpath("(" + getParagraphXPath(1) + "//input[@type='checkbox'])[1]")); - firstCheckbox.click(); - collector.checkThat("After unchecking one of the boxes, we can see the newly updated output without the option we unchecked", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.containsString("Greetings leia and luke")); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - clickAndWait(By.xpath(getParagraphXPath(1) + "//ul/li/form/input[contains(@ng-checked, 'true')]")); - - WebElement secondCheckbox = driver.findElement(By.xpath("(" + getParagraphXPath(1) + "//input[@type='checkbox'])[2]")); - secondCheckbox.click(); - collector.checkThat("After 'Run on selection change' checkbox is unchecked, the paragraph should not run if check box state is modified", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.containsString("Greetings leia and luke")); - - runParagraph(1); - waitForParagraph(1, "FINISHED"); - - - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testSingleDynamicFormCheckboxForm ", e); - } - } - - @Test - public void testMultipleDynamicFormsSameType() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - setTextOfParagraph(1, "%spark println(\"Howdy \"+z.select(\"fruits\", Seq((\"1\",\"Apple\")," + - "(\"2\",\"Orange\"),(\"3\",\"Peach\")))); println(\"Howdy \"+z.select(\"planets\", " + - "Seq((\"1\",\"Venus\"),(\"2\",\"Earth\"),(\"3\",\"Mars\"))))"); - - runParagraph(1); - waitForParagraph(1, "FINISHED"); - collector.checkThat("Output text should not display any of the options in select form", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.equalTo("Howdy \nHowdy ")); - - Select dropDownMenu = new Select(driver.findElement(By.xpath("(" + (getParagraphXPath(1) + "//select)[1]")))); - dropDownMenu.selectByVisibleText("Apple"); - collector.checkThat("After selection in drop down menu, output should display the new option we selected", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.equalTo("Howdy 1\nHowdy ")); - - driver.findElement(By.xpath(getParagraphXPath(1) + "//span[@class='icon-settings']")).click(); - clickAndWait(By.xpath(getParagraphXPath(1) + "//ul/li/form/input[contains(@ng-checked, 'true')]")); - - Select sameDropDownMenu = new Select(driver.findElement(By.xpath("(" + (getParagraphXPath(1) + "//select)[2]")))); - sameDropDownMenu.selectByVisibleText("Earth"); - waitForParagraph(1, "FINISHED"); - collector.checkThat("After 'Run on selection change' checkbox is unchecked, the paragraph should not run if selecting a different option", - driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), - CoreMatchers.equalTo("Howdy 1\nHowdy ")); - - deleteTestNotebook(driver); - - } catch (Exception e) { - handleException("Exception in ParagraphActionsIT while testMultipleDynamicFormsSameType ", e); - } - } -} \ No newline at end of file diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/SparkParagraphIT.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/SparkParagraphIT.java deleted file mode 100644 index 2cc6a6c8a22..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/SparkParagraphIT.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.integration; - - -import org.apache.zeppelin.AbstractZeppelinIT; -import org.apache.zeppelin.WebDriverManager; -import org.hamcrest.CoreMatchers; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ErrorCollector; -import org.openqa.selenium.By; -import org.openqa.selenium.TimeoutException; -import org.openqa.selenium.WebElement; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SparkParagraphIT extends AbstractZeppelinIT { - private static final Logger LOG = LoggerFactory.getLogger(SparkParagraphIT.class); - - @Rule - public ErrorCollector collector = new ErrorCollector(); - - @Before - public void startUp() { - if (!endToEndTestEnabled()) { - return; - } - driver = WebDriverManager.getWebDriver(); - createNewNote(); - waitForParagraph(1, "READY"); - } - - @After - public void tearDown() { - if (!endToEndTestEnabled()) { - return; - } - deleteTestNotebook(driver); - driver.quit(); - } - - @Test - public void testSpark() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - setTextOfParagraph(1, "sc.version"); - runParagraph(1); - - waitForParagraph(1, "FINISHED"); - - /* - equivalent of - import org.apache.commons.io.IOUtils - import java.net.URL - import java.nio.charset.Charset - val bankText = sc.parallelize(IOUtils.toString(new URL("https://s3.amazonaws.com/apache-zeppelin/tutorial/bank/bank.csv"),Charset.forName("utf8")).split("\n")) - case class Bank(age: Integer, job: String, marital: String, education: String, balance: Integer) - - val bank = bankText.map(s => s.split(";")).filter(s => s(0) != "\"age\"").map(s => Bank(s(0).toInt,s(1).replaceAll("\"", ""),s(2).replaceAll("\"", ""),s(3).replaceAll("\"", ""),s(5).replaceAll("\"", "").toInt)).toDF() - bank.registerTempTable("bank") - */ - setTextOfParagraph(2, "import org.apache.commons.io.IOUtils\\n" + - "import java.net.URL\\n" + - "import java.nio.charset.Charset\\n" + - "val bankText = sc.parallelize(IOUtils.toString(new URL(\"https://s3.amazonaws.com/apache-zeppelin/tutorial/bank/bank.csv\"),Charset.forName(\"utf8\")).split(\"\\\\n\"))\\n" + - "case class Bank(age: Integer, job: String, marital: String, education: String, balance: Integer)\\n" + - "\\n" + - "val bank = bankText.map(s => s.split(\";\")).filter(s => s(0) != \"\\\\\"age\\\\\"\").map(s => Bank(s(0).toInt,s(1).replaceAll(\"\\\\\"\", \"\"),s(2).replaceAll(\"\\\\\"\", \"\"),s(3).replaceAll(\"\\\\\"\", \"\"),s(5).replaceAll(\"\\\\\"\", \"\").toInt)).toDF()\\n" + - "bank.registerTempTable(\"bank\")"); - runParagraph(2); - - try { - waitForParagraph(2, "FINISHED"); - } catch (TimeoutException e) { - waitForParagraph(2, "ERROR"); - collector.checkThat("2nd Paragraph from SparkParagraphIT of testSpark status:", - "ERROR", CoreMatchers.equalTo("FINISHED") - ); - } - - WebElement paragraph2Result = driver.findElement(By.xpath( - getParagraphXPath(2) + "//div[contains(@id,\"_text\")]")); - - collector.checkThat("2nd Paragraph from SparkParagraphIT of testSpark result: ", - paragraph2Result.getText().toString(), CoreMatchers.containsString( - "import org.apache.commons.io.IOUtils" - ) - ); - - } catch (Exception e) { - handleException("Exception in SparkParagraphIT while testSpark", e); - } - } - - @Test - public void testPySpark() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - setTextOfParagraph(1, "%pyspark\\n" + - "for x in range(0, 3):\\n" + - " print \"test loop %d\" % (x)"); - - runParagraph(1); - - try { - waitForParagraph(1, "FINISHED"); - } catch (TimeoutException e) { - waitForParagraph(1, "ERROR"); - collector.checkThat("Paragraph from SparkParagraphIT of testPySpark status: ", - "ERROR", CoreMatchers.equalTo("FINISHED") - ); - } - - WebElement paragraph1Result = driver.findElement(By.xpath( - getParagraphXPath(1) + "//div[contains(@id,\"_text\")]")); - collector.checkThat("Paragraph from SparkParagraphIT of testPySpark result: ", - paragraph1Result.getText().toString(), CoreMatchers.equalTo("test loop 0\ntest loop 1\ntest loop 2") - ); - - // the last statement's evaluation result is printed - setTextOfParagraph(2, "%pyspark\\n" + - "sc.version\\n" + - "1+1"); - runParagraph(2); - try { - waitForParagraph(2, "FINISHED"); - } catch (TimeoutException e) { - waitForParagraph(2, "ERROR"); - collector.checkThat("Paragraph from SparkParagraphIT of testPySpark status: ", - "ERROR", CoreMatchers.equalTo("FINISHED") - ); - } - WebElement paragraph2Result = driver.findElement(By.xpath( - getParagraphXPath(2) + "//div[contains(@id,\"_text\")]")); - collector.checkThat("Paragraph from SparkParagraphIT of testPySpark result: ", - paragraph2Result.getText().toString(), CoreMatchers.equalTo("2") - ); - - } catch (Exception e) { - handleException("Exception in SparkParagraphIT while testPySpark", e); - } - } - - @Test - public void testSqlSpark() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - setTextOfParagraph(1,"%sql\\n" + - "select * from bank limit 1"); - runParagraph(1); - - try { - waitForParagraph(1, "FINISHED"); - } catch (TimeoutException e) { - waitForParagraph(1, "ERROR"); - collector.checkThat("Paragraph from SparkParagraphIT of testSqlSpark status: ", - "ERROR", CoreMatchers.equalTo("FINISHED") - ); - } - - WebElement paragraph1Result = driver.findElement(By.xpath( - getParagraphXPath(1) + "//div[contains(@id,\"_graph\")]/div/div/div/div/div[1]")); - collector.checkThat("Paragraph from SparkParagraphIT of testSqlSpark result: ", - paragraph1Result.getText().toString(), CoreMatchers.equalTo("age\n▼\njob\n▼\nmarital\n▼\neducation\n▼\nbalance\n▼\n30 unemployed married primary 1787")); - } catch (Exception e) { - handleException("Exception in SparkParagraphIT while testSqlSpark", e); - } - } - - @Test - public void testDep() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - // restart spark interpreter before running %dep - clickAndWait(By.xpath("//span[@uib-tooltip='Interpreter binding']")); - clickAndWait(By.xpath("//div[font[contains(text(), 'spark')]]/preceding-sibling::a[@uib-tooltip='Restart']")); - clickAndWait(By.xpath("//button[contains(.,'OK')]")); - - setTextOfParagraph(1,"%dep z.load(\"org.apache.commons:commons-csv:1.1\")"); - runParagraph(1); - - try { - waitForParagraph(1, "FINISHED"); - WebElement paragraph1Result = driver.findElement(By.xpath(getParagraphXPath(1) + - "//div[contains(@id,'_text')]")); - collector.checkThat("Paragraph from SparkParagraphIT of testSqlSpark result: ", - paragraph1Result.getText(), CoreMatchers.containsString("res0: org.apache.zeppelin.dep.Dependency = org.apache.zeppelin.dep.Dependency")); - - setTextOfParagraph(2, "import org.apache.commons.csv.CSVFormat"); - runParagraph(2); - - try { - waitForParagraph(2, "FINISHED"); - WebElement paragraph2Result = driver.findElement(By.xpath(getParagraphXPath(2) + - "//div[contains(@id,'_text')]")); - collector.checkThat("Paragraph from SparkParagraphIT of testSqlSpark result: ", - paragraph2Result.getText(), CoreMatchers.equalTo("import org.apache.commons.csv.CSVFormat")); - - } catch (TimeoutException e) { - waitForParagraph(2, "ERROR"); - collector.checkThat("Second paragraph from SparkParagraphIT of testDep status: ", - "ERROR", CoreMatchers.equalTo("FINISHED") - ); - } - - } catch (TimeoutException e) { - waitForParagraph(1, "ERROR"); - collector.checkThat("First paragraph from SparkParagraphIT of testDep status: ", - "ERROR", CoreMatchers.equalTo("FINISHED") - ); - } - } catch (Exception e) { - handleException("Exception in SparkParagraphIT while testDep", e); - } - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ZeppelinIT.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ZeppelinIT.java deleted file mode 100644 index 63c3ab1ffe8..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ZeppelinIT.java +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.integration; - -import org.apache.zeppelin.AbstractZeppelinIT; -import org.apache.zeppelin.WebDriverManager; -import org.apache.zeppelin.ZeppelinITUtils; -import org.hamcrest.CoreMatchers; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ErrorCollector; -import org.openqa.selenium.By; -import org.openqa.selenium.Keys; -import org.openqa.selenium.StaleElementReferenceException; -import org.openqa.selenium.TimeoutException; -import org.openqa.selenium.WebElement; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static org.apache.commons.lang3.StringUtils.isNotBlank; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -/** - * Test Zeppelin with web browser. - * - * To test, ZeppelinServer should be running on port 8080 - * On OSX, you'll need firefox 42.0 installed, then you can run with - * - * PATH=~/Applications/Firefox.app/Contents/MacOS/:$PATH TEST_SELENIUM="" \ - * mvn -Dtest=org.apache.zeppelin.integration.ZeppelinIT -Denforcer.skip=true \ - * test -pl zeppelin-server - * - */ -public class ZeppelinIT extends AbstractZeppelinIT { - private static final Logger LOG = LoggerFactory.getLogger(ZeppelinIT.class); - - @Rule - public ErrorCollector collector = new ErrorCollector(); - - @Before - public void startUp() { - if (!endToEndTestEnabled()) { - return; - } - driver = WebDriverManager.getWebDriver(); - } - - @After - public void tearDown() { - if (!endToEndTestEnabled()) { - return; - } - - driver.quit(); - } - - @Test - public void testAngularDisplay() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - createNewNote(); - - // wait for first paragraph's " READY " status text - waitForParagraph(1, "READY"); - - /* - * print angular template - * %angular
BindingTest_{{myVar}}_
- */ - setTextOfParagraph(1, "println(\"%angular
BindingTest_{{myVar}}_
\")"); - runParagraph(1); - waitForParagraph(1, "FINISHED"); - - // check expected text - waitForText("BindingTest__", By.xpath( - getParagraphXPath(1) + "//div[@id=\"angularTestButton\"]")); - - /* - * Bind variable - * z.angularBind("myVar", 1) - */ - assertEquals(1, driver.findElements(By.xpath(getParagraphXPath(2) + "//textarea")).size()); - setTextOfParagraph(2, "z.angularBind(\"myVar\", 1)"); - runParagraph(2); - waitForParagraph(2, "FINISHED"); - - // check expected text - waitForText("BindingTest_1_", By.xpath( - getParagraphXPath(1) + "//div[@id=\"angularTestButton\"]")); - - - /* - * print variable - * print("myVar="+z.angular("myVar")) - */ - setTextOfParagraph(3, "print(\"myVar=\"+z.angular(\"myVar\"))"); - runParagraph(3); - waitForParagraph(3, "FINISHED"); - - // check expected text - waitForText("myVar=1", By.xpath( - getParagraphXPath(3) + "//div[contains(@id,\"_text\") and @class=\"text\"]")); - - /* - * Click element - */ - driver.findElement(By.xpath( - getParagraphXPath(1) + "//div[@id=\"angularTestButton\"]")).click(); - - // check expected text - waitForText("BindingTest_2_", By.xpath( - getParagraphXPath(1) + "//div[@id=\"angularTestButton\"]")); - - /* - * Register watcher - * z.angularWatch("myVar", (before:Object, after:Object, context:org.apache.zeppelin.interpreter.InterpreterContext) => { - * z.run(2, context) - * } - */ - setTextOfParagraph(4, "z.angularWatch(\"myVar\", (before:Object, after:Object, context:org.apache.zeppelin.interpreter.InterpreterContext)=>{ z.run(2)})"); - runParagraph(4); - waitForParagraph(4, "FINISHED"); - - - /* - * Click element, again and see watcher works - */ - driver.findElement(By.xpath( - getParagraphXPath(1) + "//div[@id=\"angularTestButton\"]")).click(); - - // check expected text - waitForText("BindingTest_3_", By.xpath( - getParagraphXPath(1) + "//div[@id=\"angularTestButton\"]")); - waitForParagraph(3, "FINISHED"); - - // check expected text by watcher - waitForText("myVar=3", By.xpath( - getParagraphXPath(3) + "//div[contains(@id,\"_text\") and @class=\"text\"]")); - - /* - * Unbind - * z.angularUnbind("myVar") - */ - setTextOfParagraph(5, "z.angularUnbind(\"myVar\")"); - runParagraph(5); - waitForParagraph(5, "FINISHED"); - - // check expected text - waitForText("BindingTest__", - By.xpath(getParagraphXPath(1) + "//div[@id=\"angularTestButton\"]")); - - /* - * Bind again and see rebind works. - */ - runParagraph(2); - waitForParagraph(2, "FINISHED"); - - // check expected text - waitForText("BindingTest_1_", - By.xpath(getParagraphXPath(1) + "//div[@id=\"angularTestButton\"]")); - - driver.findElement(By.xpath(".//*[@id='main']//button[@ng-click='moveNoteToTrash(note.id)']")) - .sendKeys(Keys.ENTER); - ZeppelinITUtils.sleep(1000, true); - driver.findElement(By.xpath("//div[@class='modal-dialog'][contains(.,'This note will be moved to trash')]" + - "//div[@class='modal-footer']//button[contains(.,'OK')]")).click(); - ZeppelinITUtils.sleep(100, true); - - LOG.info("testCreateNotebook Test executed"); - } catch (Exception e) { - handleException("Exception in ZeppelinIT while testAngularDisplay ", e); - } - } - - @Test - public void testSparkInterpreterDependencyLoading() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - try { - // navigate to interpreter page - WebElement settingButton = driver.findElement(By.xpath("//button[@class='nav-btn dropdown-toggle ng-scope']")); - settingButton.click(); - WebElement interpreterLink = driver.findElement(By.xpath("//a[@href='#/interpreter']")); - interpreterLink.click(); - - // add new dependency to spark interpreter - driver.findElement(By.xpath("//div[@id='spark']//button[contains(.,'edit')]")).sendKeys(Keys.ENTER); - - WebElement depArtifact = pollingWait(By.xpath("//input[@ng-model='setting.depArtifact']"), - MAX_BROWSER_TIMEOUT_SEC); - String artifact = "org.apache.commons:commons-csv:1.1"; - depArtifact.sendKeys(artifact); - driver.findElement(By.xpath("//div[@id='spark']//form//button[1]")).click(); - clickAndWait(By.xpath("//div[@class='modal-dialog'][contains(.,'Do you want to update this interpreter and restart with new settings?')]" + - "//div[@class='modal-footer']//button[contains(.,'OK')]")); - - try { - clickAndWait(By.xpath("//div[@class='modal-dialog'][contains(.,'Do you want to " + - "update this interpreter and restart with new settings?')]//" + - "div[@class='bootstrap-dialog-close-button']/button")); - } catch (TimeoutException | StaleElementReferenceException e) { - //Modal dialog got closed earlier than expected nothing to worry. - } - - driver.navigate().back(); - createNewNote(); - - // wait for first paragraph's " READY " status text - waitForParagraph(1, "READY"); - - setTextOfParagraph(1, "import org.apache.commons.csv.CSVFormat"); - runParagraph(1); - waitForParagraph(1, "FINISHED"); - - // check expected text - WebElement paragraph1Result = driver.findElement(By.xpath( - getParagraphXPath(1) + "//div[contains(@id,\"_text\")]")); - - collector.checkThat("Paragraph from ZeppelinIT of testSparkInterpreterDependencyLoading result: ", - paragraph1Result.getText().toString(), CoreMatchers.containsString( - "import org.apache.commons.csv.CSVFormat" - ) - ); - - //delete created notebook for cleanup. - deleteTestNotebook(driver); - ZeppelinITUtils.sleep(1000, false); - - // reset dependency - settingButton.click(); - interpreterLink.click(); - driver.findElement(By.xpath("//div[@id='spark']//button[contains(.,'edit')]")).sendKeys(Keys.ENTER); - WebElement testDepRemoveBtn = pollingWait(By.xpath("//tr[descendant::text()[contains(.,'" + - artifact + "')]]/td[3]/button"), MAX_IMPLICIT_WAIT); - testDepRemoveBtn.sendKeys(Keys.ENTER); - driver.findElement(By.xpath("//div[@id='spark']//form//button[1]")).click(); - driver.findElement(By.xpath("//div[@class='modal-dialog'][contains(.,'Do you want to update this interpreter and restart with new settings?')]" + - "//div[@class='modal-footer']//button[contains(.,'OK')]")).click(); - } catch (Exception e) { - handleException("Exception in ZeppelinIT while testSparkInterpreterDependencyLoading ", e); - } - } - - @Test - public void testAngularRunParagraph() throws Exception { - if (!endToEndTestEnabled()) { - return; - } - - try { - createNewNote(); - - // wait for first paragraph's " READY " status text - waitForParagraph(1, "READY"); - - // Create 1st paragraph - setTextOfParagraph(1, - "%angular
Run second paragraph
"); - runParagraph(1); - waitForParagraph(1, "FINISHED"); - waitForText("Run second paragraph", By.xpath( - getParagraphXPath(1) + "//div[@id=\"angularRunParagraph\"]")); - - // Create 2nd paragraph - setTextOfParagraph(2, "%sh echo TEST"); - runParagraph(2); - waitForParagraph(2, "FINISHED"); - - // Get 2nd paragraph id - final String secondParagraphId = driver.findElement(By.xpath(getParagraphXPath(2) - + "//div[@class=\"control ng-scope\"]//ul[@class=\"dropdown-menu dropdown-menu-right\"]/li[1]")) - .getAttribute("textContent"); - - assertTrue("Cannot find paragraph id for the 2nd paragraph", isNotBlank(secondParagraphId)); - - // Update first paragraph to call z.runParagraph() with 2nd paragraph id - setTextOfParagraph(1, - "%angular
Run second paragraph
"); - runParagraph(1); - waitForParagraph(1, "FINISHED"); - - // Set new text value for 2nd paragraph - setTextOfParagraph(2, "%sh echo NEW_VALUE"); - - // Click on 1 paragraph to trigger z.runParagraph() function - driver.findElement(By.xpath( - getParagraphXPath(1) + "//div[@id=\"angularRunParagraph\"]")).click(); - - waitForParagraph(2, "FINISHED"); - - // Check that 2nd paragraph has been executed - waitForText("NEW_VALUE", By.xpath( - getParagraphXPath(2) + "//div[contains(@id,\"_text\") and @class=\"text\"]")); - - //delete created notebook for cleanup. - deleteTestNotebook(driver); - ZeppelinITUtils.sleep(1000, true); - - LOG.info("testAngularRunParagraph Test executed"); - } catch (Exception e) { - handleException("Exception in ZeppelinIT while testAngularRunParagraph", e); - } - - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java deleted file mode 100644 index b8343c0633a..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zeppelin.interpreter.mock; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import org.apache.zeppelin.interpreter.Interpreter; -import org.apache.zeppelin.interpreter.InterpreterContext; -import org.apache.zeppelin.interpreter.InterpreterResult; -import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; -import org.apache.zeppelin.scheduler.Scheduler; -import org.apache.zeppelin.scheduler.SchedulerFactory; - -public class MockInterpreter1 extends Interpreter{ - Map vars = new HashMap<>(); - - public MockInterpreter1(Properties property) { - super(property); - } - - @Override - public void open() { - } - - @Override - public void close() { - } - - @Override - public InterpreterResult interpret(String st, InterpreterContext context) { - return new InterpreterResult(InterpreterResult.Code.SUCCESS, "repl1: "+st); - } - - @Override - public void cancel(InterpreterContext context) { - } - - @Override - public FormType getFormType() { - return FormType.SIMPLE; - } - - @Override - public int getProgress(InterpreterContext context) { - return 0; - } - - @Override - public Scheduler getScheduler() { - return SchedulerFactory.singleton().createOrGetFIFOScheduler("test_"+this.hashCode()); - } - - @Override - public List completion(String buf, int cursor) { - return null; - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/realm/PamRealmTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/realm/PamRealmTest.java deleted file mode 100644 index 55448bdbece..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/realm/PamRealmTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zeppelin.realm; - -import org.apache.shiro.authc.AuthenticationInfo; -import org.apache.shiro.authc.UsernamePasswordToken; -import org.junit.Test; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * The test will only be executed if the environment variables PAM_USER and PAM_PASS are present. They should - * contain username and password of an valid system user to make the test pass. The service needs to be configured - * under /etc/pam.d/sshd to resolve and authenticate the system user. - * - * Contains main() function so the test can be executed manually. - * - * Set in MacOS to run in IDE(A): - * $ launchctl setenv PAM_USER user - * $ launchctl setenv PAM_PASS xxxxx - */ -public class PamRealmTest { - - @Test - public void testDoGetAuthenticationInfo() { - PamRealm realm = new PamRealm(); - realm.setService("sshd"); - - String pam_user = System.getenv("PAM_USER"); - String pam_pass = System.getenv("PAM_PASS"); - assumeTrue(pam_user != null); - assumeTrue(pam_pass != null); - - // mock shiro auth token - UsernamePasswordToken authToken = mock(UsernamePasswordToken.class); - when(authToken.getUsername()).thenReturn(pam_user); - when(authToken.getPassword()).thenReturn(pam_pass.toCharArray()); - when(authToken.getCredentials()).thenReturn(pam_pass); - - AuthenticationInfo authInfo = realm.doGetAuthenticationInfo(authToken); - - assertTrue(authInfo.getCredentials() != null); - } - - public static void main(String[] args) { - PamRealmTest test = new PamRealmTest(); - test.testDoGetAuthenticationInfo(); - } -} \ No newline at end of file diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java deleted file mode 100644 index 7ea2774c9d7..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/AbstractTestRestApi.java +++ /dev/null @@ -1,571 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.rest; - -import java.io.File; -import java.io.IOException; -import java.lang.ref.WeakReference; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.List; -import java.util.Properties; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.regex.Pattern; - -import org.apache.commons.exec.CommandLine; -import org.apache.commons.exec.DefaultExecutor; -import org.apache.commons.exec.PumpStreamHandler; -import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpMethodBase; -import org.apache.commons.httpclient.cookie.CookiePolicy; -import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; -import org.apache.commons.httpclient.methods.DeleteMethod; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.commons.httpclient.methods.RequestEntity; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.zeppelin.conf.ZeppelinConfiguration; -import org.apache.zeppelin.interpreter.InterpreterSetting; -import org.apache.zeppelin.server.ZeppelinServer; -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeMatcher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import com.google.gson.JsonParser; - -public abstract class AbstractTestRestApi { - - protected static final Logger LOG = LoggerFactory.getLogger(AbstractTestRestApi.class); - - static final String restApiUrl = "/api"; - static final String url = getUrlToTest(); - protected static final boolean wasRunning = checkIfServerIsRunning(); - static boolean pySpark = false; - static boolean sparkR = false; - static Gson gson = new Gson(); - static boolean isRunningWithAuth = false; - - private static File shiroIni = null; - private static String zeppelinShiro = - "[users]\n" + - "admin = password1, admin\n" + - "user1 = password2, role1, role2\n" + - "user2 = password3, role3\n" + - "user3 = password4, role2\n" + - "[main]\n" + - "sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager\n" + - "securityManager.sessionManager = $sessionManager\n" + - "securityManager.sessionManager.globalSessionTimeout = 86400000\n" + - "shiro.loginUrl = /api/login\n" + - "[roles]\n" + - "role1 = *\n" + - "role2 = *\n" + - "role3 = *\n" + - "admin = *\n" + - "[urls]\n" + - "/api/version = anon\n" + - "/** = authc"; - - private String getUrl(String path) { - String url; - if (System.getProperty("url") != null) { - url = System.getProperty("url"); - } else { - url = "http://localhost:8080"; - } - url += restApiUrl; - if (path != null) - url += path; - return url; - } - - protected static String getUrlToTest() { - String url = "http://localhost:8080" + restApiUrl; - if (System.getProperty("url") != null) { - url = System.getProperty("url"); - } - return url; - } - - static ExecutorService executor; - protected static final Runnable server = new Runnable() { - @Override - public void run() { - try { - ZeppelinServer.main(new String[] {""}); - } catch (Exception e) { - LOG.error("Exception in WebDriverManager while getWebDriver ", e); - throw new RuntimeException(e); - } - } - }; - - private static void start(boolean withAuth) throws Exception { - if (!wasRunning) { - System.setProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_HOME.getVarName(), "../"); - System.setProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_WAR.getVarName(), "../zeppelin-web/dist"); - - // some test profile does not build zeppelin-web. - // to prevent zeppelin starting up fail, create zeppelin-web/dist directory - new File("../zeppelin-web/dist").mkdirs(); - - LOG.info("Staring test Zeppelin up..."); - ZeppelinConfiguration conf = ZeppelinConfiguration.create(); - - if (withAuth) { - isRunningWithAuth = true; - // Set Anonymous session to false. - System.setProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_ANONYMOUS_ALLOWED.getVarName(), "false"); - - // Create a shiro env test. - shiroIni = new File("../conf/shiro.ini"); - if (!shiroIni.exists()) { - shiroIni.createNewFile(); - } - FileUtils.writeStringToFile(shiroIni, zeppelinShiro); - } - - // exclude org.apache.zeppelin.rinterpreter.* for scala 2.11 test - String interpreters = conf.getString(ZeppelinConfiguration.ConfVars.ZEPPELIN_INTERPRETERS); - String interpretersCompatibleWithScala211Test = null; - - for (String intp : interpreters.split(",")) { - if (intp.startsWith("org.apache.zeppelin.rinterpreter")) { - continue; - } - - if (interpretersCompatibleWithScala211Test == null) { - interpretersCompatibleWithScala211Test = intp; - } else { - interpretersCompatibleWithScala211Test += "," + intp; - } - } - - System.setProperty( - ZeppelinConfiguration.ConfVars.ZEPPELIN_INTERPRETERS.getVarName(), - interpretersCompatibleWithScala211Test); - - - executor = Executors.newSingleThreadExecutor(); - executor.submit(server); - long s = System.currentTimeMillis(); - boolean started = false; - while (System.currentTimeMillis() - s < 1000 * 60 * 3) { // 3 minutes - Thread.sleep(2000); - started = checkIfServerIsRunning(); - if (started == true) { - break; - } - } - if (started == false) { - throw new RuntimeException("Can not start Zeppelin server"); - } - LOG.info("Test Zeppelin stared."); - - - // assume first one is spark - InterpreterSetting sparkIntpSetting = null; - for(InterpreterSetting intpSetting : - ZeppelinServer.notebook.getInterpreterSettingManager().get()) { - if (intpSetting.getName().equals("spark")) { - sparkIntpSetting = intpSetting; - } - } - - Properties sparkProperties = (Properties) sparkIntpSetting.getProperties(); - // ci environment runs spark cluster for testing - // so configure zeppelin use spark cluster - if ("true".equals(System.getenv("CI"))) { - // set spark master and other properties - sparkProperties.setProperty("master", "local[2]"); - sparkProperties.setProperty("spark.cores.max", "2"); - sparkProperties.setProperty("zeppelin.spark.useHiveContext", "false"); - // set spark home for pyspark - sparkProperties.setProperty("spark.home", getSparkHome()); - - sparkIntpSetting.setProperties(sparkProperties); - pySpark = true; - sparkR = true; - ZeppelinServer.notebook.getInterpreterSettingManager().restart(sparkIntpSetting.getId()); - } else { - String sparkHome = getSparkHome(); - if (sparkHome != null) { - if (System.getenv("SPARK_MASTER") != null) { - sparkProperties.setProperty("master", System.getenv("SPARK_MASTER")); - } else { - sparkProperties.setProperty("master", "local[2]"); - } - sparkProperties.setProperty("spark.cores.max", "2"); - // set spark home for pyspark - sparkProperties.setProperty("spark.home", sparkHome); - sparkProperties.setProperty("zeppelin.spark.useHiveContext", "false"); - pySpark = true; - sparkR = true; - } - - ZeppelinServer.notebook.getInterpreterSettingManager().restart(sparkIntpSetting.getId()); - } - } - } - - protected static void startUpWithAuthenticationEnable() throws Exception { - start(true); - } - - protected static void startUp() throws Exception { - start(false); - } - - private static String getHostname() { - try { - return InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - LOG.error("Exception in WebDriverManager while getWebDriver ", e); - return "localhost"; - } - } - - private static String getSparkHome() { - String sparkHome = System.getenv("SPARK_HOME"); - if (sparkHome != null) { - return sparkHome; - } - sparkHome = getSparkHomeRecursively(new File(System.getProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_HOME.getVarName()))); - System.out.println("SPARK HOME detected " + sparkHome); - return sparkHome; - } - - boolean isPyspark() { - return pySpark; - } - - boolean isSparkR() { - return sparkR; - } - - private static String getSparkHomeRecursively(File dir) { - if (dir == null) return null; - File files [] = dir.listFiles(); - if (files == null) return null; - - File homeDetected = null; - for (File f : files) { - if (isActiveSparkHome(f)) { - homeDetected = f; - break; - } - } - - if (homeDetected != null) { - return homeDetected.getAbsolutePath(); - } else { - return getSparkHomeRecursively(dir.getParentFile()); - } - } - - private static boolean isActiveSparkHome(File dir) { - return dir.getName().matches("spark-[0-9\\.]+[A-Za-z-]*-bin-hadoop[0-9\\.]+"); - } - - protected static void shutDown() throws Exception { - if (!wasRunning) { - // restart interpreter to stop all interpreter processes - List settingList = ZeppelinServer.notebook.getInterpreterSettingManager() - .getDefaultInterpreterSettingList(); - for (String setting : settingList) { - ZeppelinServer.notebook.getInterpreterSettingManager().restart(setting); - } - if (shiroIni != null) { - FileUtils.deleteQuietly(shiroIni); - } - LOG.info("Terminating test Zeppelin..."); - ZeppelinServer.jettyWebServer.stop(); - executor.shutdown(); - - long s = System.currentTimeMillis(); - boolean started = true; - while (System.currentTimeMillis() - s < 1000 * 60 * 3) { // 3 minutes - Thread.sleep(2000); - started = checkIfServerIsRunning(); - if (started == false) { - break; - } - } - if (started == true) { - throw new RuntimeException("Can not stop Zeppelin server"); - } - - LOG.info("Test Zeppelin terminated."); - - System.clearProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_INTERPRETERS.getVarName()); - if (isRunningWithAuth) { - isRunningWithAuth = false; - System - .clearProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_ANONYMOUS_ALLOWED.getVarName()); - } - } - } - - protected static boolean checkIfServerIsRunning() { - GetMethod request = null; - boolean isRunning = true; - try { - request = httpGet("/version"); - isRunning = request.getStatusCode() == 200; - } catch (IOException e) { - LOG.error("AbstractTestRestApi.checkIfServerIsRunning() fails .. ZeppelinServer is not running"); - isRunning = false; - } finally { - if (request != null) { - request.releaseConnection(); - } - } - return isRunning; - } - - protected static GetMethod httpGet(String path) throws IOException { - return httpGet(path, StringUtils.EMPTY, StringUtils.EMPTY); - } - - protected static GetMethod httpGet(String path, String user, String pwd) throws IOException { - LOG.info("Connecting to {}", url + path); - HttpClient httpClient = new HttpClient(); - GetMethod getMethod = new GetMethod(url + path); - getMethod.addRequestHeader("Origin", url); - if (userAndPasswordAreNotBlank(user, pwd)) { - getMethod.setRequestHeader("Cookie", "JSESSIONID="+ getCookie(user, pwd)); - } - httpClient.executeMethod(getMethod); - LOG.info("{} - {}", getMethod.getStatusCode(), getMethod.getStatusText()); - return getMethod; - } - - protected static DeleteMethod httpDelete(String path) throws IOException { - return httpDelete(path, StringUtils.EMPTY, StringUtils.EMPTY); - } - - protected static DeleteMethod httpDelete(String path, String user, String pwd) throws IOException { - LOG.info("Connecting to {}", url + path); - HttpClient httpClient = new HttpClient(); - DeleteMethod deleteMethod = new DeleteMethod(url + path); - deleteMethod.addRequestHeader("Origin", url); - if (userAndPasswordAreNotBlank(user, pwd)) { - deleteMethod.setRequestHeader("Cookie", "JSESSIONID="+ getCookie(user, pwd)); - } - httpClient.executeMethod(deleteMethod); - LOG.info("{} - {}", deleteMethod.getStatusCode(), deleteMethod.getStatusText()); - return deleteMethod; - } - - protected static PostMethod httpPost(String path, String body) throws IOException { - return httpPost(path, body, StringUtils.EMPTY, StringUtils.EMPTY); - } - - protected static PostMethod httpPost(String path, String request, String user, String pwd) - throws IOException { - LOG.info("Connecting to {}", url + path); - HttpClient httpClient = new HttpClient(); - PostMethod postMethod = new PostMethod(url + path); - postMethod.setRequestBody(request); - postMethod.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES); - if (userAndPasswordAreNotBlank(user, pwd)) { - postMethod.setRequestHeader("Cookie", "JSESSIONID="+ getCookie(user, pwd)); - } - httpClient.executeMethod(postMethod); - LOG.info("{} - {}", postMethod.getStatusCode(), postMethod.getStatusText()); - return postMethod; - } - - protected static PutMethod httpPut(String path, String body) throws IOException { - return httpPut(path, body, StringUtils.EMPTY, StringUtils.EMPTY); - } - - protected static PutMethod httpPut(String path, String body, String user, String pwd) throws IOException { - LOG.info("Connecting to {}", url + path); - HttpClient httpClient = new HttpClient(); - PutMethod putMethod = new PutMethod(url + path); - putMethod.addRequestHeader("Origin", url); - RequestEntity entity = new ByteArrayRequestEntity(body.getBytes("UTF-8")); - putMethod.setRequestEntity(entity); - if (userAndPasswordAreNotBlank(user, pwd)) { - putMethod.setRequestHeader("Cookie", "JSESSIONID="+ getCookie(user, pwd)); - } - httpClient.executeMethod(putMethod); - LOG.info("{} - {}", putMethod.getStatusCode(), putMethod.getStatusText()); - return putMethod; - } - - private static String getCookie(String user, String password) throws IOException { - HttpClient httpClient = new HttpClient(); - PostMethod postMethod = new PostMethod(url + "/login"); - postMethod.addRequestHeader("Origin", url); - postMethod.setParameter("password", password); - postMethod.setParameter("userName", user); - httpClient.executeMethod(postMethod); - LOG.info("{} - {}", postMethod.getStatusCode(), postMethod.getStatusText()); - Pattern pattern = Pattern.compile("JSESSIONID=([a-zA-Z0-9-]*)"); - Header[] setCookieHeaders = postMethod.getResponseHeaders("Set-Cookie"); - for (Header setCookie : setCookieHeaders) { - java.util.regex.Matcher matcher = pattern.matcher(setCookie.toString()); - if (matcher.find()) { - return matcher.group(1); - } - } - return StringUtils.EMPTY; - } - - protected static boolean userAndPasswordAreNotBlank(String user, String pwd) { - if (StringUtils.isBlank(user) && StringUtils.isBlank(pwd)) { - return false; - } - return true; - } - - protected Matcher responsesWith(final int expectedStatusCode) { - return new TypeSafeMatcher() { - WeakReference method; - - @Override - public boolean matchesSafely(HttpMethodBase httpMethodBase) { - method = (method == null) ? new WeakReference<>(httpMethodBase) : method; - return httpMethodBase.getStatusCode() == expectedStatusCode; - } - - @Override - public void describeTo(Description description) { - description.appendText("HTTP response ").appendValue(expectedStatusCode) - .appendText(" from ").appendText(method.get().getPath()); - } - - @Override - protected void describeMismatchSafely(HttpMethodBase item, Description description) { - description.appendText("got ").appendValue(item.getStatusCode()).appendText(" ") - .appendText(item.getStatusText()); - } - }; - } - - protected TypeSafeMatcher isJSON() { - return new TypeSafeMatcher() { - @Override - public boolean matchesSafely(String body) { - String b = body.trim(); - return (b.startsWith("{") && b.endsWith("}")) || (b.startsWith("[") && b.endsWith("]")); - } - - @Override - public void describeTo(Description description) { - description.appendText("response in JSON format "); - } - - @Override - protected void describeMismatchSafely(String item, Description description) { - description.appendText("got ").appendText(item); - } - }; - } - - protected TypeSafeMatcher isValidJSON() { - return new TypeSafeMatcher() { - @Override - public boolean matchesSafely(String body) { - boolean isValid = true; - try { - new JsonParser().parse(body); - } catch (JsonParseException e) { - LOG.error("Exception in AbstractTestRestApi while matchesSafely ", e); - isValid = false; - } - return isValid; - } - - @Override - public void describeTo(Description description) { - description.appendText("response in JSON format "); - } - - @Override - protected void describeMismatchSafely(String item, Description description) { - description.appendText("got ").appendText(item); - } - }; - } - - protected TypeSafeMatcher hasRootElementNamed(final String memberName) { - return new TypeSafeMatcher() { - @Override - protected boolean matchesSafely(JsonElement item) { - return item.isJsonObject() && item.getAsJsonObject().has(memberName); - } - - @Override - public void describeTo(Description description) { - description.appendText("response in JSON format with \"").appendText(memberName) - .appendText("\" beeing a root element "); - } - - @Override - protected void describeMismatchSafely(JsonElement root, Description description) { - description.appendText("got ").appendText(root.toString()); - } - }; - } - - - public static void ps() { - DefaultExecutor executor = new DefaultExecutor(); - executor.setStreamHandler(new PumpStreamHandler(System.out, System.err)); - - CommandLine cmd = CommandLine.parse("ps"); - cmd.addArgument("aux", false); - - try { - executor.execute(cmd); - } catch (IOException e) { - LOG.error(e.getMessage(), e); - } - } - - - /** Status code matcher */ - protected Matcher isForbidden() { return responsesWith(403); } - - protected Matcher isAllowed() { - return responsesWith(200); - } - - protected Matcher isCreated() { return responsesWith(201); } - - protected Matcher isBadRequest() { return responsesWith(400); } - - protected Matcher isNotFound() { return responsesWith(404); } - - protected Matcher isNotAllowed() { - return responsesWith(405); - } - -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ConfigurationsRestApiTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ConfigurationsRestApiTest.java deleted file mode 100644 index 1c1ebacd249..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ConfigurationsRestApiTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.rest; - -import com.google.common.base.Predicate; -import com.google.common.collect.Iterators; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import org.apache.commons.httpclient.methods.GetMethod; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.IOException; -import java.util.Map; - -import static org.junit.Assert.assertTrue; - -public class ConfigurationsRestApiTest extends AbstractTestRestApi { - Gson gson = new Gson(); - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUp(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Test - public void testGetAll() throws IOException { - GetMethod get = httpGet("/configurations/all"); - Map resp = gson.fromJson(get.getResponseBodyAsString(), - new TypeToken>(){}.getType()); - Map body = (Map) resp.get("body"); - assertTrue(body.size() > 0); - // it shouldn't have key/value pair which key contains "password" - assertTrue(Iterators.all(body.keySet().iterator(), new Predicate() { - @Override - public boolean apply(String key) { - return !key.contains("password"); - } - } - )); - } - - @Test - public void testGetViaPrefix() throws IOException { - final String prefix = "zeppelin.server"; - GetMethod get = httpGet("/configurations/prefix/" + prefix); - Map resp = gson.fromJson(get.getResponseBodyAsString(), - new TypeToken>(){}.getType()); - Map body = (Map) resp.get("body"); - assertTrue(body.size() > 0); - assertTrue(Iterators.all(body.keySet().iterator(), new Predicate() { - @Override - public boolean apply(String key) { - return !key.contains("password") && key.startsWith(prefix); - } - } - )); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/CredentialsRestApiTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/CredentialsRestApiTest.java deleted file mode 100644 index 29c2914991d..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/CredentialsRestApiTest.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.rest; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import org.apache.commons.httpclient.methods.DeleteMethod; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.zeppelin.notebook.Note; -import org.apache.zeppelin.server.ZeppelinServer; -import org.apache.zeppelin.user.UserCredentials; -import org.apache.zeppelin.utils.SecurityUtils; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.Map; - -import static org.junit.Assert.*; - -public class CredentialsRestApiTest extends AbstractTestRestApi { - protected static final Logger LOG = LoggerFactory.getLogger(CredentialsRestApiTest.class); - Gson gson = new Gson(); - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUp(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Test - public void testInvalidRequest() throws IOException { - String jsonInvalidRequestEntityNull = "{\"entity\" : null, \"username\" : \"test\", \"password\" : \"testpass\"}"; - String jsonInvalidRequestNameNull = "{\"entity\" : \"test\", \"username\" : null, \"password\" : \"testpass\"}"; - String jsonInvalidRequestPasswordNull = "{\"entity\" : \"test\", \"username\" : \"test\", \"password\" : null}"; - String jsonInvalidRequestAllNull = "{\"entity\" : null, \"username\" : null, \"password\" : null}"; - - PutMethod entityNullPut = httpPut("/credential", jsonInvalidRequestEntityNull); - entityNullPut.addRequestHeader("Origin", "http://localhost"); - assertThat(entityNullPut, isBadRequest()); - entityNullPut.releaseConnection(); - - PutMethod nameNullPut = httpPut("/credential", jsonInvalidRequestNameNull); - nameNullPut.addRequestHeader("Origin", "http://localhost"); - assertThat(nameNullPut, isBadRequest()); - nameNullPut.releaseConnection(); - - PutMethod passwordNullPut = httpPut("/credential", jsonInvalidRequestPasswordNull); - passwordNullPut.addRequestHeader("Origin", "http://localhost"); - assertThat(passwordNullPut, isBadRequest()); - passwordNullPut.releaseConnection(); - - PutMethod allNullPut = httpPut("/credential", jsonInvalidRequestAllNull); - allNullPut.addRequestHeader("Origin", "http://localhost"); - assertThat(allNullPut, isBadRequest()); - allNullPut.releaseConnection(); - } - - public Map testGetUserCredentials() throws IOException { - GetMethod getMethod = httpGet("/credential"); - getMethod.addRequestHeader("Origin", "http://localhost"); - Map resp = gson.fromJson(getMethod.getResponseBodyAsString(), - new TypeToken>(){}.getType()); - Map body = (Map) resp.get("body"); - Map credentialMap = (Map)body.get("userCredentials"); - getMethod.releaseConnection(); - return credentialMap; - } - - public void testPutUserCredentials(String requestData) throws IOException { - PutMethod putMethod = httpPut("/credential", requestData); - putMethod.addRequestHeader("Origin", "http://localhost"); - assertThat(putMethod, isAllowed()); - putMethod.releaseConnection(); - } - - public void testRemoveUserCredentials() throws IOException { - DeleteMethod deleteMethod = httpDelete("/credential/"); - assertThat("Test delete method:", deleteMethod, isAllowed()); - deleteMethod.releaseConnection(); - } - - public void testRemoveCredentialEntity(String entity) throws IOException { - DeleteMethod deleteMethod = httpDelete("/credential/" + entity); - assertThat("Test delete method:", deleteMethod, isAllowed()); - deleteMethod.releaseConnection(); - } - - @Test - public void testCredentialsAPIs() throws IOException { - String requestData1 = "{\"entity\" : \"entityname\", \"username\" : \"myuser\", \"password\" : \"mypass\"}"; - String entity = "entityname"; - Map credentialMap; - - testPutUserCredentials(requestData1); - credentialMap = testGetUserCredentials(); - assertNotNull("CredentialMap should be null", credentialMap); - - testRemoveCredentialEntity(entity); - credentialMap = testGetUserCredentials(); - assertNull("CredentialMap should be null", credentialMap.get("entity1")); - - testRemoveUserCredentials(); - credentialMap = testGetUserCredentials(); - assertEquals("Compare CredentialMap", credentialMap.toString(), "{}"); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/InterpreterRestApiTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/InterpreterRestApiTest.java deleted file mode 100644 index 8be4574c709..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/InterpreterRestApiTest.java +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.rest; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; -import org.apache.commons.httpclient.methods.DeleteMethod; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.zeppelin.interpreter.InterpreterOption; -import org.apache.zeppelin.interpreter.InterpreterSetting; -import org.apache.zeppelin.notebook.Note; -import org.apache.zeppelin.notebook.Paragraph; -import org.apache.zeppelin.scheduler.Job.Status; -import org.apache.zeppelin.server.ZeppelinServer; -import org.apache.zeppelin.user.AuthenticationInfo; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import com.google.gson.Gson; - -import static org.junit.Assert.*; -import static org.hamcrest.MatcherAssert.assertThat; - -/** - * Zeppelin interpreter rest api tests - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class InterpreterRestApiTest extends AbstractTestRestApi { - Gson gson = new Gson(); - AuthenticationInfo anonymous; - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUp(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Before - public void setUp() { - anonymous = new AuthenticationInfo("anonymous"); - } - - @Test - public void getAvailableInterpreters() throws IOException { - // when - GetMethod get = httpGet("/interpreter"); - JsonObject body = getBodyFieldFromResponse(get.getResponseBodyAsString()); - - // then - assertThat(get, isAllowed()); - assertEquals(ZeppelinServer.notebook.getInterpreterSettingManager().getAvailableInterpreterSettings().size(), - body.entrySet().size()); - get.releaseConnection(); - } - - @Test - public void getSettings() throws IOException { - // when - GetMethod get = httpGet("/interpreter/setting"); - // then - assertThat(get, isAllowed()); - // DO NOT REMOVE: implies that body is properly parsed as an array - JsonArray body = getArrayBodyFieldFromResponse(get.getResponseBodyAsString()); - get.releaseConnection(); - } - - @Test - public void testGetNonExistInterpreterSetting() throws IOException { - // when - String nonExistInterpreterSettingId = "apache_.zeppelin_1s_.aw3some$"; - GetMethod get = httpGet("/interpreter/setting/" + nonExistInterpreterSettingId); - - // then - assertThat("Test get method:", get, isNotFound()); - get.releaseConnection(); - } - - @Test - public void testSettingsCRUD() throws IOException { - // when: call create setting API - String rawRequest = "{\"name\":\"md2\",\"group\":\"md\",\"properties\":{\"propname\":\"propvalue\"}," + - "\"interpreterGroup\":[{\"class\":\"org.apache.zeppelin.markdown.Markdown\",\"name\":\"md\"}]," + - "\"dependencies\":[]," + - "\"option\": { \"remote\": true, \"session\": false }}"; - JsonObject jsonRequest = gson.fromJson(rawRequest, JsonElement.class).getAsJsonObject(); - PostMethod post = httpPost("/interpreter/setting/", jsonRequest.toString()); - String postResponse = post.getResponseBodyAsString(); - LOG.info("testSettingCRUD create response\n" + post.getResponseBodyAsString()); - InterpreterSetting created = convertResponseToInterpreterSetting(postResponse); - String newSettingId = created.getId(); - // then : call create setting API - assertThat("test create method:", post, isCreated()); - post.releaseConnection(); - - // when: call read setting API - GetMethod get = httpGet("/interpreter/setting/" + newSettingId); - String getResponse = get.getResponseBodyAsString(); - LOG.info("testSettingCRUD get response\n" + getResponse); - InterpreterSetting previouslyCreated = convertResponseToInterpreterSetting(getResponse); - // then : read Setting API - assertThat("Test get method:", get, isAllowed()); - assertEquals(newSettingId, previouslyCreated.getId()); - get.releaseConnection(); - - // when: call update setting API - jsonRequest.getAsJsonObject("properties").addProperty("propname2", "this is new prop"); - PutMethod put = httpPut("/interpreter/setting/" + newSettingId, jsonRequest.toString()); - LOG.info("testSettingCRUD update response\n" + put.getResponseBodyAsString()); - // then: call update setting API - assertThat("test update method:", put, isAllowed()); - put.releaseConnection(); - - // when: call delete setting API - DeleteMethod delete = httpDelete("/interpreter/setting/" + newSettingId); - LOG.info("testSettingCRUD delete response\n" + delete.getResponseBodyAsString()); - // then: call delete setting API - assertThat("Test delete method:", delete, isAllowed()); - delete.releaseConnection(); - } - - @Test - public void testCreatedInterpreterDependencies() throws IOException { - // when: Create 2 interpreter settings `md1` and `md2` which have different dep. - - String md1Name = "md1"; - String md2Name = "md2"; - - String md1Dep = "org.apache.drill.exec:drill-jdbc:jar:1.7.0"; - String md2Dep = "org.apache.drill.exec:drill-jdbc:jar:1.6.0"; - - String reqBody1 = "{\"name\":\"" + md1Name + "\",\"group\":\"md\",\"properties\":{\"propname\":\"propvalue\"}," + - "\"interpreterGroup\":[{\"class\":\"org.apache.zeppelin.markdown.Markdown\",\"name\":\"md\"}]," + - "\"dependencies\":[ {\n" + - " \"groupArtifactVersion\": \"" + md1Dep + "\",\n" + - " \"exclusions\":[]\n" + - " }]," + - "\"option\": { \"remote\": true, \"session\": false }}"; - PostMethod post = httpPost("/interpreter/setting", reqBody1); - assertThat("test create method:", post, isCreated()); - post.releaseConnection(); - - String reqBody2 = "{\"name\":\"" + md2Name + "\",\"group\":\"md\",\"properties\":{\"propname\":\"propvalue\"}," + - "\"interpreterGroup\":[{\"class\":\"org.apache.zeppelin.markdown.Markdown\",\"name\":\"md\"}]," + - "\"dependencies\":[ {\n" + - " \"groupArtifactVersion\": \"" + md2Dep + "\",\n" + - " \"exclusions\":[]\n" + - " }]," + - "\"option\": { \"remote\": true, \"session\": false }}"; - post = httpPost("/interpreter/setting", reqBody2); - assertThat("test create method:", post, isCreated()); - post.releaseConnection(); - - // 1. Call settings API - GetMethod get = httpGet("/interpreter/setting"); - String rawResponse = get.getResponseBodyAsString(); - get.releaseConnection(); - - // 2. Parsing to List - JsonObject responseJson = gson.fromJson(rawResponse, JsonElement.class).getAsJsonObject(); - JsonArray bodyArr = responseJson.getAsJsonArray("body"); - List settings = new Gson().fromJson(bodyArr, - new TypeToken>() { - }.getType()); - - // 3. Filter interpreters out we have just created - InterpreterSetting md1 = null; - InterpreterSetting md2 = null; - for (InterpreterSetting setting : settings) { - if (md1Name.equals(setting.getName())) { - md1 = setting; - } else if (md2Name.equals(setting.getName())) { - md2 = setting; - } - } - - // then: should get created interpreters which have different dependencies - - // 4. Validate each md interpreter has its own dependencies - assertEquals(1, md1.getDependencies().size()); - assertEquals(1, md2.getDependencies().size()); - assertEquals(md1Dep, md1.getDependencies().get(0).getGroupArtifactVersion()); - assertEquals(md2Dep, md2.getDependencies().get(0).getGroupArtifactVersion()); - } - - @Test - public void testSettingsCreateWithEmptyJson() throws IOException { - // Call Create Setting REST API - PostMethod post = httpPost("/interpreter/setting/", ""); - LOG.info("testSettingCRUD create response\n" + post.getResponseBodyAsString()); - assertThat("test create method:", post, isBadRequest()); - post.releaseConnection(); - } - - @Test - public void testInterpreterAutoBinding() throws IOException { - // when - Note note = ZeppelinServer.notebook.createNote(anonymous); - GetMethod get = httpGet("/notebook/interpreter/bind/" + note.getId()); - assertThat(get, isAllowed()); - get.addRequestHeader("Origin", "http://localhost"); - JsonArray body = getArrayBodyFieldFromResponse(get.getResponseBodyAsString()); - - // then: check interpreter is binded - assertTrue(0 < body.size()); - get.releaseConnection(); - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testInterpreterRestart() throws IOException, InterruptedException { - // when: create new note - Note note = ZeppelinServer.notebook.createNote(anonymous); - note.addParagraph(AuthenticationInfo.ANONYMOUS); - Paragraph p = note.getLastParagraph(); - Map config = p.getConfig(); - config.put("enabled", true); - - // when: run markdown paragraph - p.setConfig(config); - p.setText("%md markdown"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - while (p.getStatus() != Status.FINISHED) { - Thread.sleep(100); - } - assertEquals(p.getResult().message().get(0).getData(), getSimulatedMarkdownResult("markdown")); - - // when: restart interpreter - for (InterpreterSetting setting : ZeppelinServer.notebook.getInterpreterSettingManager().getInterpreterSettings(note.getId())) { - if (setting.getName().equals("md")) { - // call restart interpreter API - PutMethod put = httpPut("/interpreter/setting/restart/" + setting.getId(), ""); - assertThat("test interpreter restart:", put, isAllowed()); - put.releaseConnection(); - break; - } - } - - // when: run markdown paragraph, again - p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - p.setConfig(config); - p.setText("%md markdown restarted"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - while (p.getStatus() != Status.FINISHED) { - Thread.sleep(100); - } - - // then - assertEquals(p.getResult().message().get(0).getData(), getSimulatedMarkdownResult("markdown restarted")); - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testRestartInterpreterPerNote() throws IOException, InterruptedException { - // when: create new note - Note note = ZeppelinServer.notebook.createNote(anonymous); - note.addParagraph(AuthenticationInfo.ANONYMOUS); - Paragraph p = note.getLastParagraph(); - Map config = p.getConfig(); - config.put("enabled", true); - - // when: run markdown paragraph. - p.setConfig(config); - p.setText("%md markdown"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - while (p.getStatus() != Status.FINISHED) { - Thread.sleep(100); - } - assertEquals(p.getResult().message().get(0).getData(), getSimulatedMarkdownResult("markdown")); - - // when: get md interpreter - InterpreterSetting mdIntpSetting = null; - for (InterpreterSetting setting : ZeppelinServer.notebook.getInterpreterSettingManager().getInterpreterSettings(note.getId())) { - if (setting.getName().equals("md")) { - mdIntpSetting = setting; - break; - } - } - - String jsonRequest = "{\"noteId\":\"" + note.getId() + "\"}"; - - // Restart isolated mode of Interpreter for note. - mdIntpSetting.getOption().setPerNote(InterpreterOption.ISOLATED); - PutMethod put = httpPut("/interpreter/setting/restart/" + mdIntpSetting.getId(), jsonRequest); - assertThat("isolated interpreter restart:", put, isAllowed()); - put.releaseConnection(); - - // Restart scoped mode of Interpreter for note. - mdIntpSetting.getOption().setPerNote(InterpreterOption.SCOPED); - put = httpPut("/interpreter/setting/restart/" + mdIntpSetting.getId(), jsonRequest); - assertThat("scoped interpreter restart:", put, isAllowed()); - put.releaseConnection(); - - // Restart shared mode of Interpreter for note. - mdIntpSetting.getOption().setPerNote(InterpreterOption.SHARED); - put = httpPut("/interpreter/setting/restart/" + mdIntpSetting.getId(), jsonRequest); - assertThat("shared interpreter restart:", put, isAllowed()); - put.releaseConnection(); - - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testListRepository() throws IOException { - GetMethod get = httpGet("/interpreter/repository"); - assertThat(get, isAllowed()); - get.releaseConnection(); - } - - @Test - public void testAddDeleteRepository() throws IOException { - // Call create repository API - String repoId = "securecentral"; - String jsonRequest = "{\"id\":\"" + repoId + - "\",\"url\":\"https://repo1.maven.org/maven2\",\"snapshot\":\"false\"}"; - - PostMethod post = httpPost("/interpreter/repository/", jsonRequest); - assertThat("Test create method:", post, isCreated()); - post.releaseConnection(); - - // Call delete repository API - DeleteMethod delete = httpDelete("/interpreter/repository/" + repoId); - assertThat("Test delete method:", delete, isAllowed()); - delete.releaseConnection(); - } - - public JsonObject getBodyFieldFromResponse(String rawResponse) { - JsonObject response = gson.fromJson(rawResponse, JsonElement.class).getAsJsonObject(); - return response.getAsJsonObject("body"); - } - - public JsonArray getArrayBodyFieldFromResponse(String rawResponse) { - JsonObject response = gson.fromJson(rawResponse, JsonElement.class).getAsJsonObject(); - return response.getAsJsonArray("body"); - } - - public InterpreterSetting convertResponseToInterpreterSetting(String rawResponse) { - return gson.fromJson(getBodyFieldFromResponse(rawResponse), InterpreterSetting.class); - } - - public static String getSimulatedMarkdownResult(String markdown) { - return String.format("
\n

%s

\n
", markdown); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRepoRestApiTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRepoRestApiTest.java deleted file mode 100644 index 307339d7697..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRepoRestApiTest.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zeppelin.rest; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.CoreMatchers.anyOf; -import static org.junit.Assert.assertThat; - -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.commons.lang.StringUtils; -import org.apache.zeppelin.user.AuthenticationInfo; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -/** - * NotebookRepo rest api test. - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class NotebookRepoRestApiTest extends AbstractTestRestApi { - - Gson gson = new Gson(); - AuthenticationInfo anonymous; - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUp(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Before - public void setUp() { - anonymous = new AuthenticationInfo("anonymous"); - } - - private List> getListOfReposotiry() throws IOException { - GetMethod get = httpGet("/notebook-repositories"); - Map responce = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() {}.getType()); - get.releaseConnection(); - return (List>) responce.get("body"); - } - - private void updateNotebookRepoWithNewSetting(String payload) throws IOException { - PutMethod put = httpPut("/notebook-repositories", payload); - int status = put.getStatusCode(); - put.releaseConnection(); - assertThat(status, is(200)); - } - - @Test public void ThatCanGetNotebookRepositoiesSettings() throws IOException { - List> listOfRepositories = getListOfReposotiry(); - assertThat(listOfRepositories.size(), is(not(0))); - } - - @Test public void reloadRepositories() throws IOException { - GetMethod get = httpGet("/notebook-repositories/reload"); - int status = get.getStatusCode(); - get.releaseConnection(); - assertThat(status, is(200)); - } - - @Test public void setNewDirectoryForLocalDirectory() throws IOException { - List> listOfRepositories = getListOfReposotiry(); - String localVfs = StringUtils.EMPTY; - String className = StringUtils.EMPTY; - - for (int i = 0; i < listOfRepositories.size(); i++) { - if (listOfRepositories.get(i).get("name").equals("VFSNotebookRepo")) { - localVfs = (String) ((List>)listOfRepositories.get(i).get("settings")).get(0).get("selected"); - className = (String) listOfRepositories.get(i).get("className"); - break; - } - } - - if (StringUtils.isBlank(localVfs)) { - // no local VFS set... - return; - } - - String payload = "{ \"name\": \"" + className + "\", \"settings\" : { \"Notebook Path\" : \"/tmp/newDir\" } }"; - updateNotebookRepoWithNewSetting(payload); - - // Verify - listOfRepositories = getListOfReposotiry(); - String updatedPath = StringUtils.EMPTY; - for (int i = 0; i < listOfRepositories.size(); i++) { - if (listOfRepositories.get(i).get("name").equals("VFSNotebookRepo")) { - updatedPath = (String) ((List>)listOfRepositories.get(i).get("settings")).get(0).get("selected"); - break; - } - } - assertThat(updatedPath, anyOf(is("/tmp/newDir"),is("/tmp/newDir/"))); - - // go back to normal - payload = "{ \"name\": \"" + className + "\", \"settings\" : { \"Notebook Path\" : \"" + localVfs + "\" } }"; - updateNotebookRepoWithNewSetting(payload); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRestApiTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRestApiTest.java deleted file mode 100644 index 5c7aec2760f..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRestApiTest.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.rest; - -import com.google.common.collect.Lists; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.zeppelin.interpreter.InterpreterResult; -import org.apache.zeppelin.notebook.Note; -import org.apache.zeppelin.notebook.Paragraph; -import org.apache.zeppelin.scheduler.Job; -import org.apache.zeppelin.server.ZeppelinServer; -import org.apache.zeppelin.user.AuthenticationInfo; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import java.io.IOException; -import java.util.Map; -import java.util.Set; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; - -/** - * Zeppelin notebook rest api tests - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class NotebookRestApiTest extends AbstractTestRestApi { - Gson gson = new Gson(); - AuthenticationInfo anonymous; - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUp(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Before - public void setUp() { - anonymous = new AuthenticationInfo("anonymous"); - } - - @Test - public void testGetNoteParagraphJobStatus() throws IOException { - Note note1 = ZeppelinServer.notebook.createNote(anonymous); - note1.addParagraph(AuthenticationInfo.ANONYMOUS); - - String paragraphId = note1.getLastParagraph().getId(); - - GetMethod get = httpGet("/notebook/job/" + note1.getId() + "/" + paragraphId); - assertThat(get, isAllowed()); - Map resp = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - Map> paragraphStatus = (Map>) resp.get("body"); - - // Check id and status have proper value - assertEquals(paragraphStatus.get("id"), paragraphId); - assertEquals(paragraphStatus.get("status"), "READY"); - - //cleanup - ZeppelinServer.notebook.removeNote(note1.getId(), anonymous); - - } - - @Test - public void testRunParagraphJob() throws IOException { - Note note1 = ZeppelinServer.notebook.createNote(anonymous); - note1.addParagraph(AuthenticationInfo.ANONYMOUS); - - Paragraph p = note1.addParagraph(AuthenticationInfo.ANONYMOUS); - - // run blank paragraph - PostMethod post = httpPost("/notebook/job/" + note1.getId() + "/" + p.getId(), ""); - assertThat(post, isAllowed()); - Map resp = gson.fromJson(post.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - assertEquals(resp.get("status"), "OK"); - post.releaseConnection(); - assertEquals(p.getStatus(), Job.Status.FINISHED); - - // run non-blank paragraph - p.setText("test"); - post = httpPost("/notebook/job/" + note1.getId() + "/" + p.getId(), ""); - assertThat(post, isAllowed()); - resp = gson.fromJson(post.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - assertEquals(resp.get("status"), "OK"); - post.releaseConnection(); - assertNotEquals(p.getStatus(), Job.Status.READY); - - //cleanup - ZeppelinServer.notebook.removeNote(note1.getId(), anonymous); - } - - @Test - public void testCloneNote() throws IOException { - Note note1 = ZeppelinServer.notebook.createNote(anonymous); - PostMethod post = httpPost("/notebook/" + note1.getId(), ""); - LOG.info("testCloneNote response\n" + post.getResponseBodyAsString()); - assertThat(post, isCreated()); - Map resp = gson.fromJson(post.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - String clonedNoteId = (String) resp.get("body"); - post.releaseConnection(); - - GetMethod get = httpGet("/notebook/" + clonedNoteId); - assertThat(get, isAllowed()); - Map resp2 = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - Map resp2Body = (Map) resp2.get("body"); - - assertEquals((String)resp2Body.get("name"), "Note " + clonedNoteId); - get.releaseConnection(); - - //cleanup - ZeppelinServer.notebook.removeNote(note1.getId(), anonymous); - ZeppelinServer.notebook.removeNote(clonedNoteId, anonymous); - } - - @Test - public void testUpdateParagraphConfig() throws IOException { - Note note = ZeppelinServer.notebook.createNote(anonymous); - String noteId = note.getId(); - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - assertNull(p.getConfig().get("colWidth")); - String paragraphId = p.getId(); - String jsonRequest = "{\"colWidth\": 6.0}"; - - PutMethod put = httpPut("/notebook/" + noteId + "/paragraph/" + paragraphId +"/config", jsonRequest); - assertThat("test testUpdateParagraphConfig:", put, isAllowed()); - - Map resp = gson.fromJson(put.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - Map respBody = (Map) resp.get("body"); - Map config = (Map) respBody.get("config"); - put.releaseConnection(); - - assertEquals(config.get("colWidth"), 6.0); - note = ZeppelinServer.notebook.getNote(noteId); - assertEquals(note.getParagraph(paragraphId).getConfig().get("colWidth"), 6.0); - - //cleanup - ZeppelinServer.notebook.removeNote(noteId, anonymous); - } - - @Test - public void testClearAllParagraphOutput() throws IOException { - // Create note and set result explicitly - Note note = ZeppelinServer.notebook.createNote(anonymous); - Paragraph p1 = note.addParagraph(AuthenticationInfo.ANONYMOUS); - InterpreterResult result = new InterpreterResult(InterpreterResult.Code.SUCCESS, InterpreterResult.Type.TEXT, "result"); - p1.setResult(result); - - Paragraph p2 = note.addParagraph(AuthenticationInfo.ANONYMOUS); - p2.setReturn(result, new Throwable()); - - // clear paragraph result - PutMethod put = httpPut("/notebook/" + note.getId() + "/clear", ""); - LOG.info("test clear paragraph output response\n" + put.getResponseBodyAsString()); - assertThat(put, isAllowed()); - put.releaseConnection(); - - // check if paragraph results are cleared - GetMethod get = httpGet("/notebook/" + note.getId() + "/paragraph/" + p1.getId()); - assertThat(get, isAllowed()); - Map resp1 = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - Map resp1Body = (Map) resp1.get("body"); - assertNull(resp1Body.get("result")); - - get = httpGet("/notebook/" + note.getId() + "/paragraph/" + p2.getId()); - assertThat(get, isAllowed()); - Map resp2 = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - Map resp2Body = (Map) resp2.get("body"); - assertNull(resp2Body.get("result")); - get.releaseConnection(); - - //cleanup - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookSecurityRestApiTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookSecurityRestApiTest.java deleted file mode 100644 index 0f4a44083b7..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookSecurityRestApiTest.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zeppelin.rest; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; -import static org.junit.Assert.assertEquals; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Map; - -import org.apache.commons.httpclient.HttpMethodBase; -import org.apache.commons.httpclient.methods.DeleteMethod; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.zeppelin.notebook.Note; -import org.apache.zeppelin.server.ZeppelinServer; -import org.hamcrest.Matcher; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -public class NotebookSecurityRestApiTest extends AbstractTestRestApi { - - Gson gson = new Gson(); - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUpWithAuthenticationEnable(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Before - public void setUp() {} - - - @Test - public void testThatUserCanCreateAndRemoveNote() throws IOException { - String noteId = createNoteForUser("test", "admin", "password1"); - assertNotNull(noteId); - String id = getNoteIdForUser(noteId, "admin", "password1"); - assertThat(id, is(noteId)); - deleteNoteForUser(noteId, "admin", "password1"); - } - - @Test - public void testThatOtherUserCanAccessNoteIfPermissionNotSet() throws IOException { - String noteId = createNoteForUser("test", "admin", "password1"); - - userTryGetNote(noteId, "user1", "password2", isAllowed()); - - deleteNoteForUser(noteId, "admin", "password1"); - } - - @Test - public void testThatOtherUserCannotAccessNoteIfPermissionSet() throws IOException { - String noteId = createNoteForUser("test", "admin", "password1"); - - //set permission - String payload = "{ \"owners\": [\"admin\"], \"readers\": [\"user2\"], \"writers\": [\"user2\"] }"; - PutMethod put = httpPut("/notebook/" + noteId + "/permissions", payload , "admin", "password1"); - assertThat("test set note permission method:", put, isAllowed()); - put.releaseConnection(); - - userTryGetNote(noteId, "user1", "password2", isForbidden()); - - userTryGetNote(noteId, "user2", "password3", isAllowed()); - - deleteNoteForUser(noteId, "admin", "password1"); - } - - @Test - public void testThatWriterCannotRemoveNote() throws IOException { - String noteId = createNoteForUser("test", "admin", "password1"); - - //set permission - String payload = "{ \"owners\": [\"admin\", \"user1\"], \"readers\": [\"user2\"], \"writers\": [\"user2\"] }"; - PutMethod put = httpPut("/notebook/" + noteId + "/permissions", payload , "admin", "password1"); - assertThat("test set note permission method:", put, isAllowed()); - put.releaseConnection(); - - userTryRemoveNote(noteId, "user2", "password3", isForbidden()); - userTryRemoveNote(noteId, "user1", "password2", isAllowed()); - - Note deletedNote = ZeppelinServer.notebook.getNote(noteId); - assertNull("Deleted note should be null", deletedNote); - } - - @Test - public void testThatUserCanSearchNote() throws IOException { - String noteId1 = createNoteForUser("test1", "admin", "password1"); - createParagraphForUser(noteId1, "admin", "password1", "title1", "ThisIsToTestSearchMethodWithPermissions 1"); - - String noteId2 = createNoteForUser("test2", "user1", "password2"); - createParagraphForUser(noteId1, "admin", "password1", "title2", "ThisIsToTestSearchMethodWithPermissions 2"); - - //set permission for each note - setPermissionForNote(noteId1, "admin", "password1"); - setPermissionForNote(noteId1, "user1", "password2"); - - searchNoteBasedOnPermission("ThisIsToTestSearchMethodWithPermissions", "admin", "password1"); - - deleteNoteForUser(noteId1, "admin", "password1"); - deleteNoteForUser(noteId2, "user1", "password2"); - } - - private void userTryRemoveNote(String noteId, String user, String pwd, Matcher m) throws IOException { - DeleteMethod delete = httpDelete(("/notebook/" + noteId), user, pwd); - assertThat(delete, m); - delete.releaseConnection(); - } - - private void userTryGetNote(String noteId, String user, String pwd, Matcher m) throws IOException { - GetMethod get = httpGet("/notebook/" + noteId, user, pwd); - assertThat(get, m); - get.releaseConnection(); - } - - private String getNoteIdForUser(String noteId, String user, String pwd) throws IOException { - GetMethod get = httpGet("/notebook/" + noteId, user, pwd); - assertThat("test note create method:", get, isAllowed()); - Map resp = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - get.releaseConnection(); - return (String) ((Map)resp.get("body")).get("id"); - } - - private String createNoteForUser(String noteName, String user, String pwd) throws IOException { - String jsonRequest = "{\"name\":\"" + noteName + "\"}"; - PostMethod post = httpPost("/notebook/", jsonRequest, user, pwd); - assertThat("test note create method:", post, isCreated()); - Map resp = gson.fromJson(post.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - post.releaseConnection(); - String newNoteId = (String) resp.get("body"); - Note newNote = ZeppelinServer.notebook.getNote(newNoteId); - assertNotNull("Can not find new note by id", newNote); - return newNoteId; - } - - private void deleteNoteForUser(String noteId, String user, String pwd) throws IOException { - DeleteMethod delete = httpDelete(("/notebook/" + noteId), user, pwd); - assertThat("Test delete method:", delete, isAllowed()); - delete.releaseConnection(); - // make sure note is deleted - if (!noteId.isEmpty()) { - Note deletedNote = ZeppelinServer.notebook.getNote(noteId); - assertNull("Deleted note should be null", deletedNote); - } - } - - private void createParagraphForUser(String noteId, String user, String pwd, String title, String text) throws IOException { - String payload = "{\"title\": \"" + title + "\",\"text\": \"" + text + "\"}"; - PostMethod post = httpPost(("/notebook/" + noteId + "/paragraph"), payload, user, pwd); - post.releaseConnection(); - } - - private void setPermissionForNote(String noteId, String user, String pwd) throws IOException { - String payload = "{\"owners\":[\"" + user + "\"],\"readers\":[\"" + user + "\"],\"writers\":[\"" + user + "\"]}"; - PutMethod put = httpPut(("/notebook/" + noteId + "/permissions"), payload, user, pwd); - put.releaseConnection(); - } - - - private void searchNoteBasedOnPermission(String searchText, String user, String pwd) throws IOException{ - GetMethod searchNote = httpGet(("/notebook/search?q=" + searchText), user, pwd); - Map respSearchResult = gson.fromJson(searchNote.getResponseBodyAsString(), - new TypeToken>() { - }.getType()); - ArrayList searchBody = (ArrayList) respSearchResult.get("body"); - assertEquals("At-least one search results is there", true, searchBody.size() >= 1); - - for (int i = 0; i < searchBody.size(); i++) { - Map searchResult = (Map) searchBody.get(i); - String userId = searchResult.get("id").split("/", 2)[0]; - - GetMethod getPermission = httpGet(("/notebook/" + userId + "/permissions"), user, pwd); - Map resp = gson.fromJson(getPermission.getResponseBodyAsString(), - new TypeToken>() { - }.getType()); - Map permissions = (Map) resp.get("body"); - ArrayList owners = permissions.get("owners"); - ArrayList readers = permissions.get("readers"); - ArrayList writers = permissions.get("writers"); - - if (owners.size() != 0 && readers.size() != 0 && writers.size() != 0) { - assertEquals("User has permissions ", true, (owners.contains(user) || readers.contains(user) || - writers.contains(user))); - } - getPermission.releaseConnection(); - } - searchNote.releaseConnection(); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/SecurityRestApiTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/SecurityRestApiTest.java deleted file mode 100644 index bc38f740328..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/SecurityRestApiTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.rest; - -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import org.apache.commons.httpclient.methods.GetMethod; -import org.hamcrest.CoreMatchers; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ErrorCollector; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -public class SecurityRestApiTest extends AbstractTestRestApi { - Gson gson = new Gson(); - - @Rule - public ErrorCollector collector = new ErrorCollector(); - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUpWithAuthenticationEnable(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Test - public void testTicket() throws IOException { - GetMethod get = httpGet("/security/ticket", "admin", "password1"); - get.addRequestHeader("Origin", "http://localhost"); - Map resp = gson.fromJson(get.getResponseBodyAsString(), - new TypeToken>(){}.getType()); - Map body = (Map) resp.get("body"); - collector.checkThat("Paramater principal", body.get("principal"), - CoreMatchers.equalTo("admin")); - collector.checkThat("Paramater ticket", body.get("ticket"), - CoreMatchers.not("anonymous")); - get.releaseConnection(); - } - - @Test - public void testGetUserList() throws IOException { - GetMethod get = httpGet("/security/userlist/admi", "admin", "password1"); - get.addRequestHeader("Origin", "http://localhost"); - Map resp = gson.fromJson(get.getResponseBodyAsString(), - new TypeToken>(){}.getType()); - List userList = (List) ((Map) resp.get("body")).get("users"); - collector.checkThat("Search result size", userList.size(), - CoreMatchers.equalTo(1)); - collector.checkThat("Search result contains admin", userList.contains("admin"), - CoreMatchers.equalTo(true)); - get.releaseConnection(); - - GetMethod notUser = httpGet("/security/userlist/randomString", "admin", "password1"); - notUser.addRequestHeader("Origin", "http://localhost"); - Map notUserResp = gson.fromJson(notUser.getResponseBodyAsString(), - new TypeToken>(){}.getType()); - List emptyUserList = (List) ((Map) notUserResp.get("body")).get("users"); - collector.checkThat("Search result size", emptyUserList.size(), - CoreMatchers.equalTo(0)); - - notUser.releaseConnection(); - } -} - diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java deleted file mode 100644 index 9fa6c512b54..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java +++ /dev/null @@ -1,734 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.rest; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; - -import com.google.common.collect.Sets; -import org.apache.commons.httpclient.methods.DeleteMethod; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.commons.lang3.StringUtils; -import org.apache.zeppelin.notebook.Note; -import org.apache.zeppelin.notebook.Paragraph; -import org.apache.zeppelin.server.ZeppelinServer; -import org.apache.zeppelin.user.AuthenticationInfo; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -import static org.junit.Assert.*; - -/** - * BASIC Zeppelin rest api tests - * - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class ZeppelinRestApiTest extends AbstractTestRestApi { - Gson gson = new Gson(); - AuthenticationInfo anonymous; - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUp(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Before - public void setUp() { - anonymous = new AuthenticationInfo("anonymous"); - } - - /*** - * ROOT API TEST - ***/ - @Test - public void getApiRoot() throws IOException { - // when - GetMethod httpGetRoot = httpGet("/"); - // then - assertThat(httpGetRoot, isAllowed()); - httpGetRoot.releaseConnection(); - } - - @Test - public void testGetNoteInfo() throws IOException { - LOG.info("testGetNoteInfo"); - // Create note to get info - Note note = ZeppelinServer.notebook.createNote(anonymous); - assertNotNull("can't create new note", note); - note.setName("note"); - Paragraph paragraph = note.addParagraph(AuthenticationInfo.ANONYMOUS); - Map config = paragraph.getConfig(); - config.put("enabled", true); - paragraph.setConfig(config); - String paragraphText = "%md This is my new paragraph in my new note"; - paragraph.setText(paragraphText); - note.persist(anonymous); - - String sourceNoteId = note.getId(); - GetMethod get = httpGet("/notebook/" + sourceNoteId); - LOG.info("testGetNoteInfo \n" + get.getResponseBodyAsString()); - assertThat("test note get method:", get, isAllowed()); - - Map resp = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - - assertNotNull(resp); - assertEquals("OK", resp.get("status")); - - Map body = (Map) resp.get("body"); - List> paragraphs = (List>) body.get("paragraphs"); - - assertTrue(paragraphs.size() > 0); - assertEquals(paragraphText, paragraphs.get(0).get("text")); - // - ZeppelinServer.notebook.removeNote(sourceNoteId, anonymous); - } - - @Test - public void testNoteCreateWithName() throws IOException { - String noteName = "Test note name"; - testNoteCreate(noteName); - } - - @Test - public void testNoteCreateNoName() throws IOException { - testNoteCreate(""); - } - - @Test - public void testNoteCreateWithParagraphs() throws IOException { - // Call Create Note REST API - String noteName = "test"; - String jsonRequest = "{\"name\":\"" + noteName + "\", \"paragraphs\": [" + - "{\"title\": \"title1\", \"text\": \"text1\"}," + - "{\"title\": \"title2\", \"text\": \"text2\"}" + - "]}"; - PostMethod post = httpPost("/notebook/", jsonRequest); - LOG.info("testNoteCreate \n" + post.getResponseBodyAsString()); - assertThat("test note create method:", post, isCreated()); - - Map resp = gson.fromJson(post.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - - String newNoteId = (String) resp.get("body"); - LOG.info("newNoteId:=" + newNoteId); - Note newNote = ZeppelinServer.notebook.getNote(newNoteId); - assertNotNull("Can not find new note by id", newNote); - // This is partial test as newNote is in memory but is not persistent - String newNoteName = newNote.getName(); - LOG.info("new note name is: " + newNoteName); - String expectedNoteName = noteName; - if (noteName.isEmpty()) { - expectedNoteName = "Note " + newNoteId; - } - assertEquals("compare note name", expectedNoteName, newNoteName); - assertEquals("initial paragraph check failed", 3, newNote.getParagraphs().size()); - for (Paragraph p : newNote.getParagraphs()) { - if (StringUtils.isEmpty(p.getText())) { - continue; - } - assertTrue("paragraph title check failed", p.getTitle().startsWith("title")); - assertTrue("paragraph text check failed", p.getText().startsWith("text")); - } - // cleanup - ZeppelinServer.notebook.removeNote(newNoteId, anonymous); - post.releaseConnection(); - } - - private void testNoteCreate(String noteName) throws IOException { - // Call Create Note REST API - String jsonRequest = "{\"name\":\"" + noteName + "\"}"; - PostMethod post = httpPost("/notebook/", jsonRequest); - LOG.info("testNoteCreate \n" + post.getResponseBodyAsString()); - assertThat("test note create method:", post, isCreated()); - - Map resp = gson.fromJson(post.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - - String newNoteId = (String) resp.get("body"); - LOG.info("newNoteId:=" + newNoteId); - Note newNote = ZeppelinServer.notebook.getNote(newNoteId); - assertNotNull("Can not find new note by id", newNote); - // This is partial test as newNote is in memory but is not persistent - String newNoteName = newNote.getName(); - LOG.info("new note name is: " + newNoteName); - String expectedNoteName = noteName; - if (noteName.isEmpty()) { - expectedNoteName = "Note " + newNoteId; - } - assertEquals("compare note name", expectedNoteName, newNoteName); - // cleanup - ZeppelinServer.notebook.removeNote(newNoteId, anonymous); - post.releaseConnection(); - - } - - @Test - public void testDeleteNote() throws IOException { - LOG.info("testDeleteNote"); - //Create note and get ID - Note note = ZeppelinServer.notebook.createNote(anonymous); - String noteId = note.getId(); - testDeleteNote(noteId); - } - - @Test - public void testDeleteNoteBadId() throws IOException { - LOG.info("testDeleteNoteBadId"); - testDeleteNote("2AZFXEX97"); - testDeleteNote("bad_ID"); - } - - - @Test - public void testexportNote() throws IOException { - LOG.info("testexportNote"); - Note note = ZeppelinServer.notebook.createNote(anonymous); - assertNotNull("can't create new note", note); - note.setName("source note for export"); - Paragraph paragraph = note.addParagraph(AuthenticationInfo.ANONYMOUS); - 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(anonymous); - String sourceNoteId = note.getId(); - // Call export Note REST API - GetMethod get = httpGet("/notebook/export/" + sourceNoteId); - LOG.info("testNoteExport \n" + get.getResponseBodyAsString()); - assertThat("test note export method:", get, isAllowed()); - - Map resp = - gson.fromJson(get.getResponseBodyAsString(), - new TypeToken>() {}.getType()); - - String exportJSON = (String) resp.get("body"); - assertNotNull("Can not find new notejson", exportJSON); - LOG.info("export JSON:=" + exportJSON); - ZeppelinServer.notebook.removeNote(sourceNoteId, anonymous); - get.releaseConnection(); - - } - - @Test - public void testImportNotebook() throws IOException { - Map resp; - String noteName = "source note for import"; - LOG.info("testImortNote"); - // create test note - Note note = ZeppelinServer.notebook.createNote(anonymous); - assertNotNull("can't create new note", note); - note.setName(noteName); - Paragraph paragraph = note.addParagraph(AuthenticationInfo.ANONYMOUS); - 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(anonymous); - String sourceNoteId = note.getId(); - // get note content as JSON - String oldJson = getNoteContent(sourceNoteId); - // call note post - PostMethod importPost = httpPost("/notebook/import/", oldJson); - assertThat(importPost, isCreated()); - resp = - gson.fromJson(importPost.getResponseBodyAsString(), - new TypeToken>() {}.getType()); - String importId = (String) resp.get("body"); - - assertNotNull("Did not get back a note id in body", importId); - Note newNote = ZeppelinServer.notebook.getNote(importId); - assertEquals("Compare note names", noteName, newNote.getName()); - assertEquals("Compare paragraphs count", note.getParagraphs().size(), newNote.getParagraphs() - .size()); - // cleanup - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - ZeppelinServer.notebook.removeNote(newNote.getId(), anonymous); - importPost.releaseConnection(); - } - - private String getNoteContent(String id) throws IOException { - GetMethod get = httpGet("/notebook/export/" + id); - assertThat(get, isAllowed()); - get.addRequestHeader("Origin", "http://localhost"); - Map resp = - gson.fromJson(get.getResponseBodyAsString(), - new TypeToken>() {}.getType()); - assertEquals(200, get.getStatusCode()); - String body = resp.get("body").toString(); - // System.out.println("Body is " + body); - get.releaseConnection(); - return body; - } - - private void testDeleteNote(String noteId) throws IOException { - - DeleteMethod delete = httpDelete(("/notebook/" + noteId)); - LOG.info("testDeleteNote delete response\n" + delete.getResponseBodyAsString()); - assertThat("Test delete method:", delete, isAllowed()); - delete.releaseConnection(); - // make sure note is deleted - if (!noteId.isEmpty()) { - Note deletedNote = ZeppelinServer.notebook.getNote(noteId); - assertNull("Deleted note should be null", deletedNote); - } - } - - @Test - public void testCloneNote() throws IOException, CloneNotSupportedException, IllegalArgumentException { - LOG.info("testCloneNote"); - // Create note to clone - Note note = ZeppelinServer.notebook.createNote(anonymous); - assertNotNull("can't create new note", note); - note.setName("source note for clone"); - Paragraph paragraph = note.addParagraph(AuthenticationInfo.ANONYMOUS); - 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(anonymous); - String sourceNoteId = note.getId(); - - String noteName = "clone Note Name"; - // Call Clone Note REST API - String jsonRequest = "{\"name\":\"" + noteName + "\"}"; - PostMethod post = httpPost("/notebook/" + sourceNoteId, jsonRequest); - LOG.info("testNoteClone \n" + post.getResponseBodyAsString()); - assertThat("test note clone method:", post, isCreated()); - - Map resp = gson.fromJson(post.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - - String newNoteId = (String) resp.get("body"); - LOG.info("newNoteId:=" + newNoteId); - Note newNote = ZeppelinServer.notebook.getNote(newNoteId); - assertNotNull("Can not find new note by id", newNote); - assertEquals("Compare note names", noteName, newNote.getName()); - assertEquals("Compare paragraphs count", note.getParagraphs().size(), newNote.getParagraphs().size()); - //cleanup - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - ZeppelinServer.notebook.removeNote(newNote.getId(), anonymous); - post.releaseConnection(); - } - - @Test - public void testListNotes() throws IOException { - LOG.info("testListNotes"); - GetMethod get = httpGet("/notebook/ "); - assertThat("List notes method", get, isAllowed()); - Map resp = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - List> body = (List>) resp.get("body"); - //TODO(khalid): anonymous or specific user notes? - HashSet anonymous = Sets.newHashSet("anonymous"); - assertEquals("List notes are equal", ZeppelinServer.notebook.getAllNotes(anonymous).size(), body.size()); - get.releaseConnection(); - } - - @Test - public void testNoteJobs() throws IOException, InterruptedException { - LOG.info("testNoteJobs"); - // Create note to run test. - Note note = ZeppelinServer.notebook.createNote(anonymous); - assertNotNull("can't create new note", note); - note.setName("note for run test"); - Paragraph paragraph = note.addParagraph(AuthenticationInfo.ANONYMOUS); - - Map config = paragraph.getConfig(); - config.put("enabled", true); - paragraph.setConfig(config); - - paragraph.setText("%md This is test paragraph."); - note.persist(anonymous); - String noteId = note.getId(); - - note.runAll(); - // wait until job is finished or timeout. - int timeout = 1; - while (!paragraph.isTerminated()) { - Thread.sleep(1000); - if (timeout++ > 10) { - LOG.info("testNoteJobs timeout job."); - break; - } - } - - // Call Run note jobs REST API - PostMethod postNoteJobs = httpPost("/notebook/job/" + noteId, ""); - assertThat("test note jobs run:", postNoteJobs, isAllowed()); - postNoteJobs.releaseConnection(); - - // Call Stop note jobs REST API - DeleteMethod deleteNoteJobs = httpDelete("/notebook/job/" + noteId); - assertThat("test note stop:", deleteNoteJobs, isAllowed()); - deleteNoteJobs.releaseConnection(); - Thread.sleep(1000); - - // Call Run paragraph REST API - PostMethod postParagraph = httpPost("/notebook/job/" + noteId + "/" + paragraph.getId(), ""); - assertThat("test paragraph run:", postParagraph, isAllowed()); - postParagraph.releaseConnection(); - Thread.sleep(1000); - - // Call Stop paragraph REST API - DeleteMethod deleteParagraph = httpDelete("/notebook/job/" + noteId + "/" + paragraph.getId()); - assertThat("test paragraph stop:", deleteParagraph, isAllowed()); - deleteParagraph.releaseConnection(); - Thread.sleep(1000); - - //cleanup - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testGetNoteJob() throws IOException, InterruptedException { - LOG.info("testGetNoteJob"); - // Create note to run test. - Note note = ZeppelinServer.notebook.createNote(anonymous); - assertNotNull("can't create new note", note); - note.setName("note for run test"); - Paragraph paragraph = note.addParagraph(AuthenticationInfo.ANONYMOUS); - - Map config = paragraph.getConfig(); - config.put("enabled", true); - paragraph.setConfig(config); - - paragraph.setText("%sh sleep 1"); - paragraph.setAuthenticationInfo(anonymous); - note.persist(anonymous); - String noteId = note.getId(); - - note.runAll(); - - // wait until paragraph gets started - while (!paragraph.getStatus().isRunning()) { - Thread.sleep(100); - } - - // assume that status of the paragraph is running - GetMethod get = httpGet("/notebook/job/" + noteId); - assertThat("test get note job: ", get, isAllowed()); - String responseBody = get.getResponseBodyAsString(); - get.releaseConnection(); - - LOG.info("test get note job: \n" + responseBody); - Map resp = gson.fromJson(responseBody, new TypeToken>() { - }.getType()); - - List> paragraphs = (List>) resp.get("body"); - assertEquals(1, paragraphs.size()); - assertTrue(paragraphs.get(0).containsKey("progress")); - int progress = Integer.parseInt((String) paragraphs.get(0).get("progress")); - assertTrue(progress >= 0 && progress <= 100); - - // wait until job is finished or timeout. - int timeout = 1; - while (!paragraph.isTerminated()) { - Thread.sleep(100); - if (timeout++ > 10) { - LOG.info("testGetNoteJob timeout job."); - break; - } - } - - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testRunParagraphWithParams() throws IOException, InterruptedException { - LOG.info("testRunParagraphWithParams"); - // Create note to run test. - Note note = ZeppelinServer.notebook.createNote(anonymous); - assertNotNull("can't create new note", note); - note.setName("note for run test"); - Paragraph paragraph = note.addParagraph(AuthenticationInfo.ANONYMOUS); - - Map config = paragraph.getConfig(); - config.put("enabled", true); - paragraph.setConfig(config); - - paragraph.setText("%spark\nval param = z.input(\"param\").toString\nprintln(param)"); - note.persist(anonymous); - String noteId = note.getId(); - - note.runAll(); - // wait until job is finished or timeout. - int timeout = 1; - while (!paragraph.isTerminated()) { - Thread.sleep(1000); - if (timeout++ > 120) { - LOG.info("testRunParagraphWithParams timeout job."); - break; - } - } - - // Call Run paragraph REST API - PostMethod postParagraph = httpPost("/notebook/job/" + noteId + "/" + paragraph.getId(), - "{\"params\": {\"param\": \"hello\", \"param2\": \"world\"}}"); - assertThat("test paragraph run:", postParagraph, isAllowed()); - postParagraph.releaseConnection(); - Thread.sleep(1000); - - Note retrNote = ZeppelinServer.notebook.getNote(noteId); - Paragraph retrParagraph = retrNote.getParagraph(paragraph.getId()); - Map params = retrParagraph.settings.getParams(); - assertEquals("hello", params.get("param")); - assertEquals("world", params.get("param2")); - - //cleanup - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testJobs() throws InterruptedException, IOException{ - // create a note and a paragraph - Note note = ZeppelinServer.notebook.createNote(anonymous); - - note.setName("note for run test"); - Paragraph paragraph = note.addParagraph(AuthenticationInfo.ANONYMOUS); - paragraph.setText("%md This is test paragraph."); - - Map config = paragraph.getConfig(); - config.put("enabled", true); - paragraph.setConfig(config); - - note.runAll(); - // wait until job is finished or timeout. - int timeout = 1; - while (!paragraph.isTerminated()) { - Thread.sleep(1000); - if (timeout++ > 10) { - LOG.info("testNoteJobs timeout job."); - break; - } - } - - String jsonRequest = "{\"cron\":\"* * * * * ?\" }"; - // right cron expression but not exist note. - PostMethod postCron = httpPost("/notebook/cron/notexistnote", jsonRequest); - assertThat("", postCron, isNotFound()); - postCron.releaseConnection(); - - // right cron expression. - postCron = httpPost("/notebook/cron/" + note.getId(), jsonRequest); - assertThat("", postCron, isAllowed()); - postCron.releaseConnection(); - Thread.sleep(1000); - - // wrong cron expression. - jsonRequest = "{\"cron\":\"a * * * * ?\" }"; - postCron = httpPost("/notebook/cron/" + note.getId(), jsonRequest); - assertThat("", postCron, isBadRequest()); - postCron.releaseConnection(); - Thread.sleep(1000); - - // remove cron job. - DeleteMethod deleteCron = httpDelete("/notebook/cron/" + note.getId()); - assertThat("", deleteCron, isAllowed()); - deleteCron.releaseConnection(); - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testRegressionZEPPELIN_527() throws IOException { - Note note = ZeppelinServer.notebook.createNote(anonymous); - - note.setName("note for run test"); - Paragraph paragraph = note.addParagraph(AuthenticationInfo.ANONYMOUS); - paragraph.setText("%spark\nval param = z.input(\"param\").toString\nprintln(param)"); - - note.persist(anonymous); - - GetMethod getNoteJobs = httpGet("/notebook/job/" + note.getId()); - assertThat("test note jobs run:", getNoteJobs, isAllowed()); - Map resp = gson.fromJson(getNoteJobs.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - List> body = (List>) resp.get("body"); - assertFalse(body.get(0).containsKey("started")); - assertFalse(body.get(0).containsKey("finished")); - getNoteJobs.releaseConnection(); - - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testInsertParagraph() throws IOException { - Note note = ZeppelinServer.notebook.createNote(anonymous); - - String jsonRequest = "{\"title\": \"title1\", \"text\": \"text1\"}"; - PostMethod post = httpPost("/notebook/" + note.getId() + "/paragraph", jsonRequest); - LOG.info("testInsertParagraph response\n" + post.getResponseBodyAsString()); - assertThat("Test insert method:", post, isCreated()); - post.releaseConnection(); - - Map resp = gson.fromJson(post.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - - String newParagraphId = (String) resp.get("body"); - LOG.info("newParagraphId:=" + newParagraphId); - - Note retrNote = ZeppelinServer.notebook.getNote(note.getId()); - Paragraph newParagraph = retrNote.getParagraph(newParagraphId); - assertNotNull("Can not find new paragraph by id", newParagraph); - - assertEquals("title1", newParagraph.getTitle()); - assertEquals("text1", newParagraph.getText()); - - Paragraph lastParagraph = note.getLastParagraph(); - assertEquals(newParagraph.getId(), lastParagraph.getId()); - - // insert to index 0 - String jsonRequest2 = "{\"index\": 0, \"title\": \"title2\", \"text\": \"text2\"}"; - PostMethod post2 = httpPost("/notebook/" + note.getId() + "/paragraph", jsonRequest2); - LOG.info("testInsertParagraph response2\n" + post2.getResponseBodyAsString()); - assertThat("Test insert method:", post2, isCreated()); - post2.releaseConnection(); - - Paragraph paragraphAtIdx0 = note.getParagraphs().get(0); - assertEquals("title2", paragraphAtIdx0.getTitle()); - assertEquals("text2", paragraphAtIdx0.getText()); - - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testGetParagraph() throws IOException { - Note note = ZeppelinServer.notebook.createNote(anonymous); - - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - p.setTitle("hello"); - p.setText("world"); - note.persist(anonymous); - - GetMethod get = httpGet("/notebook/" + note.getId() + "/paragraph/" + p.getId()); - LOG.info("testGetParagraph response\n" + get.getResponseBodyAsString()); - assertThat("Test get method: ", get, isAllowed()); - get.releaseConnection(); - - Map resp = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() { - }.getType()); - - assertNotNull(resp); - assertEquals("OK", resp.get("status")); - - Map body = (Map) resp.get("body"); - - assertEquals(p.getId(), body.get("id")); - assertEquals("hello", body.get("title")); - assertEquals("world", body.get("text")); - - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testMoveParagraph() throws IOException { - Note note = ZeppelinServer.notebook.createNote(anonymous); - - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - p.setTitle("title1"); - p.setText("text1"); - - Paragraph p2 = note.addParagraph(AuthenticationInfo.ANONYMOUS); - p2.setTitle("title2"); - p2.setText("text2"); - - note.persist(anonymous); - - PostMethod post = httpPost("/notebook/" + note.getId() + "/paragraph/" + p2.getId() + "/move/" + 0, ""); - assertThat("Test post method: ", post, isAllowed()); - post.releaseConnection(); - - Note retrNote = ZeppelinServer.notebook.getNote(note.getId()); - Paragraph paragraphAtIdx0 = retrNote.getParagraphs().get(0); - - assertEquals(p2.getId(), paragraphAtIdx0.getId()); - assertEquals(p2.getTitle(), paragraphAtIdx0.getTitle()); - assertEquals(p2.getText(), paragraphAtIdx0.getText()); - - PostMethod post2 = httpPost("/notebook/" + note.getId() + "/paragraph/" + p2.getId() + "/move/" + 10, ""); - assertThat("Test post method: ", post2, isBadRequest()); - post.releaseConnection(); - - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testDeleteParagraph() throws IOException { - Note note = ZeppelinServer.notebook.createNote(anonymous); - - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - p.setTitle("title1"); - p.setText("text1"); - - note.persist(anonymous); - - DeleteMethod delete = httpDelete("/notebook/" + note.getId() + "/paragraph/" + p.getId()); - assertThat("Test delete method: ", delete, isAllowed()); - delete.releaseConnection(); - - Note retrNote = ZeppelinServer.notebook.getNote(note.getId()); - Paragraph retrParagrah = retrNote.getParagraph(p.getId()); - assertNull("paragraph should be deleted", retrParagrah); - - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void testTitleSearch() throws IOException { - Note note = ZeppelinServer.notebook.createNote(anonymous); - String jsonRequest = "{\"title\": \"testTitleSearchOfParagraph\", \"text\": \"ThisIsToTestSearchMethodWithTitle \"}"; - PostMethod postNoteText = httpPost("/notebook/" + note.getId() + "/paragraph", jsonRequest); - postNoteText.releaseConnection(); - - GetMethod searchNote = httpGet("/notebook/search?q='testTitleSearchOfParagraph'"); - searchNote.addRequestHeader("Origin", "http://localhost"); - Map respSearchResult = gson.fromJson(searchNote.getResponseBodyAsString(), - new TypeToken>() { - }.getType()); - ArrayList searchBody = (ArrayList) respSearchResult.get("body"); - - int numberOfTitleHits = 0; - for (int i = 0; i < searchBody.size(); i++) { - Map searchResult = (Map) searchBody.get(i); - if (searchResult.get("header").contains("testTitleSearchOfParagraph")) { - numberOfTitleHits++; - } - } - assertEquals("Paragraph title hits must be at-least one", true, numberOfTitleHits >= 1); - searchNote.releaseConnection(); - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java deleted file mode 100644 index 7affdd8d20e..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zeppelin.rest; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.FileUtils; -import org.apache.zeppelin.interpreter.InterpreterResult; -import org.apache.zeppelin.interpreter.InterpreterSetting; -import org.apache.zeppelin.notebook.Note; -import org.apache.zeppelin.notebook.Paragraph; -import org.apache.zeppelin.scheduler.Job.Status; -import org.apache.zeppelin.server.ZeppelinServer; -import org.apache.zeppelin.user.AuthenticationInfo; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.google.gson.Gson; - -/** - * Test against spark cluster. - * Spark cluster is started by CI server using testing/startSparkCluster.sh - */ -public class ZeppelinSparkClusterTest extends AbstractTestRestApi { - Gson gson = new Gson(); - AuthenticationInfo anonymous; - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUp(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Before - public void setUp() { - anonymous = new AuthenticationInfo("anonymous"); - } - - private void waitForFinish(Paragraph p) { - while (p.getStatus() != Status.FINISHED - && p.getStatus() != Status.ERROR - && p.getStatus() != Status.ABORT) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - LOG.error("Exception in WebDriverManager while getWebDriver ", e); - } - } - } - - @Test - public void basicRDDTransformationAndActionTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(anonymous); - - // run markdown paragraph, again - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%spark print(sc.parallelize(1 to 10).reduce(_ + _))"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("55", p.getResult().message().get(0).getData()); - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void sparkSQLTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(anonymous); - int sparkVersion = getSparkVersionNumber(note); - // DataFrame API is available from spark 1.3 - if (sparkVersion >= 13) { - // test basic dataframe api - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%spark val df=sqlContext.createDataFrame(Seq((\"hello\",20)))\n" + - "df.collect()"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertTrue(p.getResult().message().get(0).getData().contains( - "Array[org.apache.spark.sql.Row] = Array([hello,20])")); - - // test display DataFrame - p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%spark val df=sqlContext.createDataFrame(Seq((\"hello\",20)))\n" + - "z.show(df)"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals(InterpreterResult.Type.TABLE, p.getResult().message().get(1).getType()); - assertEquals("_1\t_2\nhello\t20\n", p.getResult().message().get(1).getData()); - - // test display DataSet - if (sparkVersion >= 20) { - p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%spark val ds=spark.createDataset(Seq((\"hello\",20)))\n" + - "z.show(ds)"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals(InterpreterResult.Type.TABLE, p.getResult().message().get(1).getType()); - assertEquals("_1\t_2\nhello\t20\n", p.getResult().message().get(1).getData()); - } - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - } - - @Test - public void sparkRTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(anonymous); - int sparkVersion = getSparkVersionNumber(note); - - if (isSparkR() && sparkVersion >= 14) { // sparkr supported from 1.4.0 - // restart spark interpreter - List settings = - ZeppelinServer.notebook.getBindedInterpreterSettings(note.getId()); - - for (InterpreterSetting setting : settings) { - if (setting.getName().equals("spark")) { - ZeppelinServer.notebook.getInterpreterSettingManager().restart(setting.getId()); - break; - } - } - - String sqlContextName = "sqlContext"; - if (sparkVersion >= 20) { - sqlContextName = "spark"; - } - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%r localDF <- data.frame(name=c(\"a\", \"b\", \"c\"), age=c(19, 23, 18))\n" + - "df <- createDataFrame(" + sqlContextName + ", localDF)\n" + - "count(df)" - ); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - System.err.println("sparkRTest=" + p.getResult().message().get(0).getData()); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("[1] 3", p.getResult().message().get(0).getData().trim()); - } - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void pySparkTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(anonymous); - note.setName("note"); - int sparkVersion = getSparkVersionNumber(note); - - if (isPyspark() && sparkVersion >= 12) { // pyspark supported from 1.2.1 - // run markdown paragraph, again - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - 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))"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("55\n", p.getResult().message().get(0).getData()); - if (sparkVersion >= 13) { - // run sqlContext test - p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%pyspark from pyspark.sql import Row\n" + - "df=sqlContext.createDataFrame([Row(id=1, age=20)])\n" + - "df.collect()"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("[Row(age=20, id=1)]\n", p.getResult().message().get(0).getData()); - - // test display Dataframe - p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%pyspark from pyspark.sql import Row\n" + - "df=sqlContext.createDataFrame([Row(id=1, age=20)])\n" + - "z.show(df)"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals(InterpreterResult.Type.TABLE, p.getResult().message().get(0).getType()); - // TODO (zjffdu), one more \n is appended, need to investigate why. - assertEquals("age\tid\n20\t1\n", p.getResult().message().get(0).getData()); - - // test udf - p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%pyspark sqlContext.udf.register(\"f1\", lambda x: len(x))\n" + - "sqlContext.sql(\"select f1(\\\"abc\\\") as len\").collect()"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("[Row(len=u'3')]\n", p.getResult().message().get(0).getData()); - } - if (sparkVersion >= 20) { - // run SparkSession test - p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%pyspark from pyspark.sql import Row\n" + - "df=sqlContext.createDataFrame([Row(id=1, age=20)])\n" + - "df.collect()"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("[Row(age=20, id=1)]\n", p.getResult().message().get(0).getData()); - - // test udf - p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - // use SQLContext to register UDF but use this UDF through SparkSession - p.setText("%pyspark sqlContext.udf.register(\"f1\", lambda x: len(x))\n" + - "spark.sql(\"select f1(\\\"abc\\\") as len\").collect()"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("[Row(len=u'3')]\n", p.getResult().message().get(0).getData()); - } - } - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void pySparkAutoConvertOptionTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(anonymous); - note.setName("note"); - - int sparkVersionNumber = getSparkVersionNumber(note); - - if (isPyspark() && sparkVersionNumber >= 14) { // auto_convert enabled from spark 1.4 - // run markdown paragraph, again - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - - String sqlContextName = "sqlContext"; - if (sparkVersionNumber >= 20) { - sqlContextName = "spark"; - } - - p.setText("%pyspark\nfrom pyspark.sql.functions import *\n" - + "print(" + sqlContextName + ".range(0, 10).withColumn('uniform', rand(seed=10) * 3.14).count())"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("10\n", p.getResult().message().get(0).getData()); - } - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void zRunTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(anonymous); - Paragraph p0 = note.addParagraph(AuthenticationInfo.ANONYMOUS); - Map config0 = p0.getConfig(); - config0.put("enabled", true); - p0.setConfig(config0); - p0.setText("%spark z.run(1)"); - p0.setAuthenticationInfo(anonymous); - Paragraph p1 = note.addParagraph(AuthenticationInfo.ANONYMOUS); - Map config1 = p1.getConfig(); - config1.put("enabled", true); - p1.setConfig(config1); - p1.setText("%spark val a=10"); - p1.setAuthenticationInfo(anonymous); - Paragraph p2 = note.addParagraph(AuthenticationInfo.ANONYMOUS); - Map config2 = p2.getConfig(); - config2.put("enabled", true); - p2.setConfig(config2); - p2.setText("%spark print(a)"); - p2.setAuthenticationInfo(anonymous); - - note.run(p0.getId()); - waitForFinish(p0); - assertEquals(Status.FINISHED, p0.getStatus()); - - // z.run is not blocking call. So p1 may not be finished when p0 is done. - waitForFinish(p1); - note.run(p2.getId()); - waitForFinish(p2); - assertEquals(Status.FINISHED, p2.getStatus()); - assertEquals("10", p2.getResult().message().get(0).getData()); - - Paragraph p3 = note.addParagraph(AuthenticationInfo.ANONYMOUS); - Map config3 = p3.getConfig(); - config3.put("enabled", true); - p3.setConfig(config3); - p3.setText("%spark println(new java.util.Date())"); - p3.setAuthenticationInfo(anonymous); - - p0.setText(String.format("%%spark z.runNote(\"%s\")", note.getId())); - note.run(p0.getId()); - waitForFinish(p0); - waitForFinish(p1); - waitForFinish(p2); - waitForFinish(p3); - - assertEquals(Status.FINISHED, p3.getStatus()); - String p3result = p3.getResult().message().get(0).getData(); - assertNotEquals(null, p3result); - assertNotEquals("", p3result); - - p0.setText(String.format("%%spark z.run(\"%s\", \"%s\")", note.getId(), p3.getId())); - p3.setText("%%spark println(\"END\")"); - - note.run(p0.getId()); - waitForFinish(p0); - waitForFinish(p3); - - assertNotEquals(p3result, p3.getResult().message()); - - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void pySparkDepLoaderTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(anonymous); - int sparkVersionNumber = getSparkVersionNumber(note); - - if (isPyspark() && sparkVersionNumber >= 14) { - // restart spark interpreter - List settings = - ZeppelinServer.notebook.getBindedInterpreterSettings(note.getId()); - - for (InterpreterSetting setting : settings) { - if (setting.getName().equals("spark")) { - ZeppelinServer.notebook.getInterpreterSettingManager().restart(setting.getId()); - break; - } - } - - // load dep - Paragraph p0 = note.addParagraph(AuthenticationInfo.ANONYMOUS); - 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\")"); - p0.setAuthenticationInfo(anonymous); - note.run(p0.getId()); - waitForFinish(p0); - assertEquals(Status.FINISHED, p0.getStatus()); - - // write test csv file - File tmpFile = File.createTempFile("test", "csv"); - FileUtils.write(tmpFile, "a,b\n1,2"); - - // load data using libraries from dep loader - Paragraph p1 = note.addParagraph(AuthenticationInfo.ANONYMOUS); - p1.setConfig(config); - - String sqlContextName = "sqlContext"; - if (sparkVersionNumber >= 20) { - sqlContextName = "spark"; - } - p1.setText("%pyspark\n" + - "from pyspark.sql import SQLContext\n" + - "print(" + sqlContextName + ".read.format('com.databricks.spark.csv')" + - ".load('"+ tmpFile.getAbsolutePath() +"').count())"); - p1.setAuthenticationInfo(anonymous); - note.run(p1.getId()); - - waitForFinish(p1); - assertEquals(Status.FINISHED, p1.getStatus()); - assertEquals("2\n", p1.getResult().message().get(0).getData()); - } - ZeppelinServer.notebook.removeNote(note.getId(), anonymous); - } - - /** - * Get spark version number as a numerical value. - * eg. 1.1.x => 11, 1.2.x => 12, 1.3.x => 13 ... - */ - private int getSparkVersionNumber(Note note) { - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - note.setName("note"); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%spark print(sc.version)"); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - String sparkVersion = p.getResult().message().get(0).getData(); - System.out.println("Spark version detected " + sparkVersion); - String[] split = sparkVersion.split("\\."); - int version = Integer.parseInt(split[0]) * 10 + Integer.parseInt(split[1]); - return version; - } - - @Test - public void testZeppelinContextDynamicForms() throws IOException { - Note note = ZeppelinServer.notebook.createNote(anonymous); - Paragraph p = note.addParagraph(AuthenticationInfo.ANONYMOUS); - note.setName("note"); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - String code = "%spark.spark z.input(\"my_input\", \"default_name\")\n" + - "z.select(\"my_select\", \"select_2\"," + - "Seq((\"1\", \"select_1\"), (\"2\", \"select_2\")))\n" + - "z.checkbox(\"my_checkbox\", Seq(\"check_1\"), " + - "Seq((\"1\", \"check_1\"), (\"2\", \"check_2\")))"; - p.setText(code); - p.setAuthenticationInfo(anonymous); - note.run(p.getId()); - waitForFinish(p); - - assertEquals(Status.FINISHED, p.getStatus()); - Iterator formIter = p.settings.getForms().keySet().iterator(); - assert(formIter.next().equals("my_input")); - assert(formIter.next().equals("my_select")); - assert(formIter.next().equals("my_checkbox")); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/security/SecurityUtilsTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/security/SecurityUtilsTest.java deleted file mode 100644 index 9d902c8099a..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/security/SecurityUtilsTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zeppelin.security; - -import static org.junit.Assert.*; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.zeppelin.conf.ZeppelinConfiguration; -import org.apache.zeppelin.utils.SecurityUtils; -import org.junit.Test; - -import java.net.URISyntaxException; -import java.net.UnknownHostException; -import java.net.InetAddress; - - -public class SecurityUtilsTest { - - @Test - public void isInvalid() throws URISyntaxException, UnknownHostException { - assertFalse(SecurityUtils.isValidOrigin("http://127.0.1.1", ZeppelinConfiguration.create())); - } - - @Test - public void isInvalidFromConfig() throws URISyntaxException, UnknownHostException, ConfigurationException { - assertFalse(SecurityUtils.isValidOrigin("http://otherinvalidhost.com", - new ZeppelinConfiguration(this.getClass().getResource("/zeppelin-site.xml")))); - } - - @Test - public void isLocalhost() throws URISyntaxException, UnknownHostException { - assertTrue(SecurityUtils.isValidOrigin("http://localhost", ZeppelinConfiguration.create())); - } - - @Test - public void isLocalMachine() throws URISyntaxException, UnknownHostException { - String origin = "http://" + InetAddress.getLocalHost().getHostName(); - assertTrue("Origin " + origin + " is not allowed. Please check your hostname.", - SecurityUtils.isValidOrigin(origin, ZeppelinConfiguration.create())); - } - - @Test - public void isValidFromConfig() throws URISyntaxException, UnknownHostException, ConfigurationException { - assertTrue(SecurityUtils.isValidOrigin("http://otherhost.com", - new ZeppelinConfiguration(this.getClass().getResource("/zeppelin-site.xml")))); - } - - @Test - public void isValidFromStar() throws URISyntaxException, UnknownHostException, ConfigurationException { - assertTrue(SecurityUtils.isValidOrigin("http://anyhost.com", - new ZeppelinConfiguration(this.getClass().getResource("/zeppelin-site-star.xml")))); - } - - @Test - public void nullOrigin() throws URISyntaxException, UnknownHostException, ConfigurationException { - assertFalse(SecurityUtils.isValidOrigin(null, - new ZeppelinConfiguration(this.getClass().getResource("/zeppelin-site.xml")))); - } - - @Test - public void nullOriginWithStar() throws URISyntaxException, UnknownHostException, ConfigurationException { - assertTrue(SecurityUtils.isValidOrigin(null, - new ZeppelinConfiguration(this.getClass().getResource("/zeppelin-site-star.xml")))); - } - - @Test - public void emptyOrigin() throws URISyntaxException, UnknownHostException, ConfigurationException { - assertFalse(SecurityUtils.isValidOrigin("", - new ZeppelinConfiguration(this.getClass().getResource("/zeppelin-site.xml")))); - } - - @Test - public void notAURIOrigin() throws URISyntaxException, UnknownHostException, ConfigurationException { - assertFalse(SecurityUtils.isValidOrigin("test123", - new ZeppelinConfiguration(this.getClass().getResource("/zeppelin-site.xml")))); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/server/CorsFilterTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/server/CorsFilterTest.java deleted file mode 100644 index df2a6e92e0d..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/server/CorsFilterTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zeppelin.server; - -import org.junit.Assert; -import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import java.io.IOException; - -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.*; - -/** - * Basic CORS REST API tests - */ -public class CorsFilterTest { - - public static String[] headers = new String[8]; - public static Integer count = 0; - - @Test - @SuppressWarnings("rawtypes") - public void ValidCorsFilterTest() throws IOException, ServletException { - CorsFilter filter = new CorsFilter(); - HttpServletResponse mockResponse = mock(HttpServletResponse.class); - FilterChain mockedFilterChain = mock(FilterChain.class); - HttpServletRequest mockRequest = mock(HttpServletRequest.class); - when(mockRequest.getHeader("Origin")).thenReturn("http://localhost:8080"); - when(mockRequest.getMethod()).thenReturn("Empty"); - when(mockRequest.getServerName()).thenReturn("localhost"); - count = 0; - - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocationOnMock) throws Throwable { - headers[count] = invocationOnMock.getArguments()[1].toString(); - count++; - return null; - } - }).when(mockResponse).addHeader(anyString(), anyString()); - - filter.doFilter(mockRequest, mockResponse, mockedFilterChain); - Assert.assertTrue(headers[0].equals("http://localhost:8080")); - } - - @Test - @SuppressWarnings("rawtypes") - public void InvalidCorsFilterTest() throws IOException, ServletException { - CorsFilter filter = new CorsFilter(); - HttpServletResponse mockResponse = mock(HttpServletResponse.class); - FilterChain mockedFilterChain = mock(FilterChain.class); - HttpServletRequest mockRequest = mock(HttpServletRequest.class); - when(mockRequest.getHeader("Origin")).thenReturn("http://evillocalhost:8080"); - when(mockRequest.getMethod()).thenReturn("Empty"); - when(mockRequest.getServerName()).thenReturn("evillocalhost"); - - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocationOnMock) throws Throwable { - headers[count] = invocationOnMock.getArguments()[1].toString(); - count++; - return null; - } - }).when(mockResponse).addHeader(anyString(), anyString()); - - filter.doFilter(mockRequest, mockResponse, mockedFilterChain); - Assert.assertTrue(headers[0].equals("")); - } -} diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java deleted file mode 100644 index c339140419e..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java +++ /dev/null @@ -1,412 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.zeppelin.socket; - -import com.google.gson.Gson; - -import org.apache.zeppelin.display.AngularObject; -import org.apache.zeppelin.display.AngularObjectBuilder; -import org.apache.zeppelin.display.AngularObjectRegistry; -import org.apache.zeppelin.interpreter.InterpreterGroup; -import org.apache.zeppelin.interpreter.InterpreterSetting; -import org.apache.zeppelin.interpreter.remote.RemoteAngularObjectRegistry; -import org.apache.zeppelin.notebook.Note; -import org.apache.zeppelin.notebook.Notebook; -import org.apache.zeppelin.notebook.Paragraph; -import org.apache.zeppelin.notebook.socket.Message; -import org.apache.zeppelin.notebook.socket.Message.OP; -import org.apache.zeppelin.rest.AbstractTestRestApi; -import org.apache.zeppelin.server.ZeppelinServer; -import org.apache.zeppelin.user.AuthenticationInfo; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import javax.servlet.http.HttpServletRequest; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.HashSet; -import java.util.List; - -import static java.util.Arrays.asList; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - - -/** - * Basic REST API tests for notebookServer - */ -public class NotebookServerTest extends AbstractTestRestApi { - private static Notebook notebook; - private static NotebookServer notebookServer; - private static Gson gson; - private HttpServletRequest mockRequest; - private AuthenticationInfo anonymous; - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUp(); - gson = new Gson(); - notebook = ZeppelinServer.notebook; - notebookServer = ZeppelinServer.notebookWsServer; - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - @Before - public void setUp() { - mockRequest = mock(HttpServletRequest.class); - anonymous = new AuthenticationInfo("anonymous"); - } - - @Test - public void checkOrigin() throws UnknownHostException { - NotebookServer server = new NotebookServer(); - String origin = "http://" + InetAddress.getLocalHost().getHostName() + ":8080"; - - assertTrue("Origin " + origin + " is not allowed. Please check your hostname.", - server.checkOrigin(mockRequest, origin)); - } - - @Test - public void checkInvalidOrigin(){ - NotebookServer server = new NotebookServer(); - assertFalse(server.checkOrigin(mockRequest, "http://evillocalhost:8080")); - } - - @Test - public void testMakeSureNoAngularObjectBroadcastToWebsocketWhoFireTheEvent() throws IOException { - // create a notebook - Note note1 = notebook.createNote(anonymous); - - // get reference to interpreterGroup - InterpreterGroup interpreterGroup = null; - List settings = notebook.getInterpreterSettingManager().getInterpreterSettings(note1.getId()); - for (InterpreterSetting setting : settings) { - if (setting.getName().equals("md")) { - interpreterGroup = setting.getInterpreterGroup("anonymous", "sharedProcess"); - break; - } - } - - // start interpreter process - Paragraph p1 = note1.addParagraph(AuthenticationInfo.ANONYMOUS); - p1.setText("%md start remote interpreter process"); - p1.setAuthenticationInfo(anonymous); - note1.run(p1.getId()); - - // add angularObject - interpreterGroup.getAngularObjectRegistry().add("object1", "value1", note1.getId(), null); - - // create two sockets and open it - NotebookSocket sock1 = createWebSocket(); - NotebookSocket sock2 = createWebSocket(); - - assertEquals(sock1, sock1); - assertNotEquals(sock1, sock2); - - notebookServer.onOpen(sock1); - notebookServer.onOpen(sock2); - verify(sock1, times(0)).send(anyString()); // getNote, getAngularObject - // open the same notebook from sockets - notebookServer.onMessage(sock1, gson.toJson(new Message(OP.GET_NOTE).put("id", note1.getId()))); - notebookServer.onMessage(sock2, gson.toJson(new Message(OP.GET_NOTE).put("id", note1.getId()))); - - reset(sock1); - reset(sock2); - - // update object from sock1 - notebookServer.onMessage(sock1, gson.toJson( - new Message(OP.ANGULAR_OBJECT_UPDATED) - .put("noteId", note1.getId()) - .put("name", "object1") - .put("value", "value1") - .put("interpreterGroupId", interpreterGroup.getId()))); - - - // expect object is broadcasted except for where the update is created - verify(sock1, times(0)).send(anyString()); - verify(sock2, times(1)).send(anyString()); - - notebook.removeNote(note1.getId(), anonymous); - } - - @Test - public void testImportNotebook() throws IOException { - String msg = "{\"op\":\"IMPORT_NOTE\",\"data\":" + - "{\"note\":{\"paragraphs\": [{\"text\": \"Test " + - "paragraphs import\",\"config\":{},\"settings\":{}}]," + - "\"name\": \"Test Zeppelin notebook import\",\"config\": " + - "{}}}}"; - Message messageReceived = notebookServer.deserializeMessage(msg); - Note note = null; - try { - note = notebookServer.importNote(null, null, notebook, messageReceived); - } catch (NullPointerException e) { - //broadcastNoteList(); failed nothing to worry. - LOG.error("Exception in NotebookServerTest while testImportNotebook, failed nothing to " + - "worry ", e); - } - - assertNotEquals(null, notebook.getNote(note.getId())); - assertEquals("Test Zeppelin notebook import", notebook.getNote(note.getId()).getName()); - assertEquals("Test paragraphs import", notebook.getNote(note.getId()).getParagraphs().get(0).getText()); - notebook.removeNote(note.getId(), anonymous); - } - - @Test - public void bindAngularObjectToRemoteForParagraphs() throws Exception { - //Given - final String varName = "name"; - final String value = "DuyHai DOAN"; - final Message messageReceived = new Message(OP.ANGULAR_OBJECT_CLIENT_BIND) - .put("noteId", "noteId") - .put("name", varName) - .put("value", value) - .put("paragraphId", "paragraphId"); - - final NotebookServer server = new NotebookServer(); - final Notebook notebook = mock(Notebook.class); - final Note note = mock(Note.class, RETURNS_DEEP_STUBS); - - when(notebook.getNote("noteId")).thenReturn(note); - final Paragraph paragraph = mock(Paragraph.class, RETURNS_DEEP_STUBS); - when(note.getParagraph("paragraphId")).thenReturn(paragraph); - - - final RemoteAngularObjectRegistry mdRegistry = mock(RemoteAngularObjectRegistry.class); - final InterpreterGroup mdGroup = new InterpreterGroup("mdGroup"); - mdGroup.setAngularObjectRegistry(mdRegistry); - - when(paragraph.getCurrentRepl().getInterpreterGroup()).thenReturn(mdGroup); - - final AngularObject ao1 = AngularObjectBuilder.build(varName, value, "noteId", "paragraphId"); - - when(mdRegistry.addAndNotifyRemoteProcess(varName, value, "noteId", "paragraphId")).thenReturn(ao1); - - NotebookSocket conn = mock(NotebookSocket.class); - NotebookSocket otherConn = mock(NotebookSocket.class); - - final String mdMsg1 = server.serializeMessage(new Message(OP.ANGULAR_OBJECT_UPDATE) - .put("angularObject", ao1) - .put("interpreterGroupId", "mdGroup") - .put("noteId", "noteId") - .put("paragraphId", "paragraphId")); - - server.noteSocketMap.put("noteId", asList(conn, otherConn)); - - // When - server.angularObjectClientBind(conn, new HashSet(), notebook, messageReceived); - - // Then - verify(mdRegistry, never()).addAndNotifyRemoteProcess(varName, value, "noteId", null); - - verify(otherConn).send(mdMsg1); - } - - @Test - public void bindAngularObjectToLocalForParagraphs() throws Exception { - //Given - final String varName = "name"; - final String value = "DuyHai DOAN"; - final Message messageReceived = new Message(OP.ANGULAR_OBJECT_CLIENT_BIND) - .put("noteId", "noteId") - .put("name", varName) - .put("value", value) - .put("paragraphId", "paragraphId"); - - final NotebookServer server = new NotebookServer(); - final Notebook notebook = mock(Notebook.class); - final Note note = mock(Note.class, RETURNS_DEEP_STUBS); - when(notebook.getNote("noteId")).thenReturn(note); - final Paragraph paragraph = mock(Paragraph.class, RETURNS_DEEP_STUBS); - when(note.getParagraph("paragraphId")).thenReturn(paragraph); - - final AngularObjectRegistry mdRegistry = mock(AngularObjectRegistry.class); - final InterpreterGroup mdGroup = new InterpreterGroup("mdGroup"); - mdGroup.setAngularObjectRegistry(mdRegistry); - - when(paragraph.getCurrentRepl().getInterpreterGroup()).thenReturn(mdGroup); - - - final AngularObject ao1 = AngularObjectBuilder.build(varName, value, "noteId", "paragraphId"); - - when(mdRegistry.add(varName, value, "noteId", "paragraphId")).thenReturn(ao1); - - NotebookSocket conn = mock(NotebookSocket.class); - NotebookSocket otherConn = mock(NotebookSocket.class); - - final String mdMsg1 = server.serializeMessage(new Message(OP.ANGULAR_OBJECT_UPDATE) - .put("angularObject", ao1) - .put("interpreterGroupId", "mdGroup") - .put("noteId", "noteId") - .put("paragraphId", "paragraphId")); - - server.noteSocketMap.put("noteId", asList(conn, otherConn)); - - // When - server.angularObjectClientBind(conn, new HashSet(), notebook, messageReceived); - - // Then - verify(otherConn).send(mdMsg1); - } - - @Test - public void unbindAngularObjectFromRemoteForParagraphs() throws Exception { - //Given - final String varName = "name"; - final String value = "val"; - final Message messageReceived = new Message(OP.ANGULAR_OBJECT_CLIENT_UNBIND) - .put("noteId", "noteId") - .put("name", varName) - .put("paragraphId", "paragraphId"); - - final NotebookServer server = new NotebookServer(); - final Notebook notebook = mock(Notebook.class); - final Note note = mock(Note.class, RETURNS_DEEP_STUBS); - when(notebook.getNote("noteId")).thenReturn(note); - final Paragraph paragraph = mock(Paragraph.class, RETURNS_DEEP_STUBS); - when(note.getParagraph("paragraphId")).thenReturn(paragraph); - - final RemoteAngularObjectRegistry mdRegistry = mock(RemoteAngularObjectRegistry.class); - final InterpreterGroup mdGroup = new InterpreterGroup("mdGroup"); - mdGroup.setAngularObjectRegistry(mdRegistry); - - when(paragraph.getCurrentRepl().getInterpreterGroup()).thenReturn(mdGroup); - - final AngularObject ao1 = AngularObjectBuilder.build(varName, value, "noteId", "paragraphId"); - when(mdRegistry.removeAndNotifyRemoteProcess(varName, "noteId", "paragraphId")).thenReturn(ao1); - NotebookSocket conn = mock(NotebookSocket.class); - NotebookSocket otherConn = mock(NotebookSocket.class); - - final String mdMsg1 = server.serializeMessage(new Message(OP.ANGULAR_OBJECT_REMOVE) - .put("angularObject", ao1) - .put("interpreterGroupId", "mdGroup") - .put("noteId", "noteId") - .put("paragraphId", "paragraphId")); - - server.noteSocketMap.put("noteId", asList(conn, otherConn)); - - // When - server.angularObjectClientUnbind(conn, new HashSet(), notebook, messageReceived); - - // Then - verify(mdRegistry, never()).removeAndNotifyRemoteProcess(varName, "noteId", null); - - verify(otherConn).send(mdMsg1); - } - - @Test - public void unbindAngularObjectFromLocalForParagraphs() throws Exception { - //Given - final String varName = "name"; - final String value = "val"; - final Message messageReceived = new Message(OP.ANGULAR_OBJECT_CLIENT_UNBIND) - .put("noteId", "noteId") - .put("name", varName) - .put("paragraphId", "paragraphId"); - - final NotebookServer server = new NotebookServer(); - final Notebook notebook = mock(Notebook.class); - final Note note = mock(Note.class, RETURNS_DEEP_STUBS); - when(notebook.getNote("noteId")).thenReturn(note); - final Paragraph paragraph = mock(Paragraph.class, RETURNS_DEEP_STUBS); - when(note.getParagraph("paragraphId")).thenReturn(paragraph); - - final AngularObjectRegistry mdRegistry = mock(AngularObjectRegistry.class); - final InterpreterGroup mdGroup = new InterpreterGroup("mdGroup"); - mdGroup.setAngularObjectRegistry(mdRegistry); - - when(paragraph.getCurrentRepl().getInterpreterGroup()).thenReturn(mdGroup); - - final AngularObject ao1 = AngularObjectBuilder.build(varName, value, "noteId", "paragraphId"); - - when(mdRegistry.remove(varName, "noteId", "paragraphId")).thenReturn(ao1); - - NotebookSocket conn = mock(NotebookSocket.class); - NotebookSocket otherConn = mock(NotebookSocket.class); - - final String mdMsg1 = server.serializeMessage(new Message(OP.ANGULAR_OBJECT_REMOVE) - .put("angularObject", ao1) - .put("interpreterGroupId", "mdGroup") - .put("noteId", "noteId") - .put("paragraphId", "paragraphId")); - server.noteSocketMap.put("noteId", asList(conn, otherConn)); - - // When - server.angularObjectClientUnbind(conn, new HashSet(), notebook, messageReceived); - - // Then - verify(otherConn).send(mdMsg1); - } - - @Test - public void testCreateNoteWithDefaultInterpreterId() throws IOException { - // create two sockets and open it - NotebookSocket sock1 = createWebSocket(); - NotebookSocket sock2 = createWebSocket(); - - assertEquals(sock1, sock1); - assertNotEquals(sock1, sock2); - - notebookServer.onOpen(sock1); - notebookServer.onOpen(sock2); - - String noteName = "Note with millis " + System.currentTimeMillis(); - String defaultInterpreterId = ""; - List settings = notebook.getInterpreterSettingManager().get(); - if (settings.size() > 1) { - defaultInterpreterId = settings.get(1).getId(); - } - // create note from sock1 - notebookServer.onMessage(sock1, gson.toJson( - new Message(OP.NEW_NOTE) - .put("name", noteName) - .put("defaultInterpreterId", defaultInterpreterId))); - - // expect the events are broadcasted properly - verify(sock1, times(2)).send(anyString()); - - Note createdNote = null; - for (Note note : notebook.getAllNotes()) { - if (note.getName().equals(noteName)) { - createdNote = note; - break; - } - } - - if (settings.size() > 1) { - assertEquals(notebook.getInterpreterSettingManager().getDefaultInterpreterSetting( - createdNote.getId()).getId(), defaultInterpreterId); - } - notebook.removeNote(createdNote.getId(), anonymous); - } - - private NotebookSocket createWebSocket() { - NotebookSocket sock = mock(NotebookSocket.class); - when(sock.getRequest()).thenReturn(mockRequest); - return sock; - } - -} - diff --git a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/ticket/TicketContainerTest.java b/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/ticket/TicketContainerTest.java deleted file mode 100644 index 91d2cb3af20..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/java/org/apache/zeppelin/ticket/TicketContainerTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin.ticket; - -import org.junit.Before; -import org.junit.Test; - -import java.net.UnknownHostException; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class TicketContainerTest { - private TicketContainer container; - - @Before - public void setUp() throws Exception { - container = TicketContainer.instance; - } - - @Test - public void isValidAnonymous() throws UnknownHostException { - boolean ok = container.isValid("anonymous", "anonymous"); - assertTrue(ok); - } - - @Test - public void isValidExistingPrincipal() throws UnknownHostException { - String ticket = container.getTicket("someuser1"); - boolean ok = container.isValid("someuser1", ticket); - assertTrue(ok); - } - - @Test - public void isValidNonExistingPrincipal() throws UnknownHostException { - boolean ok = container.isValid("unknownuser", "someticket"); - assertFalse(ok); - } - - @Test - public void isValidunkownTicket() throws UnknownHostException { - String ticket = container.getTicket("someuser2"); - boolean ok = container.isValid("someuser2", ticket+"makeitinvalid"); - assertFalse(ok); - } -} - diff --git a/smart-zeppelin/zeppelin-server/src/test/resources/log4j.properties b/smart-zeppelin/zeppelin-server/src/test/resources/log4j.properties deleted file mode 100644 index 041daf02dbd..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/resources/log4j.properties +++ /dev/null @@ -1,46 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# Direct log messages to stdout -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c:%L - %m%n -#log4j.appender.stdout.layout.ConversionPattern= -#%5p [%t] (%F:%L) - %m%n -#%-4r [%t] %-5p %c %x - %m%n -# - -# Root logger option -log4j.rootLogger=INFO, stdout - -#mute some noisy guys -log4j.logger.org.apache.hadoop.mapred=WARN -log4j.logger.org.apache.hadoop.hive.ql=WARN -log4j.logger.org.apache.hadoop.hive.metastore=WARN -log4j.logger.org.apache.haadoop.hive.service.HiveServer=WARN -log4j.logger.org.apache.zeppelin.scheduler=WARN - -log4j.logger.org.quartz=WARN -log4j.logger.DataNucleus=WARN -log4j.logger.DataNucleus.MetaData=ERROR -log4j.logger.DataNucleus.Datastore=ERROR - -# Log all JDBC parameters -log4j.logger.org.hibernate.type=ALL - -log4j.logger.org.apache.zeppelin.interpreter=DEBUG \ No newline at end of file diff --git a/smart-zeppelin/zeppelin-server/src/test/resources/zeppelin-site-star.xml b/smart-zeppelin/zeppelin-server/src/test/resources/zeppelin-site-star.xml deleted file mode 100644 index 93dc0ed327b..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/resources/zeppelin-site-star.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - zeppelin.server.addr - 0.0.0.0 - Server address - - - - zeppelin.server.port - 8080 - Server port. - - - - zeppelin.notebook.dir - notebook - path or URI for notebook persist - - - - zeppelin.notebook.homescreen - - id of notebook to be displayed in homescreen. ex) 2A94M5J1Z Empty value displays default home screen - - - - zeppelin.notebook.homescreen.hide - false - hide homescreen notebook from list when this value set to true - - - - - - - - zeppelin.notebook.storage - org.apache.zeppelin.notebook.repo.VFSNotebookRepo - notebook persistence layer implementation - - - - zeppelin.interpreter.dir - interpreter - Interpreter implementation base directory - - - - zeppelin.interpreter.connect.timeout - 30000 - Interpreter process connect timeout in msec. - - - - - zeppelin.ssl - false - Should SSL be used by the servers? - - - - zeppelin.ssl.client.auth - false - Should client authentication be used for SSL connections? - - - - zeppelin.ssl.keystore.path - keystore - Path to keystore relative to Zeppelin configuration directory - - - - zeppelin.ssl.keystore.type - JKS - The format of the given keystore (e.g. JKS or PKCS12) - - - - zeppelin.ssl.keystore.password - change me - Keystore password. Can be obfuscated by the Jetty Password tool - - - - - - zeppelin.ssl.truststore.path - truststore - Path to truststore relative to Zeppelin configuration directory. Defaults to the keystore path - - - - zeppelin.ssl.truststore.type - JKS - The format of the given truststore (e.g. JKS or PKCS12). Defaults to the same type as the keystore type - - - - zeppelin.server.allowed.origins - * - Allowed sources for REST and WebSocket requests. - - - - - diff --git a/smart-zeppelin/zeppelin-server/src/test/resources/zeppelin-site.xml b/smart-zeppelin/zeppelin-server/src/test/resources/zeppelin-site.xml deleted file mode 100644 index 3215c5b3b17..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/resources/zeppelin-site.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - zeppelin.server.addr - 0.0.0.0 - Server address - - - - zeppelin.server.port - 8080 - Server port. - - - - zeppelin.notebook.dir - notebook - path or URI for notebook persist - - - - zeppelin.notebook.homescreen - - id of notebook to be displayed in homescreen. ex) 2A94M5J1Z Empty value displays default home screen - - - - zeppelin.notebook.homescreen.hide - false - hide homescreen notebook from list when this value set to true - - - - - - - - zeppelin.notebook.storage - org.apache.zeppelin.notebook.repo.VFSNotebookRepo - notebook persistence layer implementation - - - - zeppelin.interpreter.dir - interpreter - Interpreter implementation base directory - - - - zeppelin.interpreter.connect.timeout - 30000 - Interpreter process connect timeout in msec. - - - - - zeppelin.ssl - false - Should SSL be used by the servers? - - - - zeppelin.ssl.client.auth - false - Should client authentication be used for SSL connections? - - - - zeppelin.ssl.keystore.path - keystore - Path to keystore relative to Zeppelin configuration directory - - - - zeppelin.ssl.keystore.type - JKS - The format of the given keystore (e.g. JKS or PKCS12) - - - - zeppelin.ssl.keystore.password - change me - Keystore password. Can be obfuscated by the Jetty Password tool - - - - - - zeppelin.ssl.truststore.path - truststore - Path to truststore relative to Zeppelin configuration directory. Defaults to the keystore path - - - - zeppelin.ssl.truststore.type - JKS - The format of the given truststore (e.g. JKS or PKCS12). Defaults to the same type as the keystore type - - - - zeppelin.server.allowed.origins - http://onehost:8080,http://otherhost.com, - Allowed sources for REST and WebSocket requests. - - - - - diff --git a/smart-zeppelin/zeppelin-server/src/test/scala/org/apache/zeppelin/AbstractFunctionalSuite.scala b/smart-zeppelin/zeppelin-server/src/test/scala/org/apache/zeppelin/AbstractFunctionalSuite.scala deleted file mode 100644 index 2f773c6fddc..00000000000 --- a/smart-zeppelin/zeppelin-server/src/test/scala/org/apache/zeppelin/AbstractFunctionalSuite.scala +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zeppelin - -import org.apache.zeppelin.AbstractFunctionalSuite.SERVER_ADDRESS -import org.openqa.selenium.WebDriver -import org.openqa.selenium.chrome.ChromeDriver -import org.openqa.selenium.firefox.{FirefoxBinary, FirefoxDriver, FirefoxProfile} -import org.openqa.selenium.safari.SafariDriver -import org.scalatest.concurrent.Eventually._ -import org.scalatest.time._ -import org.scalatest.selenium.WebBrowser -import org.scalatest.{BeforeAndAfterAll, FunSuite, Suite} - -import scala.sys.process._ -import scala.util.Try - -object AbstractFunctionalSuite { - val SERVER_ADDRESS = "http://localhost:8080" -} - -class AbstractFunctionalSuite extends FunSuite with WebBrowser with BeforeAndAfterAll { - - implicit val webDriver = getDriver() - - override def beforeAll() = { - "../bin/zeppelin-daemon.sh start" ! - - eventually (timeout(Span(180, Seconds))) { - go to SERVER_ADDRESS - assert(find("welcome").isDefined) - } - } - - override def nestedSuites = - List[Suite](new WelcomePageSuite).toIndexedSeq - - override def afterAll() = { - "../bin/zeppelin-daemon.sh stop" ! - - webDriver.close() - } - - def getDriver(): WebDriver = { - val possibleDrivers = List[() => WebDriver](safari, chrome, firefox) - val createdDriver = possibleDrivers.map(driverFactory => Try(driverFactory.apply())).find(_.isSuccess) - createdDriver match { - case Some(driver) => driver.get - case None => throw new RuntimeException("Could not initialize any driver") - } - } - - def safari(): WebDriver = { - new SafariDriver() - } - - def chrome(): WebDriver = { - new ChromeDriver() - } - - def firefox(): WebDriver = { - val ffox: FirefoxBinary = new FirefoxBinary - if ("true" == System.getenv("TRAVIS")) { - ffox.setEnvironmentProperty("DISPLAY", ":99") - } - val profile: FirefoxProfile = new FirefoxProfile - new FirefoxDriver(ffox, profile) - } -} diff --git a/smart-zeppelin/zeppelin-web/src/app/dashboard/views/actions/actions.js b/smart-zeppelin/zeppelin-web/src/app/dashboard/views/actions/actions.js index 859e0070926..e3bcaf831ba 100644 --- a/smart-zeppelin/zeppelin-web/src/app/dashboard/views/actions/actions.js +++ b/smart-zeppelin/zeppelin-web/src/app/dashboard/views/actions/actions.js @@ -108,11 +108,11 @@ angular.module('zeppelinWebApp') actions0.$subscribe($scope, function (actions) { updateTable(actions); }); - +/* $(function () { $("[data-toggle='tooltip']").tooltip({ container: body }); - }); + });*/ } diff --git a/smart-zeppelin/zeppelin-web/src/app/notebook/notebook-actionBar.html b/smart-zeppelin/zeppelin-web/src/app/notebook/notebook-actionBar.html index 71ad299e475..cd935b2c263 100644 --- a/smart-zeppelin/zeppelin-web/src/app/notebook/notebook-actionBar.html +++ b/smart-zeppelin/zeppelin-web/src/app/notebook/notebook-actionBar.html @@ -22,14 +22,14 @@

- + --> - + -->
@@ -249,12 +247,12 @@

tooltip-placement="bottom" uib-tooltip="List of shortcut"> - - + -->

-
-
-

Settings

-
-
-
-
Interpreter binding
-

- Bind interpreter for this note. - Click to Bind/Unbind interpreter. - Drag and drop to reorder interpreters.
- The first interpreter on the list becomes default. To create/remove interpreters, go to Interpreter menu. -

-
-
-
- - -   -
- {{item.name}} - - - , - %{{item.name}}.{{intp.name}} - (default) - - -
-
-
-
-
-
-
- - -
-
diff --git a/smart-zeppelin/zeppelin-web/src/components/navbar/navbar.html b/smart-zeppelin/zeppelin-web/src/components/navbar/navbar.html index 5107780821a..4c3cd5c4c45 100644 --- a/smart-zeppelin/zeppelin-web/src/components/navbar/navbar.html +++ b/smart-zeppelin/zeppelin-web/src/components/navbar/navbar.html @@ -18,35 +18,16 @@ - + - Smart + Smart Manager