Improving Domain, Server and Archive services

This commit is contained in:
Adam Lowe 2011-12-21 22:16:40 +00:00
parent 79674bd89b
commit bb5210eb6f
18 changed files with 708 additions and 150 deletions

View File

@ -3,9 +3,11 @@ package org.jclouds.glesys.domain;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
@ -74,7 +76,7 @@ public class ServerCreated {
} }
public List<ServerCreatedIp> getIps() { public List<ServerCreatedIp> getIps() {
return ips; return ips == null ? ImmutableList.<ServerCreatedIp>of() : ips;
} }
@Override @Override

View File

@ -30,7 +30,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
*/ */
public enum ServerState { public enum ServerState {
RUNNING, UNRECOGNIZED; RUNNING, STOPPED, UNRECOGNIZED;
public String value() { public String value() {
return (CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name())); return (CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name()));

View File

@ -99,6 +99,7 @@ public interface ArchiveAsyncClient {
@Path("/archive/allowedarguments/format/json") @Path("/archive/allowedarguments/format/json")
@SelectJson("argumentslist") @SelectJson("argumentslist")
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<ArchiveAllowedArguments> getArchiveAllowedArguments(); ListenableFuture<ArchiveAllowedArguments> getArchiveAllowedArguments();
} }

View File

@ -25,10 +25,15 @@ import org.jclouds.glesys.options.DomainOptions;
import org.jclouds.glesys.options.DomainRecordAddOptions; import org.jclouds.glesys.options.DomainRecordAddOptions;
import org.jclouds.glesys.options.DomainRecordModifyOptions; import org.jclouds.glesys.options.DomainRecordModifyOptions;
import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.SelectJson; import org.jclouds.rest.annotations.SelectJson;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import javax.ws.rs.*; import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import java.util.Set; import java.util.Set;
@ -50,6 +55,7 @@ public interface DomainAsyncClient {
@Path("/domain/list/format/json") @Path("/domain/list/format/json")
@SelectJson("domains") @SelectJson("domains")
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
ListenableFuture<Set<Domain>> listDomains(); ListenableFuture<Set<Domain>> listDomains();
/** /**
@ -57,43 +63,37 @@ public interface DomainAsyncClient {
*/ */
@POST @POST
@Path("/domain/add/format/json") @Path("/domain/add/format/json")
@Consumes(MediaType.APPLICATION_JSON) ListenableFuture<Void> addDomain(@FormParam("name") String name, DomainOptions... options);
ListenableFuture<Void> addDomain(@FormParam("name") String domain, DomainOptions... options);
/** /**
* @see DomainClient#editDomain * @see DomainClient#editDomain
*/ */
@POST @POST
@Path("/domain/add/format/json") @Path("/domain/edit/format/json")
@Consumes(MediaType.APPLICATION_JSON)
ListenableFuture<Void> editDomain(@FormParam("domain") String domain, DomainOptions... options); ListenableFuture<Void> editDomain(@FormParam("domain") String domain, DomainOptions... options);
@POST @POST
@Path("/domain/delete/format/json") @Path("/domain/delete/format/json")
@Consumes(MediaType.APPLICATION_JSON)
ListenableFuture<Void> deleteDomain(@FormParam("domain") String domain); ListenableFuture<Void> deleteDomain(@FormParam("domain") String domain);
@GET @POST
@Path("/domain/list_records/domain/{domain}/format/json") @Path("/domain/list_records/format/json")
@SelectJson("records") @SelectJson("records")
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
ListenableFuture<Set<DomainRecord>> listRecords(@PathParam("domain") String domain); ListenableFuture<Set<DomainRecord>> listRecords(@FormParam("domain") String domain);
@POST @POST
@Path("/domain/add_record/format/json") @Path("/domain/add_record/format/json")
@Consumes(MediaType.APPLICATION_JSON)
ListenableFuture<Void> addRecord(@FormParam("domain") String domain, @FormParam("host") String host, ListenableFuture<Void> addRecord(@FormParam("domain") String domain, @FormParam("host") String host,
@FormParam("type") String type, @FormParam("data") String data, @FormParam("type") String type, @FormParam("data") String data,
DomainRecordAddOptions... options); DomainRecordAddOptions... options);
@POST @POST
@Path("/domain/update_record/format/json") @Path("/domain/update_record/format/json")
@Consumes(MediaType.APPLICATION_JSON)
ListenableFuture<Void> editRecord(@FormParam("record_id") String record_id, DomainRecordModifyOptions... options); ListenableFuture<Void> editRecord(@FormParam("record_id") String record_id, DomainRecordModifyOptions... options);
@POST @POST
@Path("/domain/delete_record/format/json") @Path("/domain/delete_record/format/json")
@Consumes(MediaType.APPLICATION_JSON)
ListenableFuture<Void> deleteRecord(@FormParam("record_id") String recordId); ListenableFuture<Void> deleteRecord(@FormParam("record_id") String recordId);
} }

View File

