From 6b2b7954d3c56b976c6d14353e9addca4cc0ea1d Mon Sep 17 00:00:00 2001 From: Greg Schueler Date: Thu, 16 Jan 2014 17:34:42 -0800 Subject: [PATCH] Add output/state sequence result for api v10 --- .../java/org/rundeck/api/RundeckClient.java | 30 +++++++++++ .../org/rundeck/api/RundeckClientTest.java | 51 +++++++++++++++++++ .../betamax/tapes/execution_output_state.yaml | 32 ++++++++++++ .../tapes/execution_output_state_only.yaml | 30 +++++++++++ 4 files changed, 143 insertions(+) create mode 100644 src/test/resources/betamax/tapes/execution_output_state.yaml create mode 100644 src/test/resources/betamax/tapes/execution_output_state_only.yaml diff --git a/src/main/java/org/rundeck/api/RundeckClient.java b/src/main/java/org/rundeck/api/RundeckClient.java index 6c0d248..221f735 100644 --- a/src/main/java/org/rundeck/api/RundeckClient.java +++ b/src/main/java/org/rundeck/api/RundeckClient.java @@ -3435,6 +3435,36 @@ public class RundeckClient implements Serializable { } return new ApiCall(this).get(param, new OutputParser("result/output", createOutputEntryParser())); } + /** + * Get the execution state output sequence of the given job + * + * @param executionId identifier of the execution - mandatory + * @param stateOnly if true, include only state change output entries, otherwise include state and log entries + * @param offset byte offset to read from in the file. 0 indicates the beginning. + * @param lastmod epoch datestamp in milliseconds, return results only if modification changed since the specified date OR if more data is available at the given offset + * @param maxlines maximum number of lines to retrieve forward from the specified offset. + * @return {@link RundeckOutput} + * @throws RundeckApiException in case of error when calling the API (non-existent job with this ID) + * @throws RundeckApiLoginException if the login fails (in case of login-based authentication) + * @throws RundeckApiTokenException if the token is invalid (in case of token-based authentication) + * @throws IllegalArgumentException if the jobId is blank (null, empty or whitespace) + */ + public RundeckOutput getJobExecutionOutputState(Long executionId, boolean stateOnly, int offset, long lastmod, int maxlines) + throws RundeckApiException, RundeckApiLoginException, RundeckApiTokenException, IllegalArgumentException { + AssertUtil.notNull(executionId, "executionId is mandatory to get the output of a job execution!"); + ApiPathBuilder param = new ApiPathBuilder("/execution/", executionId.toString(), "/output/state") + .param("offset", offset); + if (lastmod >= 0) { + param.param("lastmod", lastmod); + } + if (maxlines > 0) { + param.param("maxlines", maxlines); + } + if(stateOnly) { + param.param("stateOnly", true); + } + return new ApiCall(this).get(param, new OutputParser("result/output", createOutputEntryParser())); + } private OutputEntryParser createOutputEntryParser() { if (getApiVersion() <= Version.V5.versionNumber) { diff --git a/src/test/java/org/rundeck/api/RundeckClientTest.java b/src/test/java/org/rundeck/api/RundeckClientTest.java index 76cac2c..5e925a5 100644 --- a/src/test/java/org/rundeck/api/RundeckClientTest.java +++ b/src/test/java/org/rundeck/api/RundeckClientTest.java @@ -1136,6 +1136,57 @@ public class RundeckClientTest { Assert.assertEquals(1, output.getLogEntries().size()); } + /** + * Execution output state sequence + */ + @Test + @Betamax(tape = "execution_output_state", mode = TapeMode.READ_ONLY) + public void executionOutputState() throws Exception { + final RundeckClient client = createClient(TEST_TOKEN_6, 10); + RundeckOutput output = client.getJobExecutionOutputState(146L,false,0,0L,-1); + + Assert.assertEquals(new Long(1602), output.getExecDuration()); + Assert.assertEquals(new Long(146), output.getExecutionId()); + Assert.assertEquals(new Long(1389894504000L), output.getLastModified()); + Assert.assertEquals(null, output.getFilterNode()); + Assert.assertEquals(null, output.getFilterStep()); + Assert.assertEquals(1409, output.getOffset()); + Assert.assertEquals(RundeckExecution.ExecutionStatus.SUCCEEDED, output.getStatus()); + Assert.assertEquals(new Float(99.57597), output.getPercentLoaded()); + Assert.assertEquals(1415, output.getTotalSize()); + Assert.assertEquals(true, output.isCompleted()); + Assert.assertEquals(true, output.isExecCompleted()); + Assert.assertEquals(false, output.isEmpty()); + Assert.assertEquals(false, output.isHasFailedNodes()); + Assert.assertEquals(false, output.isUnmodified()); + Assert.assertEquals(15, output.getLogEntries().size()); + } + /** + * Execution output state sequence + */ + @Test + @Betamax(tape = "execution_output_state_only", mode = TapeMode.READ_ONLY) + public void executionOutputStateOnly() throws Exception { + final RundeckClient client = createClient(TEST_TOKEN_6, 10); + RundeckOutput output = client.getJobExecutionOutputState(146L,true,0,0L,-1); + + Assert.assertEquals(new Long(1602), output.getExecDuration()); + Assert.assertEquals(new Long(146), output.getExecutionId()); + Assert.assertEquals(new Long(1389894504000L), output.getLastModified()); + Assert.assertEquals(null, output.getFilterNode()); + Assert.assertEquals(null, output.getFilterStep()); + Assert.assertEquals(1409, output.getOffset()); + Assert.assertEquals(RundeckExecution.ExecutionStatus.SUCCEEDED, output.getStatus()); + Assert.assertEquals(new Float(99.57597), output.getPercentLoaded()); + Assert.assertEquals(1415, output.getTotalSize()); + Assert.assertEquals(true, output.isCompleted()); + Assert.assertEquals(true, output.isExecCompleted()); + Assert.assertEquals(false, output.isEmpty()); + Assert.assertEquals(false, output.isHasFailedNodes()); + Assert.assertEquals(false, output.isUnmodified()); + Assert.assertEquals(12, output.getLogEntries().size()); + } + @Before public void setUp() throws Exception { // not that you can put whatever here, because we don't actually connect to the RunDeck instance diff --git a/src/test/resources/betamax/tapes/execution_output_state.yaml b/src/test/resources/betamax/tapes/execution_output_state.yaml new file mode 100644 index 0000000..7833717 --- /dev/null +++ b/src/test/resources/betamax/tapes/execution_output_state.yaml @@ -0,0 +1,32 @@ +!tape +name: execution_output_state +interactions: +- recorded: 2014-01-17T01:32:08.245Z + request: + method: GET + uri: http://rundeck.local:4440/api/10/execution/146/output/state?offset=0&lastmod=0 + headers: + Accept: text/xml + Host: rundeck.local:4440 + Proxy-Connection: Keep-Alive + User-Agent: RunDeck API Java Client 10 + X-RunDeck-Auth-Token: Do4d3NUD5DKk21DR4sNK755RcPk618vn + response: + status: 200 + headers: + Content-Type: text/xml;charset=UTF-8 + Expires: Thu, 01 Jan 1970 00:00:00 GMT + Server: Jetty(7.6.0.v20120127) + Set-Cookie: JSESSIONID=wanbmac3kkhgo3jghy3twd7g;Path=/ + body: "\n \n 146\n 1409\n true\n true\n false\n succeeded\n\ + \ 1389894504000\n 1602\n 99.57597173144876\n 1415\n \n \n \n \n \n \n \n \n \n \n \n \n\ + \ \n \n \n \n \n \n" diff --git a/src/test/resources/betamax/tapes/execution_output_state_only.yaml b/src/test/resources/betamax/tapes/execution_output_state_only.yaml new file mode 100644 index 0000000..5667072 --- /dev/null +++ b/src/test/resources/betamax/tapes/execution_output_state_only.yaml @@ -0,0 +1,30 @@ +!tape +name: execution_output_state_only +interactions: +- recorded: 2014-01-17T01:34:08.528Z + request: + method: GET + uri: http://rundeck.local:4440/api/10/execution/146/output/state?offset=0&lastmod=0&stateOnly=true + headers: + Accept: text/xml + Host: rundeck.local:4440 + Proxy-Connection: Keep-Alive + User-Agent: RunDeck API Java Client 10 + X-RunDeck-Auth-Token: Do4d3NUD5DKk21DR4sNK755RcPk618vn + response: + status: 200 + headers: + Content-Type: text/xml;charset=UTF-8 + Expires: Thu, 01 Jan 1970 00:00:00 GMT + Server: Jetty(7.6.0.v20120127) + Set-Cookie: JSESSIONID=19nlvjuo85wqz1lwl7biksu77h;Path=/ + body: "\n \n 146\n 1409\n true\n true\n false\n succeeded\n\ + \ 1389894504000\n 1602\n 99.57597173144876\n 1415\n \n \n \n \n \n \n\ + \ \n \n \n \n \n \n \n \n \n"