added load balancer methods, enums replaced for several option-based objects, tests

This commit is contained in:
Alex Yarmula 2010-03-01 15:38:11 -08:00
parent 4892b843d8
commit 9df9d45859
32 changed files with 1367 additions and 89 deletions

View File

@ -125,5 +125,9 @@ public interface Constants {
* Name of the logger that records the steps of the request signing process of the HTTP_service. * Name of the logger that records the steps of the request signing process of the HTTP_service.
*/ */
public static final String LOGGER_SIGNATURE = "jclouds.signature"; public static final String LOGGER_SIGNATURE = "jclouds.signature";
/**
* Name of the custom adapter bindings map for Gson
*/
public static final String PROPERTY_GSON_ADAPTERS = "jclouds.gson.adapters";
} }

View File

@ -21,15 +21,16 @@ package org.jclouds.http.functions.config;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.Comparator; import java.util.*;
import java.util.Date;
import java.util.SortedSet;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParserFactory;
import com.google.common.collect.Maps;
import com.google.inject.name.Named;
import org.jclouds.Constants;
import org.jclouds.date.DateService; import org.jclouds.date.DateService;
import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ParseSax.HandlerWithResult; import org.jclouds.http.functions.ParseSax.HandlerWithResult;
@ -127,12 +128,16 @@ public class ParserModule extends AbstractModule {
@Provides @Provides
@Singleton @Singleton
Gson provideGson(DateAdapter adapter, SortedSetOfInetAddressCreator addressSetCreator) { Gson provideGson(DateAdapter adapter, SortedSetOfInetAddressCreator addressSetCreator,
GsonAdapterBindings bindings) {
GsonBuilder gson = new GsonBuilder(); GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(InetAddress.class, new InetAddressAdapter()); gson.registerTypeAdapter(InetAddress.class, new InetAddressAdapter());
gson.registerTypeAdapter(Date.class, adapter); gson.registerTypeAdapter(Date.class, adapter);
gson.registerTypeAdapter(new TypeToken<SortedSet<InetAddress>>() { gson.registerTypeAdapter(new TypeToken<SortedSet<InetAddress>>() {
}.getType(), addressSetCreator); }.getType(), addressSetCreator);
for(Map.Entry<Class, Object> binding : bindings.getBindings().entrySet()) {
gson.registerTypeAdapter(binding.getKey(), binding.getValue());
}
return gson.create(); return gson.create();
} }
@ -187,4 +192,18 @@ public class ParserModule extends AbstractModule {
} }
} }
@Singleton
public static class GsonAdapterBindings {
private final Map<Class, Object> bindings = Maps.newHashMap();
@com.google.inject.Inject(optional=true)
public void setBindings(@Named(Constants.PROPERTY_GSON_ADAPTERS) Map<Class, Object> bindings) {
this.bindings.putAll(bindings);
}
public Map<Class, Object> getBindings() {
return bindings;
}
}
} }

View File

@ -25,9 +25,7 @@ package org.jclouds.gogrid;
import com.google.inject.ImplementedBy; import com.google.inject.ImplementedBy;
import org.jclouds.gogrid.internal.GoGridAsyncClientImpl; import org.jclouds.gogrid.internal.GoGridAsyncClientImpl;
import org.jclouds.gogrid.services.GridIpAsyncClient; import org.jclouds.gogrid.services.*;
import org.jclouds.gogrid.services.GridJobAsyncClient;
import org.jclouds.gogrid.services.GridServerAsyncClient;
/** /**
* @author Oleksiy Yarmula * @author Oleksiy Yarmula
@ -50,4 +48,9 @@ public interface GoGridAsyncClient {
*/ */
GridIpAsyncClient getIpServices(); GridIpAsyncClient getIpServices();
/**
* @see GoGridClient#getLoadBalancerServices()
*/
GridLoadBalancerAsyncClient getLoadBalancerServices();
} }

View File

@ -27,6 +27,7 @@ import com.google.inject.ImplementedBy;
import org.jclouds.gogrid.internal.GoGridClientImpl; import org.jclouds.gogrid.internal.GoGridClientImpl;
import org.jclouds.gogrid.services.GridIpClient; import org.jclouds.gogrid.services.GridIpClient;
import org.jclouds.gogrid.services.GridJobClient; import org.jclouds.gogrid.services.GridJobClient;
import org.jclouds.gogrid.services.GridLoadBalancerClient;
import org.jclouds.gogrid.services.GridServerClient; import org.jclouds.gogrid.services.GridServerClient;
/** /**
@ -54,4 +55,10 @@ public interface GoGridClient {
*/ */
GridIpClient getIpServices(); GridIpClient getIpServices();
/**
* Returns method, related to managing load balancers.
* @return loadBalancerServices
*/
GridLoadBalancerClient getLoadBalancerServices();
} }

View File