@ -33,7 +33,7 @@ import java.util.concurrent.TimeUnit;
* <p/> * <p/>
* *
* @author Adam Lowe * @author Adam Lowe
* @see InvoiceAsyncClient * @see DomainAsyncClient
* @see <a href="https://customer.glesys.com/api.php" /> * @see <a href="https://customer.glesys.com/api.php" />
*/ */
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS) @Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
@ -50,6 +50,7 @@ public interface DomainClient {
* Add a domain to the Glesys dns-system * Add a domain to the Glesys dns-system
* *
* @param domain the name of the domain to add. * @param domain the name of the domain to add.
* @param options optional parameters
*/ */
void addDomain(String domain, DomainOptions... options); void addDomain(String domain, DomainOptions... options);
@ -57,6 +58,7 @@ public interface DomainClient {
* Add a domain to the Glesys dns-system * Add a domain to the Glesys dns-system
* *
* @param domain the name of the domain to add. * @param domain the name of the domain to add.
* @param options optional parameters
*/ */
void editDomain(String domain, DomainOptions... options); void editDomain(String domain, DomainOptions... options);
@ -77,7 +79,7 @@ public interface DomainClient {
/** /**
* Add a DNS Record * Add a DNS Record
* *
* @param domain * @param domain the domain to add the record to
* @param host * @param host
* @param type * @param type
* @param data * @param data

View File

@ -20,6 +20,7 @@ package org.jclouds.glesys.features;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import org.jclouds.glesys.domain.*; import org.jclouds.glesys.domain.*;
import org.jclouds.glesys.options.*;
import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.RequestFilters;
@ -71,7 +72,7 @@ public interface ServerAsyncClient {
@SelectJson("server") @SelectJson("server")
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
@ExceptionParser(ReturnNullOnNotFoundOr404.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<ServerStatus> getServerStatus(@FormParam("serverid") String id); ListenableFuture<ServerStatus> getServerStatus(@FormParam("serverid") String id, ServerStatusOptions... options);
/** /**
* @see ServerClient#getServerLimits * @see ServerClient#getServerLimits
@ -117,29 +118,29 @@ public interface ServerAsyncClient {
* @see ServerClient#stopServer * @see ServerClient#stopServer
*/ */
@POST @POST
@Path("/server/resetlimit/serverid/{id}/type/{type}/format/json") @Path("/server/resetlimit/format/json")
ListenableFuture<Void> resetServerLimit(@FormParam("id") String id, @FormParam("type") String type); ListenableFuture<Void> resetServerLimit(@FormParam("serverid") String id, @FormParam("type") String type);
/** /**
* @see ServerClient#rebootServer * @see ServerClient#rebootServer
*/ */
@POST @POST
@Path("/server/reboot/format/json") @Path("/server/reboot/format/json")
ListenableFuture<Void> rebootServer(@FormParam("id") String id); ListenableFuture<Void> rebootServer(@FormParam("serverid") String id);
/** /**
* @see ServerClient#startServer * @see ServerClient#startServer
*/ */
@POST @POST
@Path("/server/start/format/json") @Path("/server/start/format/json")
ListenableFuture<Void> startServer(@FormParam("id") String id); ListenableFuture<Void> startServer(@FormParam("serverid") String id);
/** /**
* @see ServerClient#stopServer * @see ServerClient#stopServer
*/ */
@POST @POST
@Path("/server/stop/format/json") @Path("/server/stop/format/json")
ListenableFuture<Void> stopServer(@FormParam("id") String id); ListenableFuture<Void> stopServer(@FormParam("serverid") String id, ServerStopOptions... options);
/** /**
* @see ServerClient#createServer * @see ServerClient#createServer
@ -157,11 +158,10 @@ public interface ServerAsyncClient {
@FormParam("cpucores") int cpucores, @FormParam("cpucores") int cpucores,
@FormParam("rootpw") String rootpw, @FormParam("rootpw") String rootpw,
@FormParam("transfer") int transfer, @FormParam("transfer") int transfer,
String description, ServerCreateOptions... options);
String ip);
/** /**
* @see ServerClient#createServer * @see ServerClient#cloneServer
*/ */
@POST @POST
@Path("/server/clone/format/json") @Path("/server/clone/format/json")
@ -169,12 +169,14 @@ public interface ServerAsyncClient {
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
ListenableFuture<ServerCreated> cloneServer(@FormParam("serverid") String serverid, ListenableFuture<ServerCreated> cloneServer(@FormParam("serverid") String serverid,
@FormParam("hostname") String hostname, @FormParam("hostname") String hostname,
@FormParam("disksize") int diskSize, ServerCloneOptions... options);
@FormParam("memorysize") int memorySize,
@FormParam("cpucores") int cpucores, /**
@FormParam("transfer") int transfer, * @see ServerClient#editServer
@FormParam("description") String description, */
@FormParam("datacenter") String dataCenter); @POST
@Path("/server/edit/format/json")
ListenableFuture<Void> editServer(@FormParam("serverid") String serverid, ServerEditOptions... options);
/** /**
* @see ServerClient#destroyServer * @see ServerClient#destroyServer

View File

@ -20,6 +20,7 @@ package org.jclouds.glesys.features;
import org.jclouds.concurrent.Timeout; import org.jclouds.concurrent.Timeout;
import org.jclouds.glesys.domain.*; import org.jclouds.glesys.domain.*;
import org.jclouds.glesys.options.*;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
import javax.ws.rs.FormParam; import javax.ws.rs.FormParam;
@ -61,9 +62,10 @@ public interface ServerClient {
* (cpu, disk, memory and bandwidth) * (cpu, disk, memory and bandwidth)
* *
* @param id id of the server * @param id id of the server
* @param options optional parameters
* @return the status of the server or null if not found * @return the status of the server or null if not found
*/ */
ServerStatus getServerStatus(String id); ServerStatus getServerStatus(String id, ServerStatusOptions... options);
/** /**
* Get detailed information about a server's limits (for OpenVZ only). * Get detailed information about a server's limits (for OpenVZ only).
@ -124,8 +126,9 @@ public interface ServerClient {
* Stop a server * Stop a server
* *
* @param id id of the server * @param id id of the server
* @param options optional parameters
*/ */
void stopServer(String id); void stopServer(String id, ServerStopOptions... options);
/** /**
* Create a new server * Create a new server
@ -139,12 +142,28 @@ public interface ServerClient {
* @param cpucores the number of CPU cores to allocate * @param cpucores the number of CPU cores to allocate
* @param rootpw the root password to use * @param rootpw the root password to use
* @param transfer the transfer size * @param transfer the transfer size
* @param description a description of the server * @param options optional settings ex. description
* @param ip ip address to assign to the new server, required by Xen platform
*/ */
ServerCreated createServer(String datacenter, String platform, ServerCreated createServer(String datacenter, String platform,
String hostname, String template, int disksize, int memorysize, String hostname, String template, int disksize, int memorysize,
int cpucores, String rootpw, int transfer, @Nullable String description, @Nullable String ip); int cpucores, String rootpw, int transfer, ServerCreateOptions... options);
/**
* Edit the configuration of a server
*
* @param serverid the serverId of the server to edit
* @param options the settings to change
*/
void editServer(String serverid, ServerEditOptions... options);
/**
* Clone a server
*
* @param serverid the serverId of the server to clone
* @param hostname the new host name of the cloned server
* @param options the settings to change
*/
ServerCreated cloneServer(String serverid, String hostname, ServerCloneOptions... options);
/** /**
* Destroy a server * Destroy a server

View File

@ -0,0 +1,69 @@
package org.jclouds.glesys.options;
/**
* @author Adam Lowe
*/
public class ServerCloneOptions extends ServerEditOptions {
public static class Builder {
/**
* @see org.jclouds.glesys.options.ServerCloneOptions#disksize
*/
public static ServerCloneOptions disksize(int disksize) {
ServerCloneOptions options = new ServerCloneOptions();
return ServerCloneOptions.class.cast(options.disksize(disksize));
}
/**
* @see org.jclouds.glesys.options.ServerCloneOptions#memorysize
*/
public static ServerCloneOptions memorysize(int memorysize) {
ServerCloneOptions options = new ServerCloneOptions();
return ServerCloneOptions.class.cast(options.memorysize(memorysize));
}
/**
* @see org.jclouds.glesys.options.ServerCloneOptions#cpucores
*/
public static ServerCloneOptions cpucores(int cpucores) {
ServerCloneOptions options = new ServerCloneOptions();
return ServerCloneOptions.class.cast(options.cpucores(cpucores));
}
/**
* @see org.jclouds.glesys.options.ServerCloneOptions#cpucores
*/
public static ServerCloneOptions transfer(int transfer) {
ServerCloneOptions options = new ServerCloneOptions();
return ServerCloneOptions.class.cast(options.transfer(transfer));
}
/**
* @see org.jclouds.glesys.options.ServerCloneOptions#hostname
*/
public static ServerCloneOptions hostname(String hostname) {
ServerCloneOptions options = new ServerCloneOptions();
return ServerCloneOptions.class.cast(options.hostname(hostname));
}
/**
* @see org.jclouds.glesys.options.ServerEditOptions#description
*/
public static ServerCloneOptions description(String description) {
ServerCloneOptions options = new ServerCloneOptions();
return ServerCloneOptions.class.cast(options.description(description));
}
/**
* @see org.jclouds.glesys.options.ServerCloneOptions#dataCenter
*/
public static ServerCloneOptions dataCenter(String dataCenter) {
ServerCloneOptions options = new ServerCloneOptions();
return options.dataCenter(dataCenter);
}
}
public ServerCloneOptions dataCenter(String dataCenter) {
formParameters.put("datacenter", dataCenter);
return this;
}
}

View File

@ -0,0 +1,43 @@
package org.jclouds.glesys.options;
import org.jclouds.http.options.BaseHttpRequestOptions;
/**
* @author Adam Lowe
*/
public class ServerCreateOptions extends BaseHttpRequestOptions {
public static class Builder {
/**
* @see ServerCreateOptions#description
*/
public static ServerCreateOptions description(String primaryNameServer) {
ServerCreateOptions options = new ServerCreateOptions();
return options.description(primaryNameServer);
}
/**
* @see ServerCreateOptions#ip
*/
public static ServerCreateOptions ip(String ip) {
ServerCreateOptions options = new ServerCreateOptions();
return options.ip(ip);
}
}
/**
* @param description the description of the server
*/
public ServerCreateOptions description(String description) {
formParameters.put("description", description);
return this;
}
/**
* @param ip the ip address to assign to the server
*/
public ServerCreateOptions ip(String ip) {
formParameters.put("ip", ip);
return this;
}
}

View File

@ -0,0 +1,91 @@
package org.jclouds.glesys.options;
import org.jclouds.http.options.BaseHttpRequestOptions;
/**
*
* @author Adam Lowe
*/
public class ServerEditOptions extends BaseHttpRequestOptions {
public static class Builder {
/**
* @see org.jclouds.glesys.options.ServerEditOptions#disksize
*/
public static ServerEditOptions disksize(int disksize) {
ServerEditOptions options = new ServerEditOptions();
return options.disksize(disksize);
}
/**
* @see org.jclouds.glesys.options.ServerEditOptions#memorysize
*/
public static ServerEditOptions memorysize(int memorysize) {
ServerEditOptions options = new ServerEditOptions();
return options.memorysize(memorysize);
}
/**
* @see org.jclouds.glesys.options.ServerEditOptions#cpucores
*/
public static ServerEditOptions cpucores(int cpucores) {
ServerEditOptions options = new ServerEditOptions();
return options.cpucores(cpucores);
}
/**
* @see org.jclouds.glesys.options.ServerEditOptions#cpucores
*/
public static ServerEditOptions transfer(int transfer) {
ServerEditOptions options = new ServerEditOptions();
return options.transfer(transfer);
}
/**
* @see org.jclouds.glesys.options.ServerEditOptions#hostname
*/
public static ServerEditOptions hostname(String hostname) {
ServerEditOptions options = new ServerEditOptions();
return options.hostname(hostname);
}
/**
* @see org.jclouds.glesys.options.ServerEditOptions#description
*/
public static ServerEditOptions description(String description) {
ServerEditOptions options = new ServerEditOptions();
return options.description(description);
}
}
public ServerEditOptions disksize(int disksize) {
formParameters.put("disksize", Integer.toString(disksize));
return this;
}
public ServerEditOptions memorysize(int memorysize) {
formParameters.put("memorysize", Integer.toString(memorysize));
return this;
}
public ServerEditOptions cpucores(int cpucores) {
formParameters.put("cpucores", Integer.toString(cpucores));
return this;
}
public ServerEditOptions transfer(int transfer) {
formParameters.put("cpucores", Integer.toString(transfer));
return this;
}
public ServerEditOptions hostname(String hostname) {
formParameters.put("hostname", hostname);
return this;
}
public ServerEditOptions description(String description) {
formParameters.put("description", description);
return this;
}
}

View File

@ -0,0 +1,64 @@
package org.jclouds.glesys.options;
import com.google.common.collect.Iterables;
import org.jclouds.http.options.BaseHttpRequestOptions;
/**
* @author Adam Lowe
*/
public class ServerStatusOptions extends BaseHttpRequestOptions {
public enum StatusTypes {
state, cpu, memory, disk, bandwidth, uptime
}
public static class Builder {
/**
* @see org.jclouds.glesys.options.ServerStatusOptions#statusType
*/
public static ServerStatusOptions state() {
ServerStatusOptions options = new ServerStatusOptions();
return options.statusType(StatusTypes.state);
}
/**
* @see org.jclouds.glesys.options.ServerStatusOptions#statusType
*/
public static ServerStatusOptions cpu() {
ServerStatusOptions options = new ServerStatusOptions();
return options.statusType(StatusTypes.cpu);
}
/**
* @see org.jclouds.glesys.options.ServerStatusOptions#statusType
*/
public static ServerStatusOptions memory() {
ServerStatusOptions options = new ServerStatusOptions();
return options.statusType(StatusTypes.memory);
}
/**
* @see org.jclouds.glesys.options.ServerStatusOptions#statusType
*/
public static ServerStatusOptions disk() {
ServerStatusOptions options = new ServerStatusOptions();
return options.statusType(StatusTypes.disk);
}
/**
* @see org.jclouds.glesys.options.ServerStatusOptions#statusType
*/
public static ServerStatusOptions bandwidth() {
ServerStatusOptions options = new ServerStatusOptions();
return options.statusType(StatusTypes.bandwidth);
}
}
/**
* Select the given type of information form the server
*/
public ServerStatusOptions statusType(StatusTypes type) {
formParameters.put("statustype", type.name());
return this;
}
}

View File

@ -0,0 +1,25 @@
package org.jclouds.glesys.options;
/**
* @author Adam Lowe
*/
public class ServerStopOptions extends ServerEditOptions {
public static class Builder {
/**
* @see org.jclouds.glesys.options.ServerStopOptions#hard
*/
public static ServerStopOptions hard() {
ServerStopOptions options = new ServerStopOptions();
return options.hard();
}
}
/**
* Hard stop - only supported on Xen platform
*/
public ServerStopOptions hard() {
formParameters.put("type", "hard");
return this;
}
}

View File

@ -46,12 +46,14 @@ public class GleSYSAsyncClientTest extends BaseGleSYSAsyncClientTest<GleSYSAsync
assert syncClient.getServerClient() != null; assert syncClient.getServerClient() != null;
assert syncClient.getIpClient() != null; assert syncClient.getIpClient() != null;
assert syncClient.getArchiveClient() != null; assert syncClient.getArchiveClient() != null;
assert syncClient.getDomainClient() != null;
} }
public void testAsync() throws SecurityException, NoSuchMethodException, InterruptedException, ExecutionException { public void testAsync() throws SecurityException, NoSuchMethodException, InterruptedException, ExecutionException {
assert asyncClient.getServerClient() != null; assert asyncClient.getServerClient() != null;
assert asyncClient.getIpClient() != null; assert asyncClient.getIpClient() != null;
assert asyncClient.getArchiveClient() != null; assert asyncClient.getArchiveClient() != null;
assert asyncClient.getDomainClient() != null;
} }
@Override @Override

View File

@ -19,9 +19,15 @@
package org.jclouds.glesys.features; package org.jclouds.glesys.features;
import com.google.inject.TypeLiteral; import com.google.inject.TypeLiteral;
import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import javax.ws.rs.FormParam;
import java.util.Map;
/** /**
* Tests annotation parsing of {@code ArchiveAsyncClient} * Tests annotation parsing of {@code ArchiveAsyncClient}
* *
@ -29,6 +35,43 @@ import org.testng.annotations.Test;
*/ */
@Test(groups = "unit", testName = "ArchiveAsyncClientTest") @Test(groups = "unit", testName = "ArchiveAsyncClientTest")
public class ArchiveAsyncClientTest extends BaseGleSYSAsyncClientTest<ArchiveAsyncClient> { public class ArchiveAsyncClientTest extends BaseGleSYSAsyncClientTest<ArchiveAsyncClient> {
public ArchiveAsyncClientTest() {
asyncClientClass = ArchiveAsyncClient.class;
remoteServicePrefix = "archive";
}
private Map.Entry<String, String> userName = newEntry("username", "x");
public void testListArchives() throws Exception {
testMethod("listArchives", "list", "POST", true, ReturnEmptySetOnNotFoundOr404.class);
}
public void testArchiveDetails() throws Exception {
testMethod("archiveDetails", "details", "POST", true, ReturnNullOnNotFoundOr404.class, userName);
}
public void testCreateArchive() throws Exception {
testMethod("createArchive", "create", "POST", false, MapHttp4xxCodesToExceptions.class, userName,
newEntry("password", "somepass"), newEntry("size", 5));
}
public void testDeleteArchive() throws Exception {
testMethod("deleteArchive", "delete", "POST", false, MapHttp4xxCodesToExceptions.class, userName);
}
public void testResizeArchive() throws Exception {
testMethod("resizeArchive", "resize", "POST", false, MapHttp4xxCodesToExceptions.class, userName,
newEntry("size", 5));
}
public void testChangeArchivePassword() throws Exception {
testMethod("changeArchivePassword", "changepassword", "POST", false, MapHttp4xxCodesToExceptions.class, userName,
newEntry("password", "newpass"));
}
public void testGetArchiveAllowedArguments() throws Exception {
testMethod("getArchiveAllowedArguments", "allowedarguments", "GET", true, ReturnEmptySetOnNotFoundOr404.class);
}
@Override @Override
protected TypeLiteral<RestAnnotationProcessor<ArchiveAsyncClient>> createTypeLiteral() { protected TypeLiteral<RestAnnotationProcessor<ArchiveAsyncClient>> createTypeLiteral() {

View File

@ -18,22 +18,33 @@
*/ */
package org.jclouds.glesys.features; package org.jclouds.glesys.features;
import static org.testng.Assert.assertEquals; import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSortedSet;
import java.util.Properties; import com.google.common.collect.Maps;
import org.jclouds.glesys.GleSYSAsyncClient;
import org.jclouds.glesys.GleSYSClient;
import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpRequest;
import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.http.options.BaseHttpRequestOptions;
import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.RestContextFactory; import org.jclouds.rest.RestContextFactory;
import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.RestContextSpec;
import org.jclouds.glesys.GleSYSAsyncClient;
import org.jclouds.glesys.GleSYSClient; import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import static org.testng.Assert.*;
/** /**
* @author Adrian Cole * @author Adrian Cole
*/ */
public abstract class BaseGleSYSAsyncClientTest<T> extends RestClientTest<T> { public abstract class BaseGleSYSAsyncClientTest<T> extends RestClientTest<T> {
protected Class asyncClientClass;
protected String remoteServicePrefix;
@Override @Override
protected void checkFilters(HttpRequest request) { protected void checkFilters(HttpRequest request) {
@ -47,4 +58,73 @@ public abstract class BaseGleSYSAsyncClientTest<T> extends RestClientTest<T> {
return new RestContextFactory().createContextSpec("glesys", "username", "apiKey", props); return new RestContextFactory().createContextSpec("glesys", "username", "apiKey", props);
} }
protected Map.Entry<String, String> newEntry(String key, Object value) {
return Maps.immutableEntry(key, value.toString());
}
/**
* Test that a method call is annotated correctly.
* <p/>
* TODO de-code ampersands and spaces in args properly
*
* @param localMethod the method to call in asyncClientClass
* @param remoteCall the name of the expected call on the remote server
* @param httpMethod "GET" or "POST"
* @param expectResponse if true check Accept header and response parsers
* @param exceptionParser the class of exception handler expected
* @param args either Map.Entry or BaseHttpRequestOptions that make up the arguments to the method
*/
protected void testMethod(String localMethod, String remoteCall, String httpMethod, boolean expectResponse, Class exceptionParser, Object... args) throws Exception {
List<String> argStrings = new ArrayList<String>();
List<Object> argValues = new ArrayList<Object>();
for (Object arg : args) {
if (arg instanceof BaseHttpRequestOptions) {
for (Map.Entry<String, String> httpEntry : ((BaseHttpRequestOptions) arg).buildFormParameters().entries()) {
argStrings.add(httpEntry.getKey() + "=" + httpEntry.getValue());
}
argValues.add(arg);
} else {
Map.Entry<String, String> entry = (Map.Entry<String, String>) arg;
argStrings.add(entry.getKey() + "=" + entry.getValue());
argValues.add(entry.getValue());
}
}
Method method = null;
for (Method m : asyncClientClass.getMethods()) {
if (m.getName().equals(localMethod)) {
assertNull(method, "More than one method called " + localMethod + " in class " + asyncClientClass);
method = m;
}
}
assertNotNull(method, "Failed to locate method " + localMethod + " in class " + asyncClientClass);
HttpRequest httpRequest = processor.createRequest(method, argValues.toArray());
assertRequestLineEquals(httpRequest, httpMethod + " https://api.glesys.com/" + remoteServicePrefix + "/" + remoteCall + "/format/json HTTP/1.1");
if (expectResponse) {
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class);
}
if (argStrings.isEmpty()) {
assertPayloadEquals(httpRequest, null, null, false);
} else {
assertNotNull(httpRequest.getPayload());
String payload = (String) httpRequest.getPayload().getRawContent();
Iterable<String> in = Splitter.on("&").split(payload);
assertContentHeadersEqual(httpRequest, "application/x-www-form-urlencoded", null, null, null, 0L + payload.length(), null);
assertEquals(ImmutableSortedSet.copyOf(in), ImmutableSortedSet.copyOf(argStrings));
}
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, exceptionParser);
checkFilters(httpRequest);
}
} }

View File

@ -0,0 +1,69 @@
/**
* 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.glesys.features;
import com.google.inject.TypeLiteral;
import org.jclouds.glesys.options.DomainOptions;
import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions;
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import java.util.Map;
/**
* Tests annotation parsing of {@code ArchiveAsyncClient}
*
* @author Adam Lowe
*/
@Test(groups = "unit", testName = "DomainAsyncClientTest")
public class DomainAsyncClientTest extends BaseGleSYSAsyncClientTest<DomainAsyncClient> {
public DomainAsyncClientTest() {
asyncClientClass = DomainAsyncClient.class;
remoteServicePrefix = "domain";
}
private Map.Entry<String, String> domainName = newEntry("domain", "cl666666someuser");
public void testListDomains() throws Exception {
testMethod("listDomains", "list", "POST", true, ReturnEmptySetOnNotFoundOr404.class);
}
public void testAddDomain() throws Exception {
testMethod("addDomain", "add", "POST", false, MapHttp4xxCodesToExceptions.class, newEntry("name", "cl66666_x"),
DomainOptions.Builder.primaryNameServer("ns1.somewhere.x").expire("1").minimum("1").refresh("1").
responsiblePerson("Tester").retry("1").ttl(1));
testMethod("addDomain", "add", "POST", false, MapHttp4xxCodesToExceptions.class, newEntry("name", "cl66666_x"));
}
public void testEditDomain() throws Exception {
testMethod("editDomain", "edit", "POST", false, MapHttp4xxCodesToExceptions.class, newEntry("domain", "x"));
}
public void testDeleteDomain() throws Exception {
testMethod("deleteDomain", "delete", "POST", false, MapHttp4xxCodesToExceptions.class, domainName);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<DomainAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<DomainAsyncClient>>() {
};
}
}

View File

@ -18,7 +18,9 @@
*/ */
package org.jclouds.glesys.features; package org.jclouds.glesys.features;
import com.google.common.collect.Maps;
import com.google.inject.TypeLiteral; import com.google.inject.TypeLiteral;
import org.jclouds.glesys.options.*;
import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseFirstJsonValueNamed; import org.jclouds.http.functions.ParseFirstJsonValueNamed;
import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions; import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions;
@ -29,6 +31,7 @@ import org.testng.annotations.Test;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Map;
/** /**
* Tests annotation parsing of {@code ServerAsyncClient} * Tests annotation parsing of {@code ServerAsyncClient}
@ -39,87 +42,82 @@ import java.lang.reflect.Method;
@Test(groups = "unit", testName = "ServerAsyncClientTest") @Test(groups = "unit", testName = "ServerAsyncClientTest")
public class ServerAsyncClientTest extends BaseGleSYSAsyncClientTest<ServerAsyncClient> { public class ServerAsyncClientTest extends BaseGleSYSAsyncClientTest<ServerAsyncClient> {
public ServerAsyncClientTest() {
asyncClientClass = ServerAsyncClient.class;
remoteServicePrefix = "server";
}
private Map.Entry<String, String> serverIdOnly = newEntry("serverid", "abcd");
public void testListServers() throws Exception { public void testListServers() throws Exception {
testVoidArgsMethod("listServers", "list", "POST", ReturnEmptySetOnNotFoundOr404.class); testMethod("listServers", "list", "POST", true, ReturnEmptySetOnNotFoundOr404.class);
} }
public void testGetAllowedArguments() throws Exception { public void testGetAllowedArguments() throws Exception {
testVoidArgsMethod("getServerAllowedArguments", "allowedarguments", "GET", MapHttp4xxCodesToExceptions.class); testMethod("getServerAllowedArguments", "allowedarguments", "GET", true, MapHttp4xxCodesToExceptions.class);
} }
public void testGetTemplates() throws Exception { public void testGetTemplates() throws Exception {
testVoidArgsMethod("getTemplates", "templates", "GET", MapHttp4xxCodesToExceptions.class); testMethod("getTemplates", "templates", "GET", true, MapHttp4xxCodesToExceptions.class);
} }
public void testGetServer() throws Exception { public void testGetServer() throws Exception {
testServerMethod("getServerDetails", "details"); testMethod("getServerDetails", "details", "POST", true, ReturnNullOnNotFoundOr404.class, serverIdOnly);
} }
public void testGetgetServerStatus() throws Exception { @Test
testServerMethod("getServerStatus", "status"); public void testCreateServer() throws Exception {
testMethod("createServer", "create", "POST", true, MapHttp4xxCodesToExceptions.class,
newEntry("datacenter", "Falkenberg"), newEntry("platform", "OpenVZ"),
newEntry("hostname", "jclouds-test"), newEntry("template", "Ubuntu%2032-bit"),
newEntry("disksize", 5), newEntry("memorysize", 512), newEntry("cpucores", 1),
newEntry("rootpw", "password"), newEntry("transfer", 50));
testMethod("createServer", "create", "POST", true, MapHttp4xxCodesToExceptions.class,
newEntry("datacenter", "Falkenberg"), newEntry("platform", "OpenVZ"),
newEntry("hostname", "jclouds-test"), newEntry("template", "Ubuntu%2032-bit"),
newEntry("disksize", 5), newEntry("memorysize", 512), newEntry("cpucores", 1),
newEntry("rootpw", "password"), newEntry("transfer", 50),
ServerCreateOptions.Builder.description("Description-of-server").ip("10.0.0.1"));
}
@Test
public void testEditServer() throws Exception {
testMethod("editServer", "edit", "POST", false, MapHttp4xxCodesToExceptions.class, serverIdOnly);
testMethod("editServer", "edit", "POST", false, MapHttp4xxCodesToExceptions.class, serverIdOnly,
ServerEditOptions.Builder.description("Description-of-server").disksize(1).memorysize(512).cpucores(1).hostname("jclouds-test"));
}
@Test
public void testCloneServer() throws Exception {
testMethod("cloneServer", "clone", "POST", false, MapHttp4xxCodesToExceptions.class, serverIdOnly, newEntry("hostname", "somename"));
testMethod("cloneServer", "clone", "POST", false, MapHttp4xxCodesToExceptions.class, serverIdOnly, newEntry("hostname", "somename"),
ServerCloneOptions.Builder.description("Description-of-server").disksize(1).memorysize(512).cpucores(1).hostname("jclouds-test"));
}
public void testGetServerStatus() throws Exception {
testMethod("getServerStatus", "status", "POST", true, ReturnNullOnNotFoundOr404.class, serverIdOnly);
testMethod("getServerStatus", "status", "POST", true, ReturnNullOnNotFoundOr404.class, serverIdOnly, ServerStatusOptions.Builder.state());
} }
public void testGetServerLimits() throws Exception { public void testGetServerLimits() throws Exception {
testServerMethod("getServerLimits", "limits"); testMethod("getServerLimits", "limits", "POST", true, ReturnNullOnNotFoundOr404.class, serverIdOnly);
} }
public void testGetServerConsole() throws Exception { public void testGetServerConsole() throws Exception {
testServerMethod("getServerConsole", "console"); testMethod("getServerConsole", "console", "POST", true, ReturnNullOnNotFoundOr404.class, serverIdOnly);
} }
public void testStartServer() throws Exception { public void testStartServer() throws Exception {
testServerMethodVoidReturn("startServer", "start"); testMethod("startServer", "start", "POST", false, MapHttp4xxCodesToExceptions.class, serverIdOnly);
} }
public void testStopServer() throws Exception { public void testStopServer() throws Exception {
testServerMethodVoidReturn("stopServer", "stop"); testMethod("stopServer", "stop", "POST", false, MapHttp4xxCodesToExceptions.class, serverIdOnly);
testMethod("stopServer", "stop", "POST", false, MapHttp4xxCodesToExceptions.class, serverIdOnly, ServerStopOptions.Builder.hard());
} }
public void testRebootServer() throws Exception { public void testRebootServer() throws Exception {
testServerMethodVoidReturn("rebootServer", "reboot"); testMethod("rebootServer", "reboot", "POST", false, MapHttp4xxCodesToExceptions.class, serverIdOnly);
}
protected void testVoidArgsMethod(String localMethod, String remoteCall, String httpMethod, Class exceptionParser) throws Exception {
Method method = ServerAsyncClient.class.getMethod(localMethod);
HttpRequest httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest, httpMethod + " https://api.glesys.com/server/" + remoteCall + "/format/json HTTP/1.1");
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertPayloadEquals(httpRequest, null, null, false);
assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, exceptionParser);
checkFilters(httpRequest);
}
protected void testServerMethod(String localMethod, String remoteMethod) throws Exception {
testServerMethod(localMethod, remoteMethod, "serverid", true);
}
protected void testServerMethodVoidReturn(String localMethod, String remoteMethod) throws Exception {
testServerMethod(localMethod, remoteMethod, "id", false);
}
protected void testServerMethod(String localMethod, String remoteMethod, String serverIdField, boolean acceptHeader) throws Exception {
Method method = ServerAsyncClient.class.getMethod(localMethod, String.class);
HttpRequest httpRequest = processor.createRequest(method, "abcd");
assertRequestLineEquals(httpRequest,
"POST https://api.glesys.com/server/" + remoteMethod + "/format/json HTTP/1.1");
if (acceptHeader) {
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
assertResponseParserClassEquals(method, httpRequest, ParseFirstJsonValueNamed.class);
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
}
assertPayloadEquals(httpRequest, serverIdField + "=abcd", "application/x-www-form-urlencoded", false);
assertSaxResponseParserClassEquals(method, null);
checkFilters(httpRequest);
} }
@Override @Override

View File

@ -20,6 +20,8 @@ package org.jclouds.glesys.features;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import org.jclouds.glesys.domain.*; import org.jclouds.glesys.domain.*;
import org.jclouds.glesys.options.ServerCloneOptions;
import org.jclouds.glesys.options.ServerStatusOptions;
import org.jclouds.predicates.RetryablePredicate; import org.jclouds.predicates.RetryablePredicate;
import org.testng.annotations.AfterGroups; import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups; import org.testng.annotations.BeforeGroups;
@ -35,6 +37,7 @@ import static org.testng.Assert.*;
* Tests behavior of {@code ServerClient} * Tests behavior of {@code ServerClient}
* *
* @author Adrian Cole * @author Adrian Cole
* @author Adam Lowe
*/ */
@Test(groups = "live", testName = "ServerClientLiveTest") @Test(groups = "live", testName = "ServerClientLiveTest")
public class ServerClientLiveTest extends BaseGleSYSClientLiveTest { public class ServerClientLiveTest extends BaseGleSYSClientLiveTest {
@ -42,59 +45,35 @@ public class ServerClientLiveTest extends BaseGleSYSClientLiveTest {
@BeforeGroups(groups = {"live"}) @BeforeGroups(groups = {"live"})
public void setupClient() { public void setupClient() {
super.setupClient(); super.setupClient();
client = context.getApi().getServerClient(); client = context.getApi().getServerClient();
runningServerCounter = new RetryablePredicate<Integer>(
new Predicate<Integer>() {
public boolean apply(Integer value){
int count = 0;
for(Server server : client.listServers()) {
ServerStatus status = client.getServerStatus(server.getId());
if (status.getState() == ServerState.RUNNING &&
status.getUptime() > 0) {
count++;
}
}
return count == value;
}
}, 120, 5, TimeUnit.SECONDS);
} }
@AfterGroups(groups = {"live"}) @AfterGroups(groups = {"live"})
public void tearDown() { public void tearDown() {
client.destroyServer(testServer.getId(), 0); client.destroyServer(testServer.getId(), 0);
if (testServer2 != null) {
client.destroyServer(testServer2.getId(), 0);
}
super.tearDown(); super.tearDown();
} }
public static class ServerStatePredicate implements Predicate<ServerClient> {
private ServerState state;
private String serverId;
public ServerStatePredicate(ServerState state, String serverId) {
this.state = state;
this.serverId = serverId;
}
@Override
public boolean apply(ServerClient client) {
return client.getServerStatus(serverId) != null && client.getServerStatus(serverId).getState() == state;
}
}
private ServerClient client; private ServerClient client;
private ServerCreated testServer; private ServerCreated testServer;
private RetryablePredicate<Integer> runningServerCounter; private ServerCreated testServer2;
// note this is initialized by testCreateServer()
private RetryablePredicate<ServerState> runningServerCounter;
@Test @Test
public void testCreateServer() throws Exception { public void testCreateServer() throws Exception {
int before = client.listServers().size(); testServer = client.createServer("Falkenberg", "OpenVZ", "jclouds-test", "Ubuntu 10.04 LTS 32-bit", 5, 512, 1, "password", 50);
testServer = client.createServer("Falkenberg", "OpenVZ", "jclouds-test", "Ubuntu 10.04 LTS 32-bit", 5, 512, 1, "password", 50, null, null);
assertNotNull(testServer.getId()); assertNotNull(testServer.getId());
assertNotNull(testServer.getHostname()); assertEquals(testServer.getHostname(), "jclouds-test");
assertFalse(testServer.getIps().isEmpty()); assertFalse(testServer.getIps().isEmpty());
assertTrue(runningServerCounter.apply(before + 1)); runningServerCounter = new ServerStatusChecker(testServer.getId(), 120, 2, TimeUnit.SECONDS);
assertTrue(runningServerCounter.apply(ServerState.RUNNING));
} }
@Test @Test
@ -168,11 +147,31 @@ public class ServerClientLiveTest extends BaseGleSYSClientLiveTest {
checkStatus(newStatus); checkStatus(newStatus);
} }
@Test(dependsOnMethods = "testCreateServer")
public void testRebootServer() throws Exception {
client.rebootServer(testServer.getId());
assertTrue(runningServerCounter.apply(ServerState.STOPPED));
assertTrue(runningServerCounter.apply(ServerState.RUNNING));
}
@Test(dependsOnMethods = "testCreateServer")
public void testStopAndStartServer() throws Exception {
client.stopServer(testServer.getId());
assertTrue(runningServerCounter.apply(ServerState.STOPPED));
client.startServer(testServer.getId());
assertTrue(runningServerCounter.apply(ServerState.RUNNING));
}
@Test(dependsOnMethods = "testCreateServer") @Test(dependsOnMethods = "testCreateServer")
public void testServerLimits() throws Exception { public void testServerLimits() throws Exception {
Map<String, ServerLimit> limits = client.getServerLimits(testServer.getId()); Map<String, ServerLimit> limits = client.getServerLimits(testServer.getId());
assertNotNull(limits); assertNotNull(limits);
for(Map.Entry<String,ServerLimit> entry : limits.entrySet()) { for (Map.Entry<String, ServerLimit> entry : limits.entrySet()) {
assertNotNull(entry.getKey()); assertNotNull(entry.getKey());
assertNotNull(entry.getValue()); assertNotNull(entry.getValue());
ServerLimit limit = entry.getValue(); ServerLimit limit = entry.getValue();
@ -194,6 +193,42 @@ public class ServerClientLiveTest extends BaseGleSYSClientLiveTest {
assertNotNull(console.getPassword()); assertNotNull(console.getPassword());
} }
// takes a few minutes
@Test(enabled=false, dependsOnMethods = "testCreateServer")
public void testCloneServer() throws Exception {
testServer2 = client.cloneServer(testServer.getId(), "jclouds-test2", ServerCloneOptions.Builder.cpucores(1));
assertNotNull(testServer2.getId());
assertEquals(testServer2.getHostname(), "jclouds-test2");
assertTrue(testServer2.getIps().isEmpty());
RetryablePredicate<ServerState> cloneChecker = new ServerStatusChecker(testServer2.getId(), 300, 10, TimeUnit.SECONDS);
assertTrue(cloneChecker.apply(ServerState.STOPPED));
client.startServer(testServer2.getId());
// TODO ServerStatus==STOPPED suggests the previous call to start should have worked
cloneChecker = new RetryablePredicate<ServerState>(
new Predicate<ServerState>() {
public boolean apply(ServerState value) {
ServerStatus status = client.getServerStatus(testServer2.getId(), ServerStatusOptions.Builder.state());
if (status.getState() == value) {
return true;
}
client.startServer(testServer2.getId());
return false;
}
}, 300, 10, TimeUnit.SECONDS);
assertTrue(cloneChecker.apply(ServerState.RUNNING)
);
}
private void checkServer(ServerDetails server) { private void checkServer(ServerDetails server) {
// description can be null // description can be null
assert server.getCpuCores() > 0 : server; assert server.getCpuCores() > 0 : server;
@ -230,4 +265,17 @@ public class ServerClientLiveTest extends BaseGleSYSClientLiveTest {
assert status.getMemory().getUsage() >= 0 : status; assert status.getMemory().getUsage() >= 0 : status;
assertNotNull(status.getMemory().getUnit()); assertNotNull(status.getMemory().getUnit());
} }
private class ServerStatusChecker extends RetryablePredicate<ServerState> {
public ServerStatusChecker(final String serverId, long maxWait, long period, TimeUnit unit) {
super(new Predicate<ServerState>() {
public boolean apply(ServerState value) {
ServerStatus status = client.getServerStatus(serverId, ServerStatusOptions.Builder.state());
return status.getState() == value;
}
}, maxWait, period, unit);
}
}
} }