Repository: incubator-zeppelin Updated Branches: refs/heads/master e3e61832b -> 27b7ad52b
[Zeppelin-354] - List notebooks REST API replacing PR #367 This is the implementation, test and documentation of List notebooks REST API. The documentation include sample JSON with different looknfeel option and coron options. This is ready for review. Author: eranwitkon <[email protected]> Closes #369 from eranwitkon/354 and squashes the following commits: 5472620 [eranwitkon] update getNotebook list documentation b2dad81 [eranwitkon] revert to original implementation as getNotebookList does not need the exclusionStrategy anymore 0eff22e [eranwitkon] update getList test c2f1c5f [eranwitkon] update getNotebookList to use NotebookServer.generateNotebookInfo function d0b6744 [eranwitkon] refactor broadcastNoteList to use a new public generateNotebookList function which will be used in both socket implementation and REST implementation. 1e3d98c [eranwitkon] List Notebook REST API implementation, Test & documentation ee53446 [eranwitkon] List Notebook REST API implementation, Test & documentation Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/27b7ad52 Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/27b7ad52 Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/27b7ad52 Branch: refs/heads/master Commit: 27b7ad52b6bf8f18643e8b58d16fcab3d709eb1c Parents: e3e6183 Author: eranwitkon <[email protected]> Authored: Wed Nov 4 15:09:06 2015 +0200 Committer: Lee moon soo <[email protected]> Committed: Sat Nov 7 09:41:37 2015 +0900 ---------------------------------------------------------------------- .../rest-json-notebook-list-response.json | 1 + docs/docs/rest-api/rest-notebook.md | 34 +++++++++++++++++++- .../apache/zeppelin/rest/NotebookRestApi.java | 4 ++- .../apache/zeppelin/socket/NotebookServer.java | 18 +++++++---- .../zeppelin/rest/ZeppelinRestApiTest.java | 18 +++++++++++ 5 files changed, 67 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/27b7ad52/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json ---------------------------------------------------------------------- diff --git a/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json b/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json new file mode 100644 index 0000000..ba424a9 --- /dev/null +++ b/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json @@ -0,0 +1 @@ +{"status":"OK","message":"","body":[{"name":"Homepage","id":"2AV4WUEMK"},{"name":"Zeppelin Tutorial","id":"2A94M5J1Z"}]} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/27b7ad52/docs/docs/rest-api/rest-notebook.md ---------------------------------------------------------------------- diff --git a/docs/docs/rest-api/rest-notebook.md b/docs/docs/rest-api/rest-notebook.md index 1c367ce..f50668b 100644 --- a/docs/docs/rest-api/rest-notebook.md +++ b/docs/docs/rest-api/rest-notebook.md @@ -20,11 +20,43 @@ group: rest-api <br /> ### Notebook REST API list - Notebooks can be created, deleted or cloned using the following REST API + Notebooks REST API supports the following operations: List, Create, Delete & Clone as detailed in the following table <table class="table-configuration"> <col width="200"> <tr> + <th>List notebooks</th> + <th></th> + </tr> + <tr> + <td>Description</td> + <td>This ```GET``` method list the available notebooks on your server. + Notebook JSON contains the ```name``` and ```id``` of all notebooks. + </td> + </tr> + <tr> + <td>URL</td> + <td>```http://[zeppelin-server]:[zeppelin-port]/api/notebook```</td> + </tr> + <tr> + <td>Success code</td> + <td>200</td> + </tr> + <tr> + <td> Fail code</td> + <td> 500 </td> + </tr> + <tr> + <td> sample JSON response </td> + <td> [List response sample](rest-json/rest-json-notebook-list-response.json) </td> + </tr> + </table> + +<br/> + + <table class="table-configuration"> + <col width="200"> + <tr> <th>Create notebook</th> <th></th> </tr> http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/27b7ad52/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java index aabc8c6..2b98633 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java @@ -20,6 +20,7 @@ package org.apache.zeppelin.rest; import java.io.IOException; import java.util.LinkedList; import java.util.List; +import java.util.Map; import javax.ws.rs.*; import javax.ws.rs.core.Response; @@ -117,7 +118,8 @@ public class NotebookRestApi { @GET @Path("/") public Response getNotebookList() throws IOException { - return new JsonResponse(Status.OK, "", notebook.getAllNotes() ).build(); + List<Map<String, String>> notesInfo = notebookServer.generateNotebooksInfo(); + return new JsonResponse(Status.OK, "", notesInfo ).build(); } /** http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/27b7ad52/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index c6aa846..421e9a2 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -273,17 +273,13 @@ public class NotebookServer extends WebSocketServlet implements } } - public void broadcastNote(Note note) { - broadcast(note.id(), new Message(OP.NOTE).put("note", note)); - } - - public void broadcastNoteList() { + public List<Map<String, String>> generateNotebooksInfo (){ Notebook notebook = notebook(); ZeppelinConfiguration conf = notebook.getConf(); String homescreenNotebookId = conf.getString(ConfVars.ZEPPELIN_NOTEBOOK_HOMESCREEN); boolean hideHomeScreenNotebookFromList = conf - .getBoolean(ConfVars.ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE); + .getBoolean(ConfVars.ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE); List<Note> notes = notebook.getAllNotes(); List<Map<String, String>> notesInfo = new LinkedList<>(); @@ -299,6 +295,16 @@ public class NotebookServer extends WebSocketServlet implements notesInfo.add(info); } + return notesInfo; + } + + public void broadcastNote(Note note) { + broadcast(note.id(), new Message(OP.NOTE).put("note", note)); + } + + public void broadcastNoteList() { + + List<Map<String, String>> notesInfo = generateNotebooksInfo(); broadcastAll(new Message(OP.NOTES_INFO).put("notes", notesInfo)); } http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/27b7ad52/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java index bffc888..8c8ff07 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java @@ -145,6 +145,8 @@ public class ZeppelinRestApiTest extends AbstractTestRestApi { assertTrue(0 < body.size()); get.releaseConnection(); + //cleanup + ZeppelinServer.notebook.removeNote(note.getId()); } @Test @@ -179,6 +181,8 @@ public class ZeppelinRestApiTest extends AbstractTestRestApi { Thread.sleep(100); } assertEquals("<p>markdown restarted</p>\n", p.getResult().message()); + //cleanup + ZeppelinServer.notebook.removeNote(note.getId()); } @Test @@ -236,6 +240,7 @@ public class ZeppelinRestApiTest extends AbstractTestRestApi { testDeleteNotebook("bad_ID"); } + private void testDeleteNotebook(String notebookId) throws IOException { DeleteMethod delete = httpDelete(("/notebook/" + notebookId)); @@ -282,5 +287,18 @@ public class ZeppelinRestApiTest extends AbstractTestRestApi { ZeppelinServer.notebook.removeNote(newNote.getId()); post.releaseConnection(); } + + @Test + public void testListNotebooks() throws IOException { + LOG.info("testListNotebooks"); + GetMethod get = httpGet("/notebook/ "); + assertThat("List notebooks method", get, isAllowed()); + Map<String, Object> resp = gson.fromJson(get.getResponseBodyAsString(), new TypeToken<Map<String, Object>>() { + }.getType()); + List<Map<String, String>> body = (List<Map<String, String>>) resp.get("body"); + assertEquals("List notebooks are equal", ZeppelinServer.notebook.getAllNotes().size(), body.size()); + get.releaseConnection(); + } + }
