diff --git a/sandbox-providers/glesys/src/main/java/org/jclouds/glesys/features/IpAsyncClient.java b/sandbox-providers/glesys/src/main/java/org/jclouds/glesys/features/IpAsyncClient.java
index f458cd03fd..80a9986326 100644
--- a/sandbox-providers/glesys/src/main/java/org/jclouds/glesys/features/IpAsyncClient.java
+++ b/sandbox-providers/glesys/src/main/java/org/jclouds/glesys/features/IpAsyncClient.java
@@ -18,18 +18,42 @@
*/
package org.jclouds.glesys.features;
+import com.google.common.util.concurrent.ListenableFuture;
import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
+
+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 java.util.Set;
/**
* Provides asynchronous access to IP Addresses via their REST API.
*
- *
+ *
+ * @author Adrian Cole
* @see ServerClient
* @see
- * @author Adrian Cole
*/
@RequestFilters(BasicAuthentication.class)
public interface IpAsyncClient {
+
+ /**
+ * @see IpClient#listFree
+ */
+ @GET
+ @Path("/ip/listfree/ipversion/{ipversion}/datacenter/{datacenter}/platform/{platform}/format/json")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @SelectJson("iplist")
+ @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
+ ListenableFuture> listFree(@PathParam("ipversion") String ipversion,
+ @PathParam("datacenter") String datacenter,
+ @PathParam("platform") String platform);
+
}
diff --git a/sandbox-providers/glesys/src/main/java/org/jclouds/glesys/features/IpClient.java b/sandbox-providers/glesys/src/main/java/org/jclouds/glesys/features/IpClient.java
index 8ee2d53b39..f144ff3b1a 100644
--- a/sandbox-providers/glesys/src/main/java/org/jclouds/glesys/features/IpClient.java
+++ b/sandbox-providers/glesys/src/main/java/org/jclouds/glesys/features/IpClient.java
@@ -18,19 +18,31 @@
*/
package org.jclouds.glesys.features;
-import java.util.concurrent.TimeUnit;
-
import org.jclouds.concurrent.Timeout;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
/**
* Provides synchronous access to IP Addresses.
*
- *
+ *
+ * @author Adrian Cole
* @see IpAsyncClient
* @see
- * @author Adrian Cole
*/
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
public interface IpClient {
+
+ /**
+ * Get a set of all IP addresses that are available and not used on any account or server.
+ *
+ * @param ipversion "4" or "6", for IPV4 or IPV6, respectively
+ * @param datacenter the datacenter
+ * @param platform the platform
+ * @return a set of free IP addresses
+ */
+ Set listFree(String ipversion, String datacenter, String platform);
+
}
\ No newline at end of file
diff --git a/sandbox-providers/glesys/src/test/java/org/jclouds/glesys/features/IpClientLiveTest.java b/sandbox-providers/glesys/src/test/java/org/jclouds/glesys/features/IpClientLiveTest.java
index f41ab83577..5a598abedc 100644
--- a/sandbox-providers/glesys/src/test/java/org/jclouds/glesys/features/IpClientLiveTest.java
+++ b/sandbox-providers/glesys/src/test/java/org/jclouds/glesys/features/IpClientLiveTest.java
@@ -21,9 +21,13 @@ package org.jclouds.glesys.features;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
+import java.util.Set;
+
+import static org.testng.Assert.assertTrue;
+
/**
* Tests behavior of {@code IpClient}
- *
+ *
* @author Adrian Cole
*/
@Test(groups = "live", testName = "IpClientLiveTest")
@@ -37,4 +41,9 @@ public class IpClientLiveTest extends BaseGleSYSClientLiveTest {
private IpClient client;
+ @Test
+ public void testListFree() throws Exception {
+ Set freeIps = client.listFree("4", "Falkenberg", "OpenVZ");
+ assertTrue(freeIps.size() >= 0);
+ }
}
diff --git a/sandbox-providers/glesys/src/test/java/org/jclouds/glesys/parse/ParseIpAddressFromResponseTest.java b/sandbox-providers/glesys/src/test/java/org/jclouds/glesys/parse/ParseIpAddressFromResponseTest.java
new file mode 100644
index 0000000000..9653a64723
--- /dev/null
+++ b/sandbox-providers/glesys/src/test/java/org/jclouds/glesys/parse/ParseIpAddressFromResponseTest.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.jclouds.glesys.parse;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.jclouds.glesys.config.GleSYSParserModule;
+import org.jclouds.json.BaseSetParserTest;
+import org.jclouds.json.config.GsonModule;
+import org.jclouds.rest.annotations.SelectJson;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+import java.util.HashSet;
+import java.util.Set;
+
+import static java.util.Arrays.asList;
+
+@Test(groups = "unit", testName = "ParseIpAddressFromResponseTest")
+public class ParseIpAddressFromResponseTest extends BaseSetParserTest {
+
+ @Override
+ public String resource() {
+ return "/ip_list_free.json";
+ }
+
+ @Override
+ @SelectJson("iplist")
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Set expected() {
+ return new HashSet(asList("31.192.226.131", "31.192.226.133"));
+ }
+
+ protected Injector injector() {
+ return Guice.createInjector(new GleSYSParserModule(), new GsonModule());
+ }
+}
diff --git a/sandbox-providers/glesys/src/test/resources/ip_list_free.json b/sandbox-providers/glesys/src/test/resources/ip_list_free.json
new file mode 100644
index 0000000000..3583d21467
--- /dev/null
+++ b/sandbox-providers/glesys/src/test/resources/ip_list_free.json
@@ -0,0 +1 @@
+{"response":{"status":{"code":"200","text":"OK"},"ipinfo":{"ipversion":4,"datacenter":"Falkenberg","platform":"OpenVZ"},"iplist":["31.192.226.131","31.192.226.133"],"debug":{"input":{"ipversion":"4","datacenter":"Falkenberg","platform":"OpenVZ"}}}}
\ No newline at end of file