mirror of https://github.com/apache/jclouds.git
added node command to get master
This commit is contained in:
parent
9884d04c2e
commit
5ee2cf6748
|
@ -18,9 +18,21 @@
|
|||
*/
|
||||
package org.jclouds.jenkins.v1;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
|
||||
import org.jclouds.jenkins.v1.domain.Node;
|
||||
import org.jclouds.jenkins.v1.features.ComputerAsyncClient;
|
||||
import org.jclouds.jenkins.v1.features.JobAsyncClient;
|
||||
import org.jclouds.jenkins.v1.filters.BasicAuthenticationUnlessAnonymous;
|
||||
import org.jclouds.rest.annotations.Delegate;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
|
||||
/**
|
||||
* Provides asynchronous access to Jenkins via their REST API.
|
||||
|
@ -30,8 +42,18 @@ import org.jclouds.rest.annotations.Delegate;
|
|||
* @see <a href="https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API">api doc</a>
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@RequestFilters(BasicAuthenticationUnlessAnonymous.class)
|
||||
public interface JenkinsAsyncClient {
|
||||
|
||||
|
||||
/**
|
||||
* @see JenkinsClient#getMaster
|
||||
*/
|
||||
@GET
|
||||
@Path("/api/json")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||
ListenableFuture<Node> getMaster();
|
||||
|
||||
/**
|
||||
* Provides asynchronous access to Computer features.
|
||||
*/
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.jclouds.jenkins.v1;
|
|||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.jclouds.concurrent.Timeout;
|
||||
import org.jclouds.jenkins.v1.domain.Node;
|
||||
import org.jclouds.jenkins.v1.features.ComputerClient;
|
||||
import org.jclouds.jenkins.v1.features.JobClient;
|
||||
import org.jclouds.rest.annotations.Delegate;
|
||||
|
@ -35,6 +36,10 @@ import org.jclouds.rest.annotations.Delegate;
|
|||
*/
|
||||
@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
|
||||
public interface JenkinsClient {
|
||||
/**
|
||||
* @return the master computer
|
||||
*/
|
||||
Node getMaster();
|
||||
|
||||
/**
|
||||
* Provides synchronous access to Computer features.
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds 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.jclouds.jenkins.v1.domain;
|
||||
|
||||
import static com.google.common.base.Objects.equal;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import com.google.common.base.Objects.ToStringHelper;
|
||||
|
||||
/**
|
||||
* Minimal info about a Job
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class Job {
|
||||
|
||||
public static Builder<?> builder() {
|
||||
return new ConcreteBuilder();
|
||||
}
|
||||
|
||||
public Builder<?> toBuilder() {
|
||||
return builder().fromJob(this);
|
||||
}
|
||||
|
||||
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
|
||||
}
|
||||
|
||||
public static abstract class Builder<B extends Builder<B>> {
|
||||
private String name;
|
||||
private URI url;
|
||||
private String color;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected B self() {
|
||||
return (B) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Job#getName()
|
||||
*/
|
||||
public B name(String name) {
|
||||
this.name = name;
|
||||
return self();
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Job#getUrl()
|
||||
*/
|
||||
public B url(URI url) {
|
||||
this.url = url;
|
||||
return self();
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Job#getColor()
|
||||
*/
|
||||
public B color(String color) {
|
||||
this.color = color;
|
||||
return self();
|
||||
}
|
||||
|
||||
public Job build() {
|
||||
return new Job(this);
|
||||
}
|
||||
|
||||
protected B fromJob(Job in) {
|
||||
return name(in.getName()).color(in.getColor()).url(in.getUrl());
|
||||
}
|
||||
}
|
||||
|
||||
private final String name;
|
||||
private final String color;
|
||||
private final URI url;
|
||||
|
||||
protected Job(Builder<?> builder) {
|
||||
this.name = checkNotNull(builder.name, "name");
|
||||
this.color = checkNotNull(builder.color, "color");
|
||||
this.url = checkNotNull(builder.url, "url");
|
||||
}
|
||||
|
||||
/**
|
||||
* name of the job
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* color of the job
|
||||
*/
|
||||
public String getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* url of the job
|
||||
*/
|
||||
public URI getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o)
|
||||
return true;
|
||||
if (o == null || getClass() != o.getClass())
|
||||
return false;
|
||||
Job that = Job.class.cast(o);
|
||||
return equal(this.name, that.name) && equal(this.url, that.url)
|
||||
&& equal(this.color, that.color);
|
||||
}
|
||||
|
||||
public boolean clone(Object o) {
|
||||
if (this == o)
|
||||
return false;
|
||||
if (o == null || getClass() != o.getClass())
|
||||
return false;
|
||||
Job that = Job.class.cast(o);
|
||||
return equal(this.color, that.color);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(name, url, color);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return string().toString();
|
||||
}
|
||||
|
||||
protected ToStringHelper string() {
|
||||
return Objects.toStringHelper("").add("name", name).add("url", url).add("color",
|
||||
color);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds 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.jclouds.jenkins.v1.domain;
|
||||
|
||||
import com.google.common.base.Objects.ToStringHelper;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class JobDetails extends Job {
|
||||
|
||||
public static Builder<?> builder() {
|
||||
return new ConcreteBuilder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder<?> toBuilder() {
|
||||
return builder().fromJobDetails(this);
|
||||
}
|
||||
|
||||
public static class Builder<B extends Builder<B>> extends Job.Builder<B> {
|
||||
|
||||
@Override
|
||||
public JobDetails build() {
|
||||
return new JobDetails(this);
|
||||
}
|
||||
|
||||
public B fromJobDetails(JobDetails in) {
|
||||
return fromJob(in);
|
||||
}
|
||||
}
|
||||
|
||||
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
|
||||
}
|
||||
|
||||
protected JobDetails(Builder<?> builder) {
|
||||
super(builder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ToStringHelper string() {
|
||||
return super.string(); // .add("field", field);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,147 @@
|
|||
package org.jclouds.jenkins.v1.domain;
|
||||
|
||||
import static com.google.common.base.Objects.equal;
|
||||
import static com.google.common.base.Objects.toStringHelper;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import com.google.common.base.Objects.ToStringHelper;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
* @see <a
|
||||
* href="http://ci.jruby.org/api/">api
|
||||
* doc</a>
|
||||
*/
|
||||
public class Node implements Comparable<Node> {
|
||||
|
||||
public static Builder builder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
public Builder toBuilder() {
|
||||
return builder().fromNodeMetadata(this);
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
protected String name;
|
||||
protected String description;
|
||||
protected Set<Job> jobs = ImmutableSet.of();
|
||||
|
||||
/**
|
||||
* @see Node#getName()
|
||||
*/
|
||||
public Builder name(String name) {
|
||||
this.name = checkNotNull(name, "name");
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Node#getDescription()
|
||||
*/
|
||||
public Builder description(String description) {
|
||||
this.description = description;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Node#getJobs()
|
||||
*/
|
||||
public Builder jobs(Job... jobs) {
|
||||
return jobs(ImmutableSet.copyOf(checkNotNull(jobs, "jobs")));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see Node#getJobs()
|
||||
*/
|
||||
public Builder jobs(Set<Job> jobs) {
|
||||
this.jobs = ImmutableSet.copyOf(checkNotNull(jobs, "jobs"));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Node build() {
|
||||
return new Node(name, description, jobs);
|
||||
}
|
||||
|
||||
public Builder fromNodeMetadata(Node from) {
|
||||
return name(from.getName()).description(from.getDescription()).jobs(from.getJobs());
|
||||
}
|
||||
}
|
||||
|
||||
@SerializedName("nodeName")
|
||||
protected final String name;
|
||||
@SerializedName("nodeDescription")
|
||||
protected final String description;
|
||||
protected final Set<Job> jobs;
|
||||
|
||||
public Node(String name, String description, Set<Job> jobs) {
|
||||
this.name = checkNotNull(name, "name");
|
||||
this.description = description;
|
||||
this.jobs = ImmutableSet.copyOf(checkNotNull(jobs, "jobs"));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return the name of the node
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return the description of the node
|
||||
*/
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the jobs on this node
|
||||
*/
|
||||
public Set<Job> getJobs() {
|
||||
return jobs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object object) {
|
||||
if (this == object) {
|
||||
return true;
|
||||
}
|
||||
if (object instanceof Node) {
|
||||
final Node other = Node.class.cast(object);
|
||||
return equal(getName(), other.getName()) && equal(getDescription(), other.getDescription())
|
||||
&& equal(getJobs(), other.getJobs());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(getName(), getDescription(), getJobs());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return string().toString();
|
||||
}
|
||||
|
||||
protected ToStringHelper string() {
|
||||
return toStringHelper("").add("name", getName()).add("description", getDescription()).add("jobs", getJobs());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Node that) {
|
||||
if (that == null)
|
||||
return 1;
|
||||
if (this == that)
|
||||
return 0;
|
||||
return this.getName().compareTo(that.getName());
|
||||
}
|
||||
|
||||
}
|
|
@ -61,4 +61,5 @@ public interface ComputerAsyncClient {
|
|||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||
ListenableFuture<Computer> get(@PathParam("displayName") String displayName);
|
||||
|
||||
}
|
||||
|
|
|
@ -45,4 +45,5 @@ public interface ComputerClient {
|
|||
* @return computer or null if not found
|
||||
*/
|
||||
Computer get(String displayName);
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds 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.jclouds.jenkins.v1;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.jenkins.v1.internal.BaseJenkinsClientExpectTest;
|
||||
import org.jclouds.jenkins.v1.parse.ParseNodeTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "JenkinsClientExpectTest")
|
||||
public class JenkinsClientExpectTest extends BaseJenkinsClientExpectTest {
|
||||
|
||||
public void testGetMasterWhenResponseIs2xx() {
|
||||
HttpRequest getMaster = HttpRequest
|
||||
.builder()
|
||||
.method("GET")
|
||||
.endpoint(URI.create("http://localhost:8080/api/json"))
|
||||
.headers(
|
||||
ImmutableMultimap.<String, String> builder()
|
||||
.put("Accept", "application/json")
|
||||
.put("Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build()).build();
|
||||
|
||||
HttpResponse getMasterResponse = HttpResponse.builder().statusCode(200)
|
||||
.payload(payloadFromResource("/master.json")).build();
|
||||
|
||||
JenkinsClient clientWhenMasterExists = requestSendsResponse(getMaster, getMasterResponse);
|
||||
|
||||
assertEquals(clientWhenMasterExists.getMaster().toString(),
|
||||
new ParseNodeTest().expected().toString());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds 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.jclouds.jenkins.v1;
|
||||
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
|
||||
import org.jclouds.jenkins.v1.domain.Node;
|
||||
import org.jclouds.jenkins.v1.internal.BaseJenkinsClientLiveTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "live", testName = "JenkinsClientLiveTest")
|
||||
public class JenkinsClientLiveTest extends BaseJenkinsClientLiveTest {
|
||||
|
||||
public void testGetMaster(){
|
||||
Node master = context.getApi().getMaster();
|
||||
assertNotNull(master);
|
||||
assertNotNull(master.getName());
|
||||
assertNotNull(master.getJobs());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds 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.jclouds.jenkins.v1.parse;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
|
||||
import org.jclouds.jenkins.v1.domain.Job;
|
||||
import org.jclouds.jenkins.v1.domain.Node;
|
||||
import org.jclouds.json.BaseItemParserTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "ParseNodeTest")
|
||||
public class ParseNodeTest extends BaseItemParserTest<Node> {
|
||||
|
||||
@Override
|
||||
public String resource() {
|
||||
return "/master.json";
|
||||
}
|
||||
|
||||
@Override
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Node expected() {
|
||||
return Node.builder()
|
||||
.name("")
|
||||
.description("the master Jenkins node")
|
||||
.jobs(Job.builder()
|
||||
.name("ddd")
|
||||
.url(URI.create("http://localhost:8080/job/ddd/"))
|
||||
.color("grey").build())
|
||||
.build();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"actions": [],
|
||||
"description": "",
|
||||
"displayName": "ddd",
|
||||
"displayNameOrNull": null,
|
||||
"name": "ddd",
|
||||
"url": "http://localhost:8080/job/ddd/",
|
||||
"buildable": true,
|
||||
"builds": [],
|
||||
"color": "grey",
|
||||
"firstBuild": null,
|
||||
"healthReport": [],
|
||||
"inQueue": false,
|
||||
"keepDependencies": false,
|
||||
"lastBuild": null,
|
||||
"lastCompletedBuild": null,
|
||||
"lastFailedBuild": null,
|
||||
"lastStableBuild": null,
|
||||
"lastSuccessfulBuild": null,
|
||||
"lastUnstableBuild": null,
|
||||
"lastUnsuccessfulBuild": null,
|
||||
"nextBuildNumber": 1,
|
||||
"property": [],
|
||||
"queueItem": null,
|
||||
"concurrentBuild": false,
|
||||
"downstreamProjects": [],
|
||||
"scm": {},
|
||||
"upstreamProjects": []
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"assignedLabels": [{}],
|
||||
"mode": "NORMAL",
|
||||
"nodeDescription": "the master Jenkins node",
|
||||
"nodeName": "",
|
||||
"numExecutors": 2,
|
||||
"description": null,
|
||||
"jobs": [{
|
||||
"name": "ddd",
|
||||
"url": "http://localhost:8080/job/ddd/",
|
||||
"color": "grey"
|
||||
}],
|
||||
"overallLoad": {},
|
||||
"primaryView": {
|
||||
"name": "All",
|
||||
"url": "http://localhost:8080/"
|
||||
},
|
||||
"quietingDown": false,
|
||||
"slaveAgentPort": 0,
|
||||
"useCrumbs": false,
|
||||
"useSecurity": false,
|
||||
"views": [{
|
||||
"name": "All",
|
||||
"url": "http://localhost:8080/"
|
||||
}]
|
||||
}
|
Loading…
Reference in New Issue