@ -1,21 +1,3 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.
* ====================================================================
*/
/** /**
* *
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com> * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
@ -44,11 +26,14 @@ package org.jclouds.gogrid.config;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.net.URI; import java.net.URI;
import java.util.Date; import java.util.Date;
import java.util.Map;
import javax.inject.Named; import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import com.google.common.collect.Maps;
import com.google.gson.*; import com.google.gson.*;
import org.jclouds.Constants;
import org.jclouds.gogrid.GoGridAsyncClient; import org.jclouds.gogrid.GoGridAsyncClient;
import org.jclouds.gogrid.GoGridClient; import org.jclouds.gogrid.GoGridClient;
import org.jclouds.http.functions.config.ParserModule.DateAdapter; import org.jclouds.http.functions.config.ParserModule.DateAdapter;
@ -68,31 +53,29 @@ import com.google.inject.Provides;
* @author Oleksiy Yarmula * @author Oleksiy Yarmula
*/ */
public class GoGridContextModule extends AbstractModule { public class GoGridContextModule extends AbstractModule {
@Override @Override
protected void configure() { protected void configure() {
bind(DateAdapter.class).to(DateSecondsAdapter.class); bind(DateAdapter.class).to(DateSecondsAdapter.class);
} }
@Provides @Provides
@Singleton @Singleton
RestContext<GoGridAsyncClient, GoGridClient> provideContext(Closer closer, GoGridAsyncClient asyncApi, RestContext<GoGridAsyncClient, GoGridClient> provideContext(Closer closer, GoGridAsyncClient asyncApi,
GoGridClient syncApi, @GoGrid URI endPoint, @Named(GoGridConstants.PROPERTY_GOGRID_USER) String account) { GoGridClient syncApi, @GoGrid URI endPoint, @Named(GoGridConstants.PROPERTY_GOGRID_USER) String account) {
return new RestContextImpl<GoGridAsyncClient, GoGridClient>(closer, asyncApi, syncApi, endPoint, account); return new RestContextImpl<GoGridAsyncClient, GoGridClient>(closer, asyncApi, syncApi, endPoint, account);
} }
@Singleton @Singleton
public static class DateSecondsAdapter implements DateAdapter { public static class DateSecondsAdapter implements DateAdapter {
public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.getTime()); return new JsonPrimitive(src.getTime());
} }
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
String toParse = json.getAsJsonPrimitive().getAsString();
return new Date(Long.valueOf(toParse));
}
}
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
String toParse = json.getAsJsonPrimitive().getAsString();
return new Date(Long.valueOf(toParse));
}
}
} }

View File

@ -42,18 +42,20 @@
package org.jclouds.gogrid.config; package org.jclouds.gogrid.config;
import java.net.URI; import java.net.URI;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.inject.Named; import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.collect.Maps;
import org.jclouds.Constants;
import org.jclouds.concurrent.ExpirableSupplier; import org.jclouds.concurrent.ExpirableSupplier;
import org.jclouds.concurrent.internal.SyncProxy; import org.jclouds.concurrent.internal.SyncProxy;
import org.jclouds.date.DateService;
import org.jclouds.date.TimeStamp; import org.jclouds.date.TimeStamp;
import org.jclouds.gogrid.GoGridAsyncClient; import org.jclouds.gogrid.domain.*;
import org.jclouds.gogrid.GoGridClient; import org.jclouds.gogrid.functions.internal.CustomDeserializers;
import org.jclouds.gogrid.handlers.GoGridErrorHandler; import org.jclouds.gogrid.handlers.GoGridErrorHandler;
import org.jclouds.gogrid.services.*; import org.jclouds.gogrid.services.*;
import org.jclouds.http.HttpErrorHandler; import org.jclouds.http.HttpErrorHandler;
@ -127,6 +129,19 @@ public class GoGridRestClientModule extends AbstractModule {
return SyncProxy.create(GridIpClient.class, client); return SyncProxy.create(GridIpClient.class, client);
} }
@Provides
@Singleton
protected GridLoadBalancerAsyncClient provideLoadBalancerClient(RestClientFactory factory) {
return factory.create(GridLoadBalancerAsyncClient.class);
}
@Provides
@Singleton
public GridLoadBalancerClient provideLoadBalancerClient(GridLoadBalancerAsyncClient client) throws IllegalArgumentException,
SecurityException, NoSuchMethodException {
return SyncProxy.create(GridLoadBalancerClient.class, client);
}
@Provides @Provides
@Singleton @Singleton
@GoGrid @GoGrid
@ -140,6 +155,21 @@ public class GoGridRestClientModule extends AbstractModule {
return cache.get(); return cache.get();
} }
@Provides
@Singleton
@com.google.inject.name.Named(Constants.PROPERTY_GSON_ADAPTERS)
public Map<Class, Object> provideCustomAdapterBindings() {
Map<Class, Object> bindings = Maps.newHashMap();
bindings.put(ObjectType.class, new CustomDeserializers.ObjectTypeAdapter());
bindings.put(LoadBalancerOs.class, new CustomDeserializers.LoadBalancerOsAdapter());
bindings.put(LoadBalancerState.class, new CustomDeserializers.LoadBalancerStateAdapter());
bindings.put(LoadBalancerPersistenceType.class, new CustomDeserializers.LoadBalancerPersistenceTypeAdapter());
bindings.put(LoadBalancerType.class, new CustomDeserializers.LoadBalancerTypeAdapter());
bindings.put(IpState.class, new CustomDeserializers.IpStateAdapter());
return bindings;
}
/** /**
* borrowing concurrency code to ensure that caching takes place properly * borrowing concurrency code to ensure that caching takes place properly
*/ */

View File

@ -37,7 +37,7 @@ public class Ip implements Comparable<Ip> {
private String subnet; private String subnet;
@SerializedName("public") @SerializedName("public")
private boolean isPublic; private boolean isPublic;
private Option state; private IpState state;
/** /**
* A no-args constructor is required for deserialization * A no-args constructor is required for deserialization
@ -45,7 +45,7 @@ public class Ip implements Comparable<Ip> {
public Ip() { public Ip() {
} }
public Ip(long id, String ip, String subnet, boolean isPublic, Option state) { public Ip(long id, String ip, String subnet, boolean isPublic, IpState state) {
this.id = id; this.id = id;
this.ip = ip; this.ip = ip;
this.subnet = subnet; this.subnet = subnet;
@ -69,7 +69,7 @@ public class Ip implements Comparable<Ip> {
return isPublic; return isPublic;
} }
public Option getState() { public IpState getState() {
return state; return state;
} }

View File

@ -0,0 +1,67 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.domain;
/**
* @author Oleksiy Yarmula
*/
public class IpPortPair {
private Ip ip;
private int port;
/**
* A no-args constructor is required for deserialization
*/
public IpPortPair() {
}
public IpPortPair(Ip ip, int port) {
this.ip = ip;
this.port = port;
}
public Ip getIp() {
return ip;
}
public int getPort() {
return port;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
IpPortPair that = (IpPortPair) o;
if (port != that.port) return false;
if (ip != null ? !ip.equals(that.ip) : that.ip != null) return false;
return true;
}
@Override
public int hashCode() {
int result = ip != null ? ip.hashCode() : 0;
result = 31 * result + port;
return result;
}
}

View File

@ -20,6 +20,8 @@ package org.jclouds.gogrid.domain;
import com.google.common.base.CaseFormat; import com.google.common.base.CaseFormat;
import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* @author Oleksiy Yarmula * @author Oleksiy Yarmula
*/ */
@ -29,4 +31,8 @@ public enum IpState {
public String toString() { public String toString() {
return (CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name())); return (CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name()));
} }
public static IpState fromValue(String state) {
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(state, "state")));
}
} }

View File

@ -38,7 +38,7 @@ public class Job implements Comparable<Job> {
private long id; private long id;
private Option command; private Option command;
@SerializedName("objecttype") @SerializedName("objecttype")
private Option objectType; private ObjectType objectType;
@SerializedName("createdon") @SerializedName("createdon")
private Date createdOn; private Date createdOn;
@SerializedName("lastupdatedon") @SerializedName("lastupdatedon")
@ -60,7 +60,7 @@ public class Job implements Comparable<Job> {
public Job() { public Job() {
} }
public Job(long id, Option command, Option objectType, public Job(long id, Option command, ObjectType objectType,
Date createdOn, Date lastUpdatedOn, Option currentState, Date createdOn, Date lastUpdatedOn, Option currentState,
int attempts, String owner, List<JobState> history, int attempts, String owner, List<JobState> history,
Map<String, String> details) { Map<String, String> details) {
@ -84,7 +84,7 @@ public class Job implements Comparable<Job> {
return command; return command;
} }
public Option getObjectType() { public ObjectType getObjectType() {
return objectType; return objectType;
} }
@ -158,4 +158,20 @@ public class Job implements Comparable<Job> {
return Longs.compare(createdOn.getTime(), o.getCreatedOn().getTime()); return Longs.compare(createdOn.getTime(), o.getCreatedOn().getTime());
return Longs.compare(id, o.getId()); return Longs.compare(id, o.getId());
} }
@Override
public String toString() {
return "Job{" +
"id=" + id +
", command=" + command +
", objectType=" + objectType +
", createdOn=" + createdOn +
", lastUpdatedOn=" + lastUpdatedOn +
", currentState=" + currentState +
", attempts=" + attempts +
", owner='" + owner + '\'' +
", history=" + history +
", details=" + details +
'}';
}
} }

View File

@ -90,4 +90,14 @@ public class JobState {
result = 31 * result + (note != null ? note.hashCode() : 0); result = 31 * result + (note != null ? note.hashCode() : 0);
return result; return result;
} }
@Override
public String toString() {
return "JobState{" +
"id=" + id +
", updatedOn=" + updatedOn +
", state=" + state +
", note='" + note + '\'' +
'}';
}
} }

View File

@ -0,0 +1,138 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.domain;
import com.google.common.primitives.Longs;
import com.google.gson.annotations.SerializedName;
import java.util.List;
/**
* @author Oleksiy Yarmula
*/
public class LoadBalancer implements Comparable<LoadBalancer> {
private long id;
private String name;
private String description;
@SerializedName("virtualip")
private IpPortPair virtualIp;
@SerializedName("realiplist")
private List<IpPortPair> realIpList;
private LoadBalancerType type;
private LoadBalancerPersistenceType persistence;
private LoadBalancerOs os;
private LoadBalancerState state;
/**
* A no-args constructor is required for deserialization
*/
public LoadBalancer() {
}
public LoadBalancer(long id, String name, String description,
IpPortPair virtualIp, List<IpPortPair> realIpList, LoadBalancerType type,
LoadBalancerPersistenceType persistence, LoadBalancerOs os,
LoadBalancerState state) {
this.id = id;
this.name = name;
this.description = description;
this.virtualIp = virtualIp;
this.realIpList = realIpList;
this.type = type;
this.persistence = persistence;
this.os = os;
this.state = state;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public IpPortPair getVirtualIp() {
return virtualIp;
}
public List<IpPortPair> getRealIpList() {
return realIpList;
}
public LoadBalancerType getType() {
return type;
}
public LoadBalancerPersistenceType getPersistence() {
return persistence;
}
public LoadBalancerOs getOs() {
return os;
}
public LoadBalancerState getState() {
return state;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LoadBalancer that = (LoadBalancer) o;
if (id != that.id) return false;
if (description != null ? !description.equals(that.description) : that.description != null) return false;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
if (os != null ? !os.equals(that.os) : that.os != null) return false;
if (persistence != null ? !persistence.equals(that.persistence) : that.persistence != null) return false;
if (realIpList != null ? !realIpList.equals(that.realIpList) : that.realIpList != null) return false;
if (state != null ? !state.equals(that.state) : that.state != null) return false;
if (type != null ? !type.equals(that.type) : that.type != null) return false;
if (virtualIp != null ? !virtualIp.equals(that.virtualIp) : that.virtualIp != null) return false;
return true;
}
@Override
public int hashCode() {
int result = (int) (id ^ (id >>> 32));
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (description != null ? description.hashCode() : 0);
result = 31 * result + (virtualIp != null ? virtualIp.hashCode() : 0);
result = 31 * result + (realIpList != null ? realIpList.hashCode() : 0);
result = 31 * result + (type != null ? type.hashCode() : 0);
result = 31 * result + (persistence != null ? persistence.hashCode() : 0);
result = 31 * result + (os != null ? os.hashCode() : 0);
result = 31 * result + (state != null ? state.hashCode() : 0);
return result;
}
@Override
public int compareTo(LoadBalancer o) {
return Longs.compare(id, o.getId());
}
}

View File

@ -0,0 +1,39 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.domain;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* @author Oleksiy Yarmula
*/
public enum LoadBalancerOs {
F5,
UNKNOWN;
public static LoadBalancerOs fromValue(String value) {
try {
return valueOf(checkNotNull(value));
} catch(IllegalArgumentException e) {
return UNKNOWN;
}
}
}

View File

@ -0,0 +1,51 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.domain;
import com.google.common.base.CaseFormat;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* @author Oleksiy Yarmula
*/
public enum LoadBalancerPersistenceType {
NONE("None"),
SSL_STICKY("SSL Sticky"),
SOURCE_ADDRESS("Source Address"),
UNKNOWN("Unknown");
String type;
LoadBalancerPersistenceType(String type) {
this.type = type;
}
@Override
public String toString() {
return type;
}
public static LoadBalancerPersistenceType fromValue(String type) {
for(LoadBalancerPersistenceType persistenceType : values()) {
if(persistenceType.type.equals(checkNotNull(type))) return persistenceType;
}
return UNKNOWN;
}
}

View File

@ -0,0 +1,52 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.domain;
import com.google.common.base.CaseFormat;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* @author Oleksiy Yarmula
*/
public enum LoadBalancerState {
ON,
OFF,
UNAVAILABLE,
UNKNOWN;
public String value() {
return (CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name()));
}
@Override
public String toString() {
return value();
}
public static LoadBalancerState fromValue(String state) {
try {
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(state, "state")));
} catch(IllegalArgumentException e) {
return UNKNOWN;
}
}
}

