mirror of https://github.com/apache/jclouds.git
Added some functions to GleSYS IP.
This commit is contained in:
parent
775dd3a2b9
commit
dec366c03a
|
@ -26,7 +26,7 @@ import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents detailed information about an available IP address.
|
* Represents detailed information about an IP address.
|
||||||
*/
|
*/
|
||||||
public class IpDetails {
|
public class IpDetails {
|
||||||
|
|
||||||
|
|
|
@ -18,14 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.glesys.features;
|
package org.jclouds.glesys.features;
|
||||||
|
|
||||||
import java.util.Set;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
import javax.ws.rs.Consumes;
|
|
||||||
import javax.ws.rs.GET;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.PathParam;
|
|
||||||
import javax.ws.rs.core.MediaType;
|
|
||||||
|
|
||||||
import org.jclouds.glesys.domain.IpDetails;
|
import org.jclouds.glesys.domain.IpDetails;
|
||||||
import org.jclouds.http.filters.BasicAuthentication;
|
import org.jclouds.http.filters.BasicAuthentication;
|
||||||
import org.jclouds.rest.annotations.ExceptionParser;
|
import org.jclouds.rest.annotations.ExceptionParser;
|
||||||
|
@ -34,13 +27,16 @@ import org.jclouds.rest.annotations.SelectJson;
|
||||||
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
|
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
|
||||||
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
||||||
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import javax.ws.rs.*;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides asynchronous access to IP Addresses via their REST API.
|
* Provides asynchronous access to IP Addresses via their REST API.
|
||||||
* <p/>
|
* <p/>
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole, Mattias Holmqvist
|
||||||
|
*
|
||||||
* @see ServerClient
|
* @see ServerClient
|
||||||
* @see <a href="https://customer.glesys.com/api.php" />
|
* @see <a href="https://customer.glesys.com/api.php" />
|
||||||
*/
|
*/
|
||||||
|
@ -48,6 +44,41 @@ import com.google.common.util.concurrent.ListenableFuture;
|
||||||
public interface IpAsyncClient {
|
public interface IpAsyncClient {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IpClient#take
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/ip/take/format/json")
|
||||||
|
ListenableFuture<Void> take(@FormParam("ipaddress") String ipAddress);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IpClient#release
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/ip/release/format/json")
|
||||||
|
ListenableFuture<Void> release(@FormParam("ipaddress") String ipAddress);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IpClient#add
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/ip/add/format/json")
|
||||||
|
ListenableFuture<Void> add(@FormParam("serverid") String serverId,
|
||||||
|
@FormParam("ipaddress") String ipAddress);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see IpClient#remove
|
||||||
|
*
|
||||||
|
* TODO: add optional release_ip parameter
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/ip/remove/format/json")
|
||||||
|
ListenableFuture<Void> remove(@FormParam("ipaddress") String ipAddress,
|
||||||
|
@FormParam("serverid") String serverId);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see IpClient#listFree
|
* @see IpClient#listFree
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -28,13 +28,50 @@ import java.util.concurrent.TimeUnit;
|
||||||
* Provides synchronous access to IP Addresses.
|
* Provides synchronous access to IP Addresses.
|
||||||
* <p/>
|
* <p/>
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole, Mattias Holmqvist
|
||||||
* @see IpAsyncClient
|
* @see IpAsyncClient
|
||||||
* @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)
|
||||||
public interface IpClient {
|
public interface IpClient {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take a free IP address and add it to this account. You can list free IP addresses with the function listFree().
|
||||||
|
* Once your free IP on this account you can add it to a server with the add() function.
|
||||||
|
*
|
||||||
|
* @param ipAddress
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
void take(String ipAddress);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an unused IP address to the pool of free ips. If the IP address is allocated to a server,
|
||||||
|
* it must first be removed by calling remove(ipAddress) before it can be released.
|
||||||
|
*
|
||||||
|
* @param ipAddress the IP address to be released
|
||||||
|
*/
|
||||||
|
void release(String ipAddress);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an IP address to an server. The IP has to be free, but reserved to this account. You are able to list such addresses
|
||||||
|
* with listOwn() and reserve an address for this account by using take(). To find free ips you can use ip/listfree
|
||||||
|
* ip to an Xen-server you have to configure the server yourself, unless the ip was added during the c
|
||||||
|
* server (server/create). You can get detailed information such as gateway and netmask using the ip
|
||||||
|
*
|
||||||
|
* @param serverId the server to add the IP address to
|
||||||
|
* @param ipAddress the IP address to remove
|
||||||
|
*/
|
||||||
|
void add(String serverId, String ipAddress);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an IP address from a server. This does not release it back to GleSYS pool of free ips. The address will be
|
||||||
|
* kept on the account so that you can use it for other servers or the same server at a later time. To completely remove
|
||||||
|
* the IP address from this account, use the function release().
|
||||||
|
*
|
||||||
|
* @param ipAddress the IP address to remove
|
||||||
|
* @param serverId the server to remove the IP address from
|
||||||
|
*/
|
||||||
|
void remove(String ipAddress, String serverId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a set of all IP addresses that are available and not used on any account or server.
|
* Get a set of all IP addresses that are available and not used on any account or server.
|
||||||
|
@ -51,9 +88,8 @@ public interface IpClient {
|
||||||
* on different platforms.
|
* on different platforms.
|
||||||
*
|
*
|
||||||
* @param ipAddress the ip address
|
* @param ipAddress the ip address
|
||||||
* @return details about the given IP saddress
|
* @return details about the given IP address
|
||||||
*/
|
*/
|
||||||
IpDetails getIpDetails(String ipAddress);
|
IpDetails getIpDetails(String ipAddress);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -18,21 +18,26 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.glesys.features;
|
package org.jclouds.glesys.features;
|
||||||
|
|
||||||
import static org.testng.Assert.assertEquals;
|
import com.google.common.collect.ImmutableMultimap;
|
||||||
|
|
||||||
import java.net.URI;
|
|
||||||
|
|
||||||
import org.jclouds.glesys.GleSYSClient;
|
import org.jclouds.glesys.GleSYSClient;
|
||||||
import org.jclouds.glesys.domain.IpDetails;
|
import org.jclouds.glesys.domain.IpDetails;
|
||||||
import org.jclouds.http.HttpRequest;
|
import org.jclouds.http.HttpRequest;
|
||||||
import org.jclouds.http.HttpResponse;
|
import org.jclouds.http.HttpResponse;
|
||||||
|
import org.jclouds.http.HttpResponseException;
|
||||||
import org.jclouds.rest.BaseRestClientExpectTest;
|
import org.jclouds.rest.BaseRestClientExpectTest;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMultimap;
|
import java.net.URI;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static java.util.Arrays.asList;
|
||||||
|
import static java.util.Collections.emptySet;
|
||||||
|
import static org.jclouds.io.Payloads.newUrlEncodedFormPayload;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.fail;
|
||||||
|
import static org.testng.collections.Sets.newHashSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* Allows us to test a client via its side effects.
|
* Allows us to test a client via its side effects.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
|
@ -48,7 +53,7 @@ public class IpClientExpectTest extends BaseRestClientExpectTest<GleSYSClient> {
|
||||||
IpClient client = requestSendsResponse(
|
IpClient client = requestSendsResponse(
|
||||||
HttpRequest.builder().method("GET").endpoint(
|
HttpRequest.builder().method("GET").endpoint(
|
||||||
URI.create("https://api.glesys.com/ip/details/ipaddress/31.192.227.37/format/json")).headers(
|
URI.create("https://api.glesys.com/ip/details/ipaddress/31.192.227.37/format/json")).headers(
|
||||||
ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put(
|
ImmutableMultimap.<String, String>builder().put("Accept", "application/json").put(
|
||||||
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build()).build(),
|
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build()).build(),
|
||||||
HttpResponse.builder().statusCode(200).payload(payloadFromResource("/ip_get_details.json")).build())
|
HttpResponse.builder().statusCode(200).payload(payloadFromResource("/ip_get_details.json")).build())
|
||||||
.getIpClient();
|
.getIpClient();
|
||||||
|
@ -63,11 +68,182 @@ public class IpClientExpectTest extends BaseRestClientExpectTest<GleSYSClient> {
|
||||||
IpClient client = requestSendsResponse(
|
IpClient client = requestSendsResponse(
|
||||||
HttpRequest.builder().method("GET").endpoint(
|
HttpRequest.builder().method("GET").endpoint(
|
||||||
URI.create("https://api.glesys.com/ip/details/ipaddress/31.192.227.37/format/json")).headers(
|
URI.create("https://api.glesys.com/ip/details/ipaddress/31.192.227.37/format/json")).headers(
|
||||||
ImmutableMultimap.<String, String> builder().put("Accept", "application/json").put(
|
ImmutableMultimap.<String, String>builder().put("Accept", "application/json").put(
|
||||||
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build()).build(),
|
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build()).build(),
|
||||||
HttpResponse.builder().statusCode(404).build()).getIpClient();
|
HttpResponse.builder().statusCode(404).build()).getIpClient();
|
||||||
|
|
||||||
assertEquals(client.getIpDetails("31.192.227.37"), null);
|
assertEquals(client.getIpDetails("31.192.227.37"), null);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testTakeWhenResponseIs2xx() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("POST").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/take/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder()
|
||||||
|
.put("Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build())
|
||||||
|
.payload(newUrlEncodedFormPayload(
|
||||||
|
ImmutableMultimap.<String, String>builder().put("ipaddress", "46.21.105.186").build()
|
||||||
|
)).build(),
|
||||||
|
HttpResponse.builder().statusCode(200).payload(payloadFromResource("/ip_take.json")).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
client.take("46.21.105.186");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testTakeWhenResponseIs4xxThrowsResponseException() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("POST").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/take/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder()
|
||||||
|
.put("Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build())
|
||||||
|
.payload(newUrlEncodedFormPayload(
|
||||||
|
ImmutableMultimap.<String, String>builder().put("ipaddress", "46.21.105.186").build()
|
||||||
|
)).build(),
|
||||||
|
HttpResponse.builder().statusCode(400).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
try {
|
||||||
|
client.take("46.21.105.186");
|
||||||
|
fail();
|
||||||
|
} catch (HttpResponseException e) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testReleaseWhenResponseIs2xx() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("POST").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/release/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder()
|
||||||
|
.put("Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build())
|
||||||
|
.payload(newUrlEncodedFormPayload(
|
||||||
|
ImmutableMultimap.<String, String>builder().put("ipaddress", "46.21.105.186").build()
|
||||||
|
)).build(),
|
||||||
|
HttpResponse.builder().statusCode(200).payload(payloadFromResource("/ip_release.json")).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
client.release("46.21.105.186");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testReleaseWhenResponseIs4xxThrowsResponseException() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("POST").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/release/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder()
|
||||||
|
.put("Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build())
|
||||||
|
.payload(newUrlEncodedFormPayload(
|
||||||
|
ImmutableMultimap.<String, String>builder().put("ipaddress", "46.21.105.186").build()
|
||||||
|
)).build(),
|
||||||
|
HttpResponse.builder().statusCode(400).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
try {
|
||||||
|
client.release("46.21.105.186");
|
||||||
|
fail();
|
||||||
|
} catch (HttpResponseException e) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListFreeWhenResponseIs2xx() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("GET").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/listfree/ipversion/4/datacenter/Falkenberg/platform/OpenVZ/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder().put("Accept", "application/json").put(
|
||||||
|
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build()).build(),
|
||||||
|
HttpResponse.builder().statusCode(200).payload(payloadFromResource("/ip_list_free.json")).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
Set<Object> expectedIps = newHashSet();
|
||||||
|
expectedIps.addAll(asList("31.192.226.131", "31.192.226.133"));
|
||||||
|
assertEquals(client.listFree("4", "Falkenberg", "OpenVZ"), expectedIps);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testListFreeWhenResponseIs404ReturnsEmptySet() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("GET").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/listfree/ipversion/4/datacenter/Falkenberg/platform/OpenVZ/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder().put("Accept", "application/json").put(
|
||||||
|
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build()).build(),
|
||||||
|
HttpResponse.builder().statusCode(404).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
assertEquals(client.listFree("4", "Falkenberg", "OpenVZ"), emptySet());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAddWhenResponseIs2xx() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("POST").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/add/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder().put(
|
||||||
|
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build())
|
||||||
|
.payload(newUrlEncodedFormPayload(
|
||||||
|
ImmutableMultimap.<String, String>builder()
|
||||||
|
.put("serverid", "vz1946889")
|
||||||
|
.put("ipaddress", "31.192.227.37").build())).build(),
|
||||||
|
HttpResponse.builder().statusCode(200).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
client.add("vz1946889", "31.192.227.37");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAddWhenResponseIs4xxThrowsHttpException() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("POST").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/add/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder().put(
|
||||||
|
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build())
|
||||||
|
.payload(newUrlEncodedFormPayload(
|
||||||
|
ImmutableMultimap.<String, String>builder()
|
||||||
|
.put("serverid", "vz1946889")
|
||||||
|
.put("ipaddress", "31.192.227.37").build())).build(),
|
||||||
|
HttpResponse.builder().statusCode(400).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
try {
|
||||||
|
client.add("vz1946889", "31.192.227.37");
|
||||||
|
fail();
|
||||||
|
} catch (HttpResponseException e) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRemoveWhenResponseIs2xx() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("POST").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/remove/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder().put(
|
||||||
|
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build())
|
||||||
|
.payload(newUrlEncodedFormPayload(
|
||||||
|
ImmutableMultimap.<String, String>builder()
|
||||||
|
.put("ipaddress", "31.192.227.37")
|
||||||
|
.put("serverid", "vz1946889").build())).build(),
|
||||||
|
HttpResponse.builder().statusCode(200).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
client.remove("31.192.227.37", "vz1946889");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testRemoveWhenResponseIs4xxThrowsHttpException() {
|
||||||
|
IpClient client = requestSendsResponse(
|
||||||
|
HttpRequest.builder().method("POST").endpoint(
|
||||||
|
URI.create("https://api.glesys.com/ip/remove/format/json"))
|
||||||
|
.headers(ImmutableMultimap.<String, String>builder().put(
|
||||||
|
"Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build())
|
||||||
|
.payload(newUrlEncodedFormPayload(
|
||||||
|
ImmutableMultimap.<String, String>builder()
|
||||||
|
.put("ipaddress", "31.192.227.37")
|
||||||
|
.put("serverid", "vz1946889").build())).build(),
|
||||||
|
HttpResponse.builder().statusCode(400).build())
|
||||||
|
.getIpClient();
|
||||||
|
|
||||||
|
try {
|
||||||
|
client.remove("31.192.227.37", "vz1946889");
|
||||||
|
fail();
|
||||||
|
} catch (HttpResponseException e) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
{"response":{"status":{"code":"200","text":"OK"},"debug":{"input":{"ipaddress":"31.192.227.37"}}}}
|
|
@ -0,0 +1 @@
|
||||||
|
{"response":{"status":{"code":"200","text":"OK"},"debug":{"input":{"ipaddress":"46.21.105.186"}}}}
|
Loading…
Reference in New Issue