Repository: incubator-zeppelin Updated Branches: refs/heads/master 927f48225 -> f78d3096e
ZEPPELIN-528 REST API: add "progress" to 'get notebook job' API ### What is this PR for? To add 'progress' to 'get notebook job' REST API. All paragraphs which status is 'running' will include 'progress' to their job status. ### What type of PR is it? Improvement ### Todos ### Is there a relevant Jira issue? https://issues.apache.org/jira/browse/ZEPPELIN-528 ### How should this be tested? 1. Run a notebook or paragraph which takes some times. Paragraph which could show progress (%) would be more appreciated. Confirm that its status is 'RUNNING'. 2. Call ```http://<zeppelin host>:<zeppelin port>/api/notebook/job/<notebook id>``` to see if it has 'progress' field in JSON. ### Screenshots (if appropriate)   ### Questions: * Does the licenses files need update? (No) * Is there breaking changes for older versions? (No) * Does this needs documentation? (Yes or no. Output of the JSON format could be updated, but it could be treated as not mandatory.) Author: Jungtaek Lim <[email protected]> Closes #563 from HeartSaVioR/ZEPPELIN-528 and squashes the following commits: dc86b01 [Jungtaek Lim] ZEPPELIN-528 Add UT to get notebook job (especially 'progress' field) 69a58ab [Jungtaek Lim] Merge branch 'master' into ZEPPELIN-528 31a8e88 [Jungtaek Lim] ZEPPELIN-528 Explain new field 'progress' to JSON output 2597ebf [Jungtaek Lim] ZEPPELIN-528 Add 'progress' to paragraph information when running Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/f78d3096 Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/f78d3096 Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/f78d3096 Branch: refs/heads/master Commit: f78d3096e04d2b520e2fb257586ab61bdd9c847e Parents: 927f482 Author: Jungtaek Lim <[email protected]> Authored: Thu Dec 24 15:03:15 2015 +0900 Committer: Lee moon soo <[email protected]> Committed: Fri Dec 25 01:00:07 2015 +0900 ---------------------------------------------------------------------- docs/rest-api/rest-notebook.md | 2 +- .../java/org/apache/zeppelin/scheduler/Job.java | 6 +-- .../zeppelin/rest/ZeppelinRestApiTest.java | 53 ++++++++++++++++++++ .../java/org/apache/zeppelin/notebook/Note.java | 3 ++ 4 files changed, 60 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/f78d3096/docs/rest-api/rest-notebook.md ---------------------------------------------------------------------- diff --git a/docs/rest-api/rest-notebook.md b/docs/rest-api/rest-notebook.md index fade802..ffc3d8d 100644 --- a/docs/rest-api/rest-notebook.md +++ b/docs/rest-api/rest-notebook.md @@ -381,7 +381,7 @@ limitations under the License. </tr> <tr> <td> sample JSON response </td> - <td><pre>{"status":"OK","body":[{"id":"20151121-212654_766735423","status":"FINISHED","finished":"Tue Nov 24 14:21:40 KST 2015","started":"Tue Nov 24 14:21:39 KST 2015"},{"id":"20151121-212657_730976687","status":"FINISHED","finished":"Tue Nov 24 14:21:40 KST 2015","started":"Tue Nov 24 14:21:40 KST 2015"}]}</pre></td> + <td><pre>{"status":"OK","body":[{"id":"20151121-212654_766735423","status":"FINISHED","finished":"Tue Nov 24 14:21:40 KST 2015","started":"Tue Nov 24 14:21:39 KST 2015"},{"progress":"1","id":"20151121-212657_730976687","status":"RUNNING","finished":"Tue Nov 24 14:21:35 KST 2015","started":"Tue Nov 24 14:21:40 KST 2015"}]}</pre></td> </tr> </table> http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/f78d3096/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java ---------------------------------------------------------------------- diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java index c803d78..6379e4c 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java @@ -57,15 +57,15 @@ public abstract class Job { FINISHED, ERROR, ABORT; - boolean isReady() { + public boolean isReady() { return this == READY; } - boolean isRunning() { + public boolean isRunning() { return this == RUNNING; } - boolean isPending() { + public boolean isPending() { return this == PENDING; } } http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/f78d3096/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 2db3092..c69b223 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 @@ -434,6 +434,59 @@ public class ZeppelinRestApiTest extends AbstractTestRestApi { } @Test + public void testGetNotebookJob() throws IOException, InterruptedException { + LOG.info("testGetNotebookJob"); + // Create note to run test. + Note note = ZeppelinServer.notebook.createNote(); + assertNotNull("can't create new note", note); + note.setName("note for run test"); + Paragraph paragraph = note.addParagraph(); + + Map config = paragraph.getConfig(); + config.put("enabled", true); + paragraph.setConfig(config); + + paragraph.setText("%sh sleep 1"); + note.persist(); + 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 notebook job: ", get, isAllowed()); + String responseBody = get.getResponseBodyAsString(); + get.releaseConnection(); + + LOG.info("test get notebook job: \n" + responseBody); + Map<String, Object> resp = gson.fromJson(responseBody, new TypeToken<Map<String, Object>>() { + }.getType()); + + List<Map<String, Object>> paragraphs = (List<Map<String, Object>>) 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("testGetNotebookJob timeout job."); + break; + } + } + + ZeppelinServer.notebook.removeNote(note.getId()); + } + + @Test public void testRunParagraphWithParams() throws IOException, InterruptedException { LOG.info("testRunParagraphWithParams"); // Create note to run test. http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/f78d3096/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java ---------------------------------------------------------------------- diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index d193ecc..47da7c8 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -318,6 +318,9 @@ public class Note implements Serializable, JobListener { if (p.getDateFinished() != null) { info.put("finished", p.getDateFinished().toString()); } + if (p.getStatus().isRunning()) { + info.put("progress", String.valueOf(p.progress())); + } paragraphsInfo.add(info); } }
