Support successfulNodes/failedNodes in execution data for api v10

This commit is contained in:
Greg Schueler 2014-01-16 15:12:38 -08:00
parent eb392dd32e
commit e3291e3dab
6 changed files with 139 additions and 2 deletions

View file

@ -17,6 +17,7 @@ package org.rundeck.api.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.time.DurationFormatUtils;
@ -52,6 +53,8 @@ public class RundeckExecution implements Serializable {
private String description;
private String argstring;
private String project;
private Set<RundeckNodeIdentity> successfulNodes;
private Set<RundeckNodeIdentity> failedNodes;
/**
* @return the duration of the execution in milliseconds (or null if the duration is still running, or has been
@ -174,7 +177,10 @@ public class RundeckExecution implements Serializable {
return "RundeckExecution [id=" + id + ", description=" + description + ", url=" + url + ", status=" + status
+ ", argstring=" + argstring
+ ", startedBy=" + startedBy + ", startedAt=" + startedAt + ", endedAt=" + endedAt
+ ", durationInSeconds=" + getDurationInSeconds() + ", abortedBy=" + abortedBy + ", job=" + job + "]";
+ ", durationInSeconds=" + getDurationInSeconds() + ", abortedBy=" + abortedBy + ", job=" + job
+ ", successfulNodes=" + getSuccessfulNodes()
+ ", failedNodes=" + getFailedNodes()
+ "]";
}
@Override
@ -281,6 +287,22 @@ public class RundeckExecution implements Serializable {
this.project = project;
}
public Set<RundeckNodeIdentity> getSuccessfulNodes() {
return successfulNodes;
}
public void setSuccessfulNodes(Set<RundeckNodeIdentity> successfulNodes) {
this.successfulNodes = successfulNodes;
}
public Set<RundeckNodeIdentity> getFailedNodes() {
return failedNodes;
}
public void setFailedNodes(Set<RundeckNodeIdentity> failedNodes) {
this.failedNodes = failedNodes;
}
/**
* The status of an execution
*/

View file

@ -23,7 +23,7 @@ import java.util.List;
*
* @author Vincent Behar
*/
public class RundeckNode implements Serializable {
public class RundeckNode implements Serializable, RundeckNodeIdentity {
private static final long serialVersionUID = 1L;
@ -63,6 +63,7 @@ public class RundeckNode implements Serializable {
/** URL to an external resource model service. (optional) */
private String remoteUrl;
@Override
public String getName() {
return name;
}

View file

@ -0,0 +1,14 @@
package org.rundeck.api.domain;
/**
* Identifies a node by name
*/
public interface RundeckNodeIdentity {
/**
* Return the rundeck Node name
*
* @return
*/
String getName();
}

View file

@ -15,12 +15,18 @@
*/
package org.rundeck.api.parser;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Node;
import org.rundeck.api.domain.RundeckExecution;
import org.rundeck.api.domain.RundeckJob;
import org.rundeck.api.domain.RundeckExecution.ExecutionStatus;
import org.rundeck.api.domain.RundeckNode;
import org.rundeck.api.domain.RundeckNodeIdentity;
/**
* Parser for a single {@link RundeckExecution}
@ -76,6 +82,26 @@ public class ExecutionParser implements XmlNodeParser<RundeckExecution> {
execution.setJob(job);
}
final Node successfulNodes = execNode.selectSingleNode("successfulNodes");
if (successfulNodes != null) {
final List<RundeckNode> rundeckNodes =
new ListParser<RundeckNode>(new NodeParser(), "successfulNodes/node")
.parseXmlNode(execNode);
execution.setSuccessfulNodes(new HashSet<RundeckNodeIdentity>(rundeckNodes));
}else{
execution.setSuccessfulNodes(Collections.<RundeckNodeIdentity>emptySet());
}
final Node failedNodes = execNode.selectSingleNode("failedNodes");
if (failedNodes != null) {
final List<RundeckNode> rundeckNodes =
new ListParser<RundeckNode>(new NodeParser(), "failedNodes/node")
.parseXmlNode(execNode);
execution.setFailedNodes(new HashSet<RundeckNodeIdentity>(rundeckNodes));
} else {
execution.setFailedNodes(Collections.<RundeckNodeIdentity>emptySet());
}
return execution;
}

View file

@ -16,13 +16,17 @@
package org.rundeck.api.parser;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import org.dom4j.Document;
import org.junit.Assert;
import org.junit.Test;
import org.rundeck.api.domain.RundeckExecution;
import org.rundeck.api.domain.RundeckJob;
import org.rundeck.api.domain.RundeckExecution.ExecutionStatus;
import org.rundeck.api.domain.RundeckNodeIdentity;
/**
* Test the {@link ExecutionParser}
@ -156,4 +160,47 @@ public class ExecutionParserTest {
}
@Test
public void parseV10Execution() throws Exception {
InputStream input = getClass().getResourceAsStream("execution-result-v10.xml");
Document document = ParserHelper.loadDocument(input);
RundeckExecution execution = new ExecutionParser("result/executions/execution").parseXmlNode(document);
RundeckJob job = execution.getJob();
Assert.assertNotNull(job);
Assert.assertEquals(new Long(146), execution.getId());
Assert.assertEquals("http://dignan.local:4440/execution/follow/146", execution.getUrl());
Assert.assertEquals(ExecutionStatus.SUCCEEDED, execution.getStatus());
Assert.assertEquals("admin", execution.getStartedBy());
Assert.assertEquals(new Date(1389894502959L), execution.getStartedAt());
Assert.assertEquals(new Date(1389894504561L), execution.getEndedAt());
Assert.assertEquals((Long)(1389894504561L- 1389894502959L), execution.getDurationInMillis());
Assert.assertEquals(null, execution.getAbortedBy());
Assert.assertEquals("fdfd", execution.getProject());
Assert.assertNotNull(execution.getSuccessfulNodes());
Assert.assertEquals(3, execution.getSuccessfulNodes().size());
HashSet<String> expectedSuccess = new HashSet<String>();
expectedSuccess.addAll(Arrays.asList(
"node-111.qa.subgroup.mycompany.com",
"node-6.qa.subgroup.mycompany.com",
"node-14.qa.subgroup.mycompany.com"));
for (RundeckNodeIdentity rundeckNodeIdentity : execution.getSuccessfulNodes()) {
Assert.assertTrue(expectedSuccess.contains(rundeckNodeIdentity.getName()));
}
Assert.assertNotNull(execution.getFailedNodes());
Assert.assertEquals(3, execution.getFailedNodes().size());
HashSet<String> expectedFailure = new HashSet<String>();
expectedFailure.addAll(Arrays.asList(
"node-112.qa.subgroup.mycompany.com",
"node-62.qa.subgroup.mycompany.com",
"node-12.qa.subgroup.mycompany.com"));
for (RundeckNodeIdentity rundeckNodeIdentity : execution.getFailedNodes()) {
Assert.assertTrue(expectedFailure.contains(rundeckNodeIdentity.getName()));
}
}
}

View file

@ -0,0 +1,27 @@
<result success="true" apiversion="10">
<executions count="1">
<execution id="146" href="http://dignan.local:4440/execution/follow/146" status="succeeded" project="fdfd">
<user>admin</user>
<date-started unixtime="1389894502959">2014-01-16T17:48:22Z</date-started>
<date-ended unixtime="1389894504561">2014-01-16T17:48:24Z</date-ended>
<job id="4ae33efb-5d37-4237-a33b-ac08eaaadf79" averageDuration="1528">
<name>test 1</name>
<group/>
<project>fdfd</project>
<description/>
</job>
<description>echo hi there</description>
<argstring/>
<successfulNodes>
<node name="node-111.qa.subgroup.mycompany.com"/>
<node name="node-6.qa.subgroup.mycompany.com"/>
<node name="node-14.qa.subgroup.mycompany.com"/>
</successfulNodes>
<failedNodes>
<node name="node-112.qa.subgroup.mycompany.com"/>
<node name="node-62.qa.subgroup.mycompany.com"/>
<node name="node-12.qa.subgroup.mycompany.com"/>
</failedNodes>
</execution>
</executions>
</result>