View File

@ -0,0 +1,49 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.domain;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* @author Oleksiy Yarmula
*/
public enum LoadBalancerType {
ROUND_ROBIN("Round Robin"),
LEAST_CONNECTED("Least Connect"),
UNKNOWN("Unknown");
String type;
LoadBalancerType(String type) {
this.type = type;
}
@Override
public String toString() {
return type;
}
public static LoadBalancerType fromValue(String type) {
for(LoadBalancerType persistenceType : values()) {
if(persistenceType.type.equals(checkNotNull(type))) return persistenceType;
}
return UNKNOWN;
}
}

View File

@ -0,0 +1,56 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.domain;
import com.google.common.base.CaseFormat;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* @author Oleksiy Yarmula
*/
public enum ObjectType {
VIRTUAL_SERVER,
LOAD_BALANCER,
CLOUD_STORAGE,
STORAGE_DNS,
SERVER_IMAGE,
DEDICATED_SERVER,
UNKNOWN;
public String value() {
return (CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name()));
}
@Override
public String toString() {
return value();
}
public static ObjectType fromValue(String type) {
if("StorageDNS".equals(type)) return STORAGE_DNS;
try {
return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(type, "type")));
} catch(IllegalArgumentException e) {
return UNKNOWN;
}
}
}

View File

@ -88,9 +88,8 @@ public class SharedKeyLiteAuthentication implements HttpRequestFilter {
try { try {
return encryptionService.md5Hex(stringToHash.getBytes()); return encryptionService.md5Hex(stringToHash.getBytes());
} catch(Exception e) { } catch(Exception e) {
throw Throwables.propagate(e); throw new RuntimeException(e);
} }
} }
} }

View File

@ -0,0 +1,58 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.functions;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.jclouds.gogrid.domain.Job;
import org.jclouds.gogrid.domain.LoadBalancer;
import org.jclouds.gogrid.domain.internal.GenericResponseContainer;
import org.jclouds.http.functions.ParseJson;
import javax.inject.Inject;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
import java.util.SortedSet;
/**
* Parses {@link org.jclouds.gogrid.domain.LoadBalancer jobs} from a json string.
*
* @author Oleksiy Yarmula
*/
public class ParseLoadBalancerListFromJsonResponse extends ParseJson<SortedSet<LoadBalancer>> {
@Inject
public ParseLoadBalancerListFromJsonResponse(Gson gson) {
super(gson);
}
public SortedSet<LoadBalancer> apply(InputStream stream) {
Type setType = new TypeToken<GenericResponseContainer<LoadBalancer>>() {
}.getType();
GenericResponseContainer<LoadBalancer> response;
try {
response = gson.fromJson(new InputStreamReader(stream, "UTF-8"), setType);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("jclouds requires UTF-8 encoding", e);
}
return response.getList();
}
}

View File

@ -0,0 +1,79 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.functions.internal;
import com.google.gson.*;
import org.jclouds.gogrid.domain.*;
import java.lang.reflect.Type;
/**
* @author Oleksiy Yarmula
*/
public class CustomDeserializers {
public static class ObjectTypeAdapter implements JsonDeserializer<ObjectType> {
@Override
public ObjectType deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
String name = ((JsonObject) jsonElement).get("name").getAsString();
return ObjectType.fromValue(name);
}
}
public static class LoadBalancerOsAdapter implements JsonDeserializer<LoadBalancerOs> {
@Override
public LoadBalancerOs deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
String name = ((JsonObject) jsonElement).get("name").getAsString();
return LoadBalancerOs.fromValue(name);
}
}
public static class LoadBalancerStateAdapter implements JsonDeserializer<LoadBalancerState> {
@Override
public LoadBalancerState deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
String name = ((JsonObject) jsonElement).get("name").getAsString();
return LoadBalancerState.fromValue(name);
}
}
public static class LoadBalancerPersistenceTypeAdapter implements JsonDeserializer<LoadBalancerPersistenceType> {
@Override
public LoadBalancerPersistenceType deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
String name = ((JsonObject) jsonElement).get("name").getAsString();
return LoadBalancerPersistenceType.fromValue(name);
}
}
public static class LoadBalancerTypeAdapter implements JsonDeserializer<LoadBalancerType> {
@Override
public LoadBalancerType deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
String name = ((JsonObject) jsonElement).get("name").getAsString();
return LoadBalancerType.fromValue(name);
}
}
public static class IpStateAdapter implements JsonDeserializer<IpState> {
@Override
public IpState deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
String name = ((JsonObject) jsonElement).get("name").getAsString();
return IpState.fromValue(name);
}
}
}

View File

@ -37,14 +37,17 @@ public class GoGridAsyncClientImpl implements GoGridAsyncClient {
private GridServerAsyncClient gridServerAsyncClient; private GridServerAsyncClient gridServerAsyncClient;
private GridJobAsyncClient gridJobAsyncClient; private GridJobAsyncClient gridJobAsyncClient;
private GridIpAsyncClient gridIpAsyncClient; private GridIpAsyncClient gridIpAsyncClient;
private GridLoadBalancerAsyncClient gridLoadBalancerAsyncClient;
@Inject @Inject
public GoGridAsyncClientImpl(GridServerAsyncClient gridServerClient, public GoGridAsyncClientImpl(GridServerAsyncClient gridServerClient,
GridJobAsyncClient gridJobAsyncClient, GridJobAsyncClient gridJobAsyncClient,
GridIpAsyncClient gridIpAsyncClient) { GridIpAsyncClient gridIpAsyncClient,
GridLoadBalancerAsyncClient gridLoadBalancerAsyncClient) {
this.gridServerAsyncClient = gridServerClient; this.gridServerAsyncClient = gridServerClient;
this.gridJobAsyncClient = gridJobAsyncClient; this.gridJobAsyncClient = gridJobAsyncClient;
this.gridIpAsyncClient = gridIpAsyncClient; this.gridIpAsyncClient = gridIpAsyncClient;
this.gridLoadBalancerAsyncClient = gridLoadBalancerAsyncClient;
} }
@Override @Override
@ -57,7 +60,13 @@ public class GoGridAsyncClientImpl implements GoGridAsyncClient {
return gridJobAsyncClient; return gridJobAsyncClient;
} }
@Override
public GridIpAsyncClient getIpServices() { public GridIpAsyncClient getIpServices() {
return gridIpAsyncClient; return gridIpAsyncClient;
} }
@Override
public GridLoadBalancerAsyncClient getLoadBalancerServices() {
return gridLoadBalancerAsyncClient;
}
} }

View File

@ -26,9 +26,7 @@ package org.jclouds.gogrid.internal;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import org.jclouds.gogrid.GoGridClient; import org.jclouds.gogrid.GoGridClient;
import org.jclouds.gogrid.services.GridIpClient; import org.jclouds.gogrid.services.*;
import org.jclouds.gogrid.services.GridJobClient;
import org.jclouds.gogrid.services.GridServerClient;
/** /**
* @author Oleksiy Yarmula * @author Oleksiy Yarmula
@ -39,14 +37,17 @@ public class GoGridClientImpl implements GoGridClient {
private GridServerClient gridServerClient; private GridServerClient gridServerClient;
private GridJobClient gridJobClient; private GridJobClient gridJobClient;
private GridIpClient gridIpClient; private GridIpClient gridIpClient;
private GridLoadBalancerClient gridLoadBalancerClient;
@Inject @Inject
public GoGridClientImpl(GridServerClient gridServerClient, public GoGridClientImpl(GridServerClient gridServerClient,
GridJobClient gridJobClient, GridJobClient gridJobClient,
GridIpClient gridIpClient) { GridIpClient gridIpClient,
GridLoadBalancerClient gridLoadBalancerClient) {
this.gridServerClient = gridServerClient; this.gridServerClient = gridServerClient;
this.gridJobClient = gridJobClient; this.gridJobClient = gridJobClient;
this.gridIpClient = gridIpClient; this.gridIpClient = gridIpClient;
this.gridLoadBalancerClient = gridLoadBalancerClient;
} }
@Override @Override
@ -63,4 +64,9 @@ public class GoGridClientImpl implements GoGridClient {
public GridIpClient getIpServices() { public GridIpClient getIpServices() {
return gridIpClient; return gridIpClient;
} }
@Override
public GridLoadBalancerClient getLoadBalancerServices() {
return gridLoadBalancerClient;
}
} }

View File

@ -0,0 +1,53 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.services;
import com.google.common.util.concurrent.ListenableFuture;
import org.jclouds.gogrid.GoGrid;
import org.jclouds.gogrid.domain.LoadBalancer;
import org.jclouds.gogrid.filters.SharedKeyLiteAuthentication;
import org.jclouds.gogrid.functions.ParseLoadBalancerListFromJsonResponse;
import org.jclouds.rest.annotations.Endpoint;
import org.jclouds.rest.annotations.QueryParams;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import java.util.Set;
import static org.jclouds.gogrid.reference.GoGridHeaders.VERSION;
/**
* @author Oleksiy Yarmula
*/
@Endpoint(GoGrid.class)
@RequestFilters(SharedKeyLiteAuthentication.class)
@QueryParams(keys = VERSION, values = "1.4")
public interface GridLoadBalancerAsyncClient {
/**
* @see GridJobClient#getJobList(org.jclouds.gogrid.options.GetJobListOptions...)
*/
@GET
@ResponseParser(ParseLoadBalancerListFromJsonResponse.class)
@Path("/grid/loadbalancer/list")
ListenableFuture<Set<LoadBalancer>> getLoadBalancerList();
}

View File

@ -0,0 +1,38 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.services;
import org.jclouds.concurrent.Timeout;
import org.jclouds.gogrid.domain.LoadBalancer;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* @author Oleksiy Yarmula
*/
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
public interface GridLoadBalancerClient {
/**
* Returns all load balancers found for the current user.
* @return load balancers found
*/
Set<LoadBalancer> getLoadBalancerList();
}

View File

@ -19,10 +19,7 @@
package org.jclouds.gogrid; package org.jclouds.gogrid;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import org.jclouds.gogrid.domain.Ip; import org.jclouds.gogrid.domain.*;
import org.jclouds.gogrid.domain.Job;
import org.jclouds.gogrid.domain.PowerCommand;
import org.jclouds.gogrid.domain.Server;
import org.jclouds.gogrid.predicates.ServerLatestJobCompleted; import org.jclouds.gogrid.predicates.ServerLatestJobCompleted;
import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.logging.log4j.config.Log4JLoggingModule;
import org.jclouds.predicates.RetryablePredicate; import org.jclouds.predicates.RetryablePredicate;
@ -165,6 +162,12 @@ public class GoGridLiveTest {
client.getServerServices().deleteByName(nameOfServer); client.getServerServices().deleteByName(nameOfServer);
} }
@Test(enabled=false)
public void testLoadBalancers() {
Set<LoadBalancer> balancers = client.getLoadBalancerServices().getLoadBalancerList();
}
/** /**
* In case anything went wrong during the tests, removes the objects * In case anything went wrong during the tests, removes the objects
* created in the tests. * created in the tests.

View File

@ -39,14 +39,6 @@ import java.net.UnknownHostException;
*/ */
public class ParseErrorFromJsonResponseTest { public class ParseErrorFromJsonResponseTest {
Injector i = Guice.createInjector(new ParserModule() {
@Override
protected void configure() {
bind(DateAdapter.class).to(GoGridContextModule.DateSecondsAdapter.class);
super.configure();
}
});
@Test @Test
public void testApplyInputStreamDetails() throws UnknownHostException { public void testApplyInputStreamDetails() throws UnknownHostException {
InputStream is = getClass().getResourceAsStream("/test_error_handler.json"); InputStream is = getClass().getResourceAsStream("/test_error_handler.json");
@ -57,4 +49,14 @@ public class ParseErrorFromJsonResponseTest {
assert "No object found that matches your input criteria.".equals(response.getMessage()); assert "No object found that matches your input criteria.".equals(response.getMessage());
assert "IllegalArgumentException".equals(response.getErrorCode()); assert "IllegalArgumentException".equals(response.getErrorCode());
} }
Injector i = Guice.createInjector(new ParserModule() {
@Override
protected void configure() {
bind(DateAdapter.class).to(GoGridContextModule.DateSecondsAdapter.class);
super.configure();
}
});
} }

View File

@ -0,0 +1,109 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.functions;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.gson.Gson;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Provides;
import com.google.inject.internal.ImmutableMap;
import org.jclouds.Constants;
import org.jclouds.gogrid.config.GoGridContextModule;
import org.jclouds.gogrid.domain.Job;
import org.jclouds.gogrid.domain.JobState;
import org.jclouds.gogrid.domain.ObjectType;
import org.jclouds.gogrid.domain.Option;
import org.jclouds.gogrid.functions.internal.CustomDeserializers;
import org.jclouds.http.functions.config.ParserModule;
import org.testng.annotations.Test;
import javax.inject.Singleton;
import java.io.InputStream;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import java.util.SortedSet;
import static org.testng.Assert.assertEquals;
/**
* @author Oleksiy Yarmula
*/
@Test(groups = "unit", testName = "gogrid.ParseJobsFromJsonResponseTest")
public class ParseJobsFromJsonResponseTest {
@Test
public void testApplyInputStreamDetails() throws UnknownHostException {
InputStream is = getClass().getResourceAsStream("/test_get_job_list.json");
ParseJobListFromJsonResponse parser = new ParseJobListFromJsonResponse(i
.getInstance(Gson.class));
SortedSet<Job> response = parser.apply(is);
Map<String, String> details = Maps.newTreeMap();
details.put("description", null);
details.put("image", "GSI-f8979644-e646-4711-ad58-d98a5fa3612c");
details.put("ip", "204.51.240.189");
details.put("name", "ServerCreated40562");
details.put("type", "virtual_server");
Job job = new Job(250628L,
new Option(7L, "DeleteVirtualServer", "Delete Virtual Server"),
ObjectType.VIRTUAL_SERVER,
new Date(1267404528895L),
new Date(1267404538592L),
new Option(3L, "Succeeded", "Change request has succeeded."),
1,
"3116784158f0af2d-24076@api.gogrid.com",
Arrays.asList(
new JobState(940263L, new Date(1267404528897L),
new Option(7L, "Created",
"Change request is created but not queued yet"), null),
new JobState(940264L, new Date(1267404528967L),
new Option(1L, "Queued",
"Change request is new to the system."), null)
),
details);
assertEquals(job, Iterables.getOnlyElement(response));
}
Injector i = Guice.createInjector(new ParserModule() {
@Override
protected void configure() {
bind(DateAdapter.class).to(GoGridContextModule.DateSecondsAdapter.class);
super.configure();
}
@Provides
@Singleton
@com.google.inject.name.Named(Constants.PROPERTY_GSON_ADAPTERS)
public Map<Class, Object> provideCustomAdapterBindings() {
Map<Class, Object> bindings = Maps.newHashMap();
bindings.put(ObjectType.class, new CustomDeserializers.ObjectTypeAdapter());
return bindings;
}
});
}

View File

@ -0,0 +1,105 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.functions;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Provides;
import org.jclouds.Constants;
import org.jclouds.gogrid.config.GoGridContextModule;
import org.jclouds.gogrid.domain.*;
import org.jclouds.gogrid.functions.internal.CustomDeserializers;
import org.jclouds.http.functions.config.ParserModule;
import org.testng.annotations.Test;
import javax.inject.Singleton;
import java.io.InputStream;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Map;
import java.util.SortedSet;
import static org.testng.Assert.assertEquals;
/**
* @author Oleksiy Yarmula
*/
@Test(groups = "unit", testName = "gogrid.ParseLoadBalancersFromJsonResponseTest")
public class ParseLoadBalancersFromJsonResponseTest {
@Test
public void testApplyInputStreamDetails() throws UnknownHostException {
InputStream is = getClass().getResourceAsStream("/test_get_load_balancer_list.json");
ParseLoadBalancerListFromJsonResponse parser = new ParseLoadBalancerListFromJsonResponse(i
.getInstance(Gson.class));
SortedSet<LoadBalancer> response = parser.apply(is);
LoadBalancer loadBalancer = new LoadBalancer(6372L,
"Balancer", null, new IpPortPair(new Ip(1313082L,
"204.51.240.181",
"204.51.240.176/255.255.255.240",
true,
IpState.ASSIGNED),
80),
Arrays.asList(
new IpPortPair(new Ip(1313086L,
"204.51.240.185",
"204.51.240.176/255.255.255.240",
true,
IpState.ASSIGNED),
80),
new IpPortPair(new Ip(1313089L,
"204.51.240.188",
"204.51.240.176/255.255.255.240",
true,
IpState.ASSIGNED),
80)
),
LoadBalancerType.ROUND_ROBIN,
LoadBalancerPersistenceType.NONE,
LoadBalancerOs.F5,
LoadBalancerState.ON);
assertEquals(Iterables.getOnlyElement(response), loadBalancer);
}
Injector i = Guice.createInjector(new ParserModule() {
@Override
protected void configure() {
bind(DateAdapter.class).to(GoGridContextModule.DateSecondsAdapter.class);
super.configure();
}
@Provides
@Singleton
@com.google.inject.name.Named(Constants.PROPERTY_GSON_ADAPTERS)
public Map<Class, Object> provideCustomAdapterBindings() {
Map<Class, Object> bindings = Maps.newHashMap();
bindings.put(LoadBalancerOs.class, new CustomDeserializers.LoadBalancerOsAdapter());
bindings.put(LoadBalancerState.class, new CustomDeserializers.LoadBalancerStateAdapter());
bindings.put(LoadBalancerPersistenceType.class, new CustomDeserializers.LoadBalancerPersistenceTypeAdapter());
bindings.put(LoadBalancerType.class, new CustomDeserializers.LoadBalancerTypeAdapter());
bindings.put(IpState.class, new CustomDeserializers.IpStateAdapter());
return bindings;
}
});
}

View File

@ -29,11 +29,16 @@ import java.io.InputStream;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.Map;
import java.util.SortedSet; import java.util.SortedSet;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.inject.Provides;
import org.jclouds.Constants;
import org.jclouds.gogrid.config.GoGridContextModule; import org.jclouds.gogrid.config.GoGridContextModule;
import org.jclouds.gogrid.domain.*; import org.jclouds.gogrid.domain.*;
import org.jclouds.gogrid.functions.internal.CustomDeserializers;
import org.jclouds.http.functions.config.ParserModule; import org.jclouds.http.functions.config.ParserModule;
import org.testng.annotations.Test; import org.testng.annotations.Test;
@ -41,22 +46,17 @@ import com.google.gson.Gson;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector; import com.google.inject.Injector;
import javax.inject.Singleton;
/** /**
* Tests behavior of {@code ParseStatusesFromJsonResponse} * Tests behavior of {@code ParseStatusesFromJsonResponse}
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
@Test(groups = "unit", testName = "twitter.ParseStatusesFromJsonResponseTest") @Test(groups = "unit", testName = "gogrid.ParseServersFromJsonResponseTest")
public class ParseStatusesFromJsonResponseTest { public class ParseServersFromJsonResponseTest {
Injector i = Guice.createInjector(new ParserModule() {
@Override
protected void configure() {
bind(DateAdapter.class).to(GoGridContextModule.DateSecondsAdapter.class);
super.configure();
}
});
@Test
public void testApplyInputStreamDetails() throws UnknownHostException { public void testApplyInputStreamDetails() throws UnknownHostException {
InputStream is = getClass().getResourceAsStream("/test_get_server_list.json"); InputStream is = getClass().getResourceAsStream("/test_get_server_list.json");
@ -72,7 +72,7 @@ public class ParseStatusesFromJsonResponseTest {
new Option(1L, "512MB", "Server with 512MB RAM"), new Option(1L, "512MB", "Server with 512MB RAM"),
centOs, centOs,
new Ip(1313079L, "204.51.240.178", "204.51.240.176/255.255.255.240", true, new Ip(1313079L, "204.51.240.178", "204.51.240.176/255.255.255.240", true,
new Option(2L, "Assigned", "IP is reserved or in use")), IpState.ASSIGNED),
new ServerImage(1946L, "GSI-f8979644-e646-4711-ad58-d98a5fa3612c", new ServerImage(1946L, "GSI-f8979644-e646-4711-ad58-d98a5fa3612c",
"BitNami Gallery 2.3.1-0", "http://bitnami.org/stack/gallery", "BitNami Gallery 2.3.1-0", "http://bitnami.org/stack/gallery",
centOs, null, webServer, centOs, null, webServer,
@ -88,4 +88,23 @@ public class ParseStatusesFromJsonResponseTest {
new Customer(24732L, "BitRock"))); new Customer(24732L, "BitRock")));
assertEquals(Iterables.getOnlyElement(response), server); assertEquals(Iterables.getOnlyElement(response), server);
} }
Injector i = Guice.createInjector(new ParserModule() {
@Override
protected void configure() {
bind(DateAdapter.class).to(GoGridContextModule.DateSecondsAdapter.class);
super.configure();
}
@Provides
@Singleton
@com.google.inject.name.Named(Constants.PROPERTY_GSON_ADAPTERS)
public Map<Class, Object> provideCustomAdapterBindings() {
Map<Class, Object> bindings = Maps.newHashMap();
bindings.put(IpState.class, new CustomDeserializers.IpStateAdapter());
return bindings;
}
});
} }

View File

@ -0,0 +1,109 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.gogrid.services;
import com.google.common.collect.Iterables;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import com.google.inject.Provides;
import com.google.inject.TypeLiteral;
import org.jclouds.encryption.EncryptionService;
import org.jclouds.gogrid.GoGrid;
import org.jclouds.gogrid.filters.SharedKeyLiteAuthentication;
import org.jclouds.gogrid.functions.ParseLoadBalancerListFromJsonResponse;
import org.jclouds.logging.Logger;
import org.jclouds.rest.RestClientTest;
import org.jclouds.rest.internal.GeneratedHttpRequest;
import org.jclouds.rest.internal.RestAnnotationProcessor;
import org.testng.annotations.Test;
import javax.inject.Singleton;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.URI;
import static org.testng.Assert.assertEquals;
/**
* @author Oleksiy Yarmula
*/
public class GridLoadBalancerAsyncClientTest extends RestClientTest<GridLoadBalancerAsyncClient> {
@Test
public void testGetAssignedIpList() throws NoSuchMethodException, IOException {
Method method = GridLoadBalancerAsyncClient.class.getMethod("getLoadBalancerList");
GeneratedHttpRequest<GridLoadBalancerAsyncClient> httpRequest = processor.createRequest(method);
assertRequestLineEquals(httpRequest,
"GET https://api.gogrid.com/api/grid/loadbalancer/list?v=1.4 HTTP/1.1");
assertHeadersEqual(httpRequest, "");
assertPayloadEquals(httpRequest, null);
assertResponseParserClassEquals(method, httpRequest, ParseLoadBalancerListFromJsonResponse.class);
assertSaxResponseParserClassEquals(method, null);
assertExceptionParserClassEquals(method, null);
checkFilters(httpRequest);
Iterables.getOnlyElement(httpRequest.getFilters()).filter(httpRequest);
assertRequestLineEquals(httpRequest,
"GET https://api.gogrid.com/api/grid/loadbalancer/list?v=1.4&" +
"sig=3f446f171455fbb5574aecff4997b273&api_key=foo " +
"HTTP/1.1");
assertHeadersEqual(httpRequest, "");
assertPayloadEquals(httpRequest, null);
}
@Override
protected void checkFilters(GeneratedHttpRequest<GridLoadBalancerAsyncClient> httpMethod) {
assertEquals(httpMethod.getFilters().size(), 1);
assertEquals(httpMethod.getFilters().get(0).getClass(), SharedKeyLiteAuthentication.class);
}
@Override
protected TypeLiteral<RestAnnotationProcessor<GridLoadBalancerAsyncClient>> createTypeLiteral() {
return new TypeLiteral<RestAnnotationProcessor<GridLoadBalancerAsyncClient>>() {
};
}
@Override
protected Module createModule() {
return new AbstractModule() {
@Override
protected void configure() {
bind(URI.class).annotatedWith(GoGrid.class).toInstance(
URI.create("https://api.gogrid.com/api"));
bind(Logger.LoggerFactory.class).toInstance(new Logger.LoggerFactory() {
public Logger getLogger(String category) {
return Logger.NULL;
}
});
}
@Provides
@Singleton
public SharedKeyLiteAuthentication provideAuthentication(EncryptionService encryptionService)
throws UnsupportedEncodingException {
return new SharedKeyLiteAuthentication("foo", "bar", 1267243795L, encryptionService);
}
};
}
}

View File

@ -0,0 +1,67 @@
{
"list": [
{
"object": "job",
"command": {
"object": "option",
"description": "Delete Virtual Server",
"name": "DeleteVirtualServer",
"id": 7
},
"currentstate": {
"object": "option",
"description": "Change request has succeeded.",
"name": "Succeeded",
"id": 3
},
"owner": "3116784158f0af2d-24076@api.gogrid.com",
"objecttype": {
"object": "option",
"description": null,
"name": "VirtualServer",
"id": 1
},
"detail": {
"type": "virtual_server",
"description": null,
"image": "GSI-f8979644-e646-4711-ad58-d98a5fa3612c",
"name": "ServerCreated40562",
"ip": "204.51.240.189"
},
"history": [
{
"state": {
"object": "option",
"description": "Change request is created but not queued yet",
"name": "Created",
"id": 7
},
"id": 940263,
"updatedon": 1267404528897
},
{
"state": {
"object": "option",
"description": "Change request is new to the system.",
"name": "Queued",
"id": 1
},
"id": 940264,
"updatedon": 1267404528967
}
],
"attempts": 1,
"createdon": 1267404528895,
"lastupdatedon": 1267404538592,
"id": 250628
}
],
"summary": {
"total": 68,
"start": 0,
"numpages": 14,
"returned": 5
},
"status": "success",
"method": "/grid/job/list"
}

View File

@ -0,0 +1,92 @@
{
"list": [
{
"object": "loadbalancer",
"virtualip": {
"object": "ipportpair",
"ip": {
"object": "ip",
"public": true,
"subnet": "204.51.240.176/255.255.255.240",
"state": {
"object": "option",
"description": "IP is reserved or in use",
"name": "Assigned",
"id": 2
},
"ip": "204.51.240.181",
"id": 1313082
},
"port": 80
},
"type": {
"object": "option",
"description": "",
"name": "Round Robin",
"id": 1
},
"os": {
"object": "option",
"description": "The F5 Load Balancer.",
"name": "F5",
"id": 1
},
"state": {
"object": "option",
"description": "Loadbalancer is enabled and on.",
"name": "On",
"id": 1
},
"name": "Balancer",
"realiplist": [
{
"ip": {
"object": "ip",
"public": true,
"subnet": "204.51.240.176/255.255.255.240",
"state": {
"object": "option",
"description": "IP is reserved or in use",
"name": "Assigned",
"id": 2
},
"ip": "204.51.240.185",
"id": 1313086
},
"port": 80
},
{
"ip": {
"object": "ip",
"public": true,
"subnet": "204.51.240.176/255.255.255.240",
"state": {
"object": "option",
"description": "IP is reserved or in use",
"name": "Assigned",
"id": 2
},
"ip": "204.51.240.188",
"id": 1313089
},
"port": 80
}
],
"id": 6372,
"persistence": {
"object": "option",
"description": "",
"name": "None",
"id": 1
}
}
],
"summary": {
"total": 1,
"start": 0,
"numpages": 0,
"returned": 1
},
"status": "success",
"method": "/grid/loadbalancer/list"
}