Repository: jclouds-labs
Updated Branches:
  refs/heads/master 787af1dc8 -> f997b0615


JCLOUDS-1138 oneandone-image-api


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/f997b061
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/f997b061
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/f997b061

Branch: refs/heads/master
Commit: f997b06159e4d80690a391b1db10fbd75429b8b3
Parents: 787af1d
Author: Ali Bazlamit <[email protected]>
Authored: Wed Jul 13 23:17:19 2016 +0200
Committer: Ignasi Barrera <[email protected]>
Committed: Fri Jul 22 09:42:35 2016 +0200

----------------------------------------------------------------------
 .../jclouds/oneandone/rest/OneAndOneApi.java    |   5 +
 .../oneandone/rest/domain/DataCenter.java       |  15 +-
 .../jclouds/oneandone/rest/domain/Dvd.java      |  13 +-
 .../rest/domain/FixedInstanceHardware.java      |   1 +
 .../jclouds/oneandone/rest/domain/Hardware.java |   1 +
 .../oneandone/rest/domain/HardwareFlavour.java  |   1 +
 .../jclouds/oneandone/rest/domain/Image.java    |  71 +++++++
 .../oneandone/rest/features/ImageApi.java       |  77 ++++++++
 .../rest/features/ImageApiLiveTest.java         | 114 +++++++++++
 .../rest/features/ImageApiMockTest.java         | 189 +++++++++++++++++++
 .../rest/internal/BaseOneAndOneApiMockTest.java |   1 +
 oneandone/src/test/resources/image/get.json     |  31 +++
 oneandone/src/test/resources/image/list.json    |  63 +++++++
 .../src/test/resources/image/list.options.json  |  33 ++++
 14 files changed, 600 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java
index 577afcb..dd9b3b2 100644
--- 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java
+++ 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java
@@ -17,6 +17,7 @@
 package org.apache.jclouds.oneandone.rest;
 
 import java.io.Closeable;
+import org.apache.jclouds.oneandone.rest.features.ImageApi;
 import org.apache.jclouds.oneandone.rest.features.ServerApi;
 import org.jclouds.rest.annotations.Delegate;
 
@@ -24,4 +25,8 @@ public interface OneAndOneApi extends Closeable {
 
    @Delegate
    ServerApi serverApi();
+
+   @Delegate
+   ImageApi imageApi();
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java
 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java
index c2d129f..95e2bf3 100644
--- 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java
+++ 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java
@@ -21,15 +21,14 @@ import org.jclouds.json.SerializedNames;
 
 @AutoValue
 public abstract class DataCenter {
+    public abstract String id();
 
-   public abstract String id();
+    public abstract String countryCode();
 
-   public abstract String countryCode();
+    public abstract String location();
 
-   public abstract String location();
-
-   @SerializedNames({"id", "country_code", "location"})
-   public static DataCenter create(String id, String countryCode, String 
location) {
-      return new AutoValue_DataCenter(id, countryCode, location);
-   }
+    @SerializedNames({"id", "country_code", "location"})
+    public static DataCenter create(String id, String countryCode, String 
location) {
+        return new AutoValue_DataCenter(id, countryCode, location);
+    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java
index 865eb48..dd778be 100644
--- a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java
+++ b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java
@@ -21,13 +21,12 @@ import org.jclouds.json.SerializedNames;
 
 @AutoValue
 public abstract class Dvd {
+    public abstract String id();
 
-   public abstract String id();
+    public abstract String name();
 
-   public abstract String name();
-
-   @SerializedNames({"id", "name"})
-   public static Dvd create(String id, String name) {
-      return new AutoValue_Dvd(id, name);
-   }
+    @SerializedNames({"id", "name"})
+    public static Dvd create(String id, String name) {
+        return new AutoValue_Dvd(id, name);
+    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/FixedInstanceHardware.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/FixedInstanceHardware.java
 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/FixedInstanceHardware.java
index 6d2e198..ab40a84 100644
--- 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/FixedInstanceHardware.java
+++ 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/FixedInstanceHardware.java
@@ -28,4 +28,5 @@ public abstract class FixedInstanceHardware {
    public static FixedInstanceHardware create(String fixedInstanceSizeId) {
       return new AutoValue_FixedInstanceHardware(fixedInstanceSizeId);
    }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Hardware.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Hardware.java
 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Hardware.java
index 4eda12f..30480f5 100644
--- 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Hardware.java
+++ 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Hardware.java
@@ -68,4 +68,5 @@ public abstract class Hardware {
          return new AutoValue_Hardware_UpdateHardware(vcore, 
coresPerProcessor, ram);
       }
    }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/HardwareFlavour.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/HardwareFlavour.java
 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/HardwareFlavour.java
index b5098c9..b8b8744 100644
--- 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/HardwareFlavour.java
+++ 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/HardwareFlavour.java
@@ -69,4 +69,5 @@ public abstract class HardwareFlavour {
          }
       }
    }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Image.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Image.java 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Image.java
index 80bbead..19acb9f 100644
--- 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Image.java
+++ 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Image.java
@@ -83,4 +83,75 @@ public abstract class Image {
               architecture, osImageType, type, minHddSize, licenses == null ? 
ImmutableList.<Licenses>of() : licenses, state,
               description, hdds == null ? ImmutableList.<Hdd>of() : hdds, 
serverId, frequency, numImages, creationDate);
    }
+
+   @AutoValue
+   public abstract static class CreateImage {
+
+      public abstract String serverId();
+
+      public abstract String name();
+
+      public abstract ImageFrequency frequency();
+
+      @Nullable
+      public abstract String description();
+
+      public abstract int numImages();
+
+      @Nullable
+      public abstract String datacenterId();
+
+      @SerializedNames({"server_id", "name", "frequency", "description", 
"num_images", "datacenter_id"})
+      public static CreateImage create(final String serverId, final String 
name, final ImageFrequency frequency, final String description, final int 
numImages,
+              final String dataCenterId) {
+         return builder()
+                 .name(name)
+                 .serverId(serverId)
+                 .description(description)
+                 .datacenterId(dataCenterId)
+                 .frequency(frequency)
+                 .numImages(numImages)
+                 .build();
+      }
+
+      public static Builder builder() {
+         return new AutoValue_Image_CreateImage.Builder();
+      }
+
+      @AutoValue.Builder
+      public abstract static class Builder {
+
+         public abstract Builder name(String name);
+
+         public abstract Builder serverId(String serverId);
+
+         public abstract Builder frequency(ImageFrequency description);
+
+         public abstract Builder description(String description);
+
+         public abstract Builder numImages(int numImages);
+
+         public abstract Builder datacenterId(String datacenterId);
+
+         public abstract CreateImage build();
+      }
+   }
+
+   @AutoValue
+   public abstract static class UpdateImage {
+
+      @Nullable
+      public abstract String name();
+
+      @Nullable
+      public abstract String description();
+
+      @Nullable
+      public abstract ImageFrequency frequency();
+
+      @SerializedNames({"name", "description", "frequency"})
+      public static UpdateImage create(final String name, final String 
description, final ImageFrequency frequency) {
+         return new AutoValue_Image_UpdateImage(name, description, frequency);
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/features/ImageApi.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/features/ImageApi.java
 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/features/ImageApi.java
new file mode 100644
index 0000000..b2f1cb8
--- /dev/null
+++ 
b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/features/ImageApi.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.apache.jclouds.oneandone.rest.features;
+
+import java.io.Closeable;
+import java.util.List;
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import org.apache.jclouds.oneandone.rest.domain.Image;
+import org.apache.jclouds.oneandone.rest.domain.options.GenericQueryOptions;
+import org.apache.jclouds.oneandone.rest.filters.AuthenticateRequest;
+import org.jclouds.Fallbacks;
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+@Path("images")
+@Produces("application/json")
+@Consumes("application/json")
+@RequestFilters(AuthenticateRequest.class)
+public interface ImageApi extends Closeable {
+
+   @Named("images:list")
+   @GET
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<Image> list();
+
+   @Named("images:list")
+   @GET
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<Image> list(GenericQueryOptions options);
+
+   @Named("image:get")
+   @GET
+   @Path("/{imageId}")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Image get(@PathParam("imageId") String imageId);
+
+   @Named("image:create")
+   @POST
+   Image createImage(@BinderParam(BindToJsonPayload.class) Image.CreateImage 
image);
+
+   @Named("image:update")
+   @PUT
+   @Path("/{imageId}")
+   Image update(@PathParam("imageId") String imageId, 
@BinderParam(BindToJsonPayload.class) Image.UpdateImage image);
+
+   @Named("image:delete")
+   @DELETE
+   @Path("/{imageId}")
+   @MapBinder(BindToJsonPayload.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Image delete(@PathParam("imageId") String imageId);
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/ImageApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/ImageApiLiveTest.java
 
b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/ImageApiLiveTest.java
new file mode 100644
index 0000000..ff38828
--- /dev/null
+++ 
b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/ImageApiLiveTest.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.apache.jclouds.oneandone.rest.features;
+
+import java.util.List;
+import org.apache.jclouds.oneandone.rest.domain.Image;
+import org.apache.jclouds.oneandone.rest.domain.Image.CreateImage;
+import org.apache.jclouds.oneandone.rest.domain.Image.UpdateImage;
+import org.apache.jclouds.oneandone.rest.domain.Server;
+import org.apache.jclouds.oneandone.rest.domain.Types;
+import org.apache.jclouds.oneandone.rest.domain.options.GenericQueryOptions;
+import org.apache.jclouds.oneandone.rest.internal.BaseOneAndOneLiveTest;
+import org.testng.Assert;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", testName = "ImageApiLiveTest")
+public class ImageApiLiveTest extends BaseOneAndOneLiveTest {
+
+   private Image currentImage;
+   private Server currentServer;
+   private List<Image> images;
+
+   private ImageApi imageApi() {
+      return api.imageApi();
+   }
+
+   @BeforeClass
+   public void setupTest() {
+      currentServer = createServer("image jclouds server");
+      assertNodeAvailable(currentServer);
+      currentImage = imageApi().createImage(CreateImage.builder()
+              .name("jcloudsimage")
+              .numImages(1)
+              .frequency(Types.ImageFrequency.WEEKLY)
+              .serverId(currentServer.id())
+              .build());
+      Image checkImage = imageApi().get(currentImage.id());
+
+      assertNotNull(currentImage);
+      assertNotNull(checkImage);
+
+   }
+
+   @Test
+   public void testList() {
+      images = imageApi().list();
+
+      assertNotNull(images);
+      assertFalse(images.isEmpty());
+      Assert.assertTrue(images.size() > 0);
+   }
+
+   @Test
+   public void testListWithOption() {
+      GenericQueryOptions options = new GenericQueryOptions();
+      options.options(0, 0, null, "jcloudsimage", null);
+      List<Image> imageWithQuery = imageApi().list(options);
+
+      assertNotNull(imageWithQuery);
+      assertFalse(imageWithQuery.isEmpty());
+      Assert.assertTrue(imageWithQuery.size() > 0);
+   }
+
+   @Test
+   public void testGetImage() {
+      Image result = imageApi().get(currentImage.id());
+
+      assertNotNull(result);
+      assertEquals(result.id(), currentImage.id());
+   }
+
+   @Test(dependsOnMethods = "testGetImage")
+   public void testUpdateImage() throws InterruptedException {
+      String updatedName = "Updatedjava";
+
+      Image updateResult = imageApi().update(currentImage.id(), 
UpdateImage.create(updatedName, "description", Types.ImageFrequency.ONCE));
+
+      assertNotNull(updateResult);
+
+      assertEquals(updateResult.name(), updatedName);
+
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void teardownTest() throws InterruptedException {
+      if (currentImage != null) {
+         imageApi().delete(currentImage.id());
+      }
+      if (currentServer != null) {
+         assertNodeAvailable(currentServer);
+         deleteServer(currentServer.id());
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/ImageApiMockTest.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/ImageApiMockTest.java
 
b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/ImageApiMockTest.java
new file mode 100644
index 0000000..ae3c4f6
--- /dev/null
+++ 
b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/ImageApiMockTest.java
@@ -0,0 +1,189 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.apache.jclouds.oneandone.rest.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import java.util.List;
+import org.apache.jclouds.oneandone.rest.domain.Image;
+import org.apache.jclouds.oneandone.rest.domain.Image.CreateImage;
+import org.apache.jclouds.oneandone.rest.domain.Image.UpdateImage;
+import org.apache.jclouds.oneandone.rest.domain.Types;
+import org.apache.jclouds.oneandone.rest.domain.options.GenericQueryOptions;
+import org.apache.jclouds.oneandone.rest.internal.BaseOneAndOneApiMockTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "ImageApiMockTest", singleThreaded = true)
+public class ImageApiMockTest extends BaseOneAndOneApiMockTest {
+
+   private ImageApi imageApi() {
+      return api.imageApi();
+   }
+
+   @Test
+   public void testList() throws InterruptedException {
+      server.enqueue(
+              new 
MockResponse().setBody(stringFromResource("/image/list.json"))
+      );
+
+      List<Image> images = imageApi().list();
+
+      assertNotNull(images);
+      assertEquals(images.size(), 2);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/images");
+   }
+
+   @Test
+   public void testList404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404));
+
+      List<Image> images = imageApi().list();
+
+      assertNotNull(images);
+      assertEquals(images.size(), 0);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/images");
+   }
+
+   @Test
+   public void testListWithOption() throws InterruptedException {
+      server.enqueue(
+              new 
MockResponse().setBody(stringFromResource("/image/list.options.json"))
+      );
+      GenericQueryOptions options = new GenericQueryOptions();
+      options.options(0, 0, null, "New", null);
+      List<Image> images = imageApi().list(options);
+
+      assertNotNull(images);
+      assertEquals(images.size(), 1);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/images?q=New");
+   }
+
+   @Test
+   public void testListWithOption404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404)
+      );
+      GenericQueryOptions options = new GenericQueryOptions();
+      options.options(0, 0, null, "test", null);
+      List<Image> images = imageApi().list(options);
+
+      assertNotNull(images);
+      assertEquals(images.size(), 0);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/images?q=test");
+   }
+
+   public void testGetImage() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/image/get.json"))
+      );
+      Image result = imageApi().get("imageId");
+
+      assertNotNull(result);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/images/imageId");
+   }
+
+   @Test
+   public void testGetImage404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404)
+      );
+      Image result = imageApi().get("imageId");
+
+      assertEquals(result, null);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/images/imageId");
+   }
+
+   @Test
+   public void testCreateImage() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/image/get.json"))
+      );
+      Image response = imageApi().createImage(CreateImage.builder()
+              .name("name")
+              .description("desc")
+              .numImages(1)
+              .serverId("server-Id")
+              .frequency(Types.ImageFrequency.ONCE)
+              .datacenterId("datacenter-id")
+              .build());
+
+      assertNotNull(response);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "POST", "/images", "{ \n"
+              + "  \"server_id\": \"server-Id\",\n"
+              + "  \"name\": \"name\",\n"
+              + "  \"description\": \"desc\",\n"
+              + "  \"frequency\": \"ONCE\",\n"
+              + "  \"num_images\": 1,\n"
+              + "  \"datacenter_id\": \"datacenter-id\"\n"
+              + "}"
+      );
+   }
+
+   @Test
+   public void testUpdateImage() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/image/get.json"))
+      );
+      Image response = imageApi().update("imageId", UpdateImage.create("name", 
"desc", Types.ImageFrequency.ONCE));
+
+      assertNotNull(response);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "PUT", "/images/imageId", "{\n"
+              + "  \"name\": \"name\", \n"
+              + "  \"description\": \"desc\",\n"
+              + "  \"frequency\": \"ONCE\"\n"
+              + "}"
+      );
+   }
+
+   @Test
+   public void testDeleteImage() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/image/get.json"))
+      );
+      Image response = imageApi().delete("imageId");
+
+      assertNotNull(response);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "DELETE", "/images/imageId");
+   }
+
+   @Test
+   public void testDeleteImage404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404));
+      Image hdd = imageApi().delete("imageId");
+
+      assertEquals(hdd, null);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "DELETE", "/images/imageId");
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneApiMockTest.java
----------------------------------------------------------------------
diff --git 
a/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneApiMockTest.java
 
b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneApiMockTest.java
index 2b04a80..72e70f2 100644
--- 
a/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneApiMockTest.java
+++ 
b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneApiMockTest.java
@@ -42,6 +42,7 @@ public class BaseOneAndOneApiMockTest {
 
    private static final OneAndOneProviderMetadata METADATA = new 
OneAndOneProviderMetadata();
    protected static final String AUTH_HEADER = "token";
+
    private static final String DEFAULT_ENDPOINT = METADATA.getEndpoint();
 
    private final Set<Module> modules = ImmutableSet.<Module>of(new 
ExecutorServiceModule(sameThreadExecutor()));

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/test/resources/image/get.json
----------------------------------------------------------------------
diff --git a/oneandone/src/test/resources/image/get.json 
b/oneandone/src/test/resources/image/get.json
new file mode 100644
index 0000000..f2fca10
--- /dev/null
+++ b/oneandone/src/test/resources/image/get.json
@@ -0,0 +1,31 @@
+{
+    "id": "842F09CAF954298C6A4BCD25E1CA3689",
+    "name": "My Image 2",
+    "datacenter": {
+        "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+        "location": "USA",
+        "country_code": "US"
+    },
+    "os_family": "Linux",
+    "os": "Centos",
+    "os_version": "Centos6",
+    "architecture": 64,
+    "os_image_type": "Personal",
+    "type": "MY_IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [],
+    "cloudpanel_id": "ap8962D_248",
+    "state": "ACTIVE",
+    "description": null,
+    "hdds": [
+        {
+            "id": "35AAD7EB668D7ECF58AF9413DB127BD3",
+            "size": 40,
+            "is_main": true
+        }
+    ],
+    "server_id": "CB8A023E99CE2026981A110018A00764",
+    "frequency": "ONCE",
+    "num_images": 1,
+    "creation_date": "2015-04-14T07:18:20+00:00"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/test/resources/image/list.json
----------------------------------------------------------------------
diff --git a/oneandone/src/test/resources/image/list.json 
b/oneandone/src/test/resources/image/list.json
new file mode 100644
index 0000000..9634a52
--- /dev/null
+++ b/oneandone/src/test/resources/image/list.json
@@ -0,0 +1,63 @@
+[
+    {
+        "id": "A0FAA4587A7CB6BBAA1EA877C844977E",
+        "name": "New image name",
+        "datacenter": {
+            "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+            "location": "USA",
+            "country_code": "US"
+        },
+        "os_family": "Linux",
+        "os": "Centos",
+        "os_version": "Centos7",
+        "architecture": 64,
+        "os_image_type": "Personal",
+        "type": "MY_IMAGE",
+        "min_hdd_size": 40,
+        "licenses": [],
+        "cloudpanel_id": "ap99AA4_1",
+        "state": "DEPLOYING",
+        "description": "New image description",
+        "hdds": [
+            {
+                "id": "200FC47388A30470A376913E73B9C32C",
+                "size": 40,
+                "is_main": true
+            }
+        ],
+        "server_id": "E83777750130E1111AA89623B9557CAF",
+        "frequency": "DAILY",
+        "num_images": 5,
+        "creation_date": "2015-04-29T07:46:40+00:00"
+    },
+    {
+        "id": "A0FAA4587A7CB6BBAA1EA877C844977F",
+        "name": "New image name 2",
+        "datacenter": {
+            "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+            "name": "United States"
+        },
+        "os_family": "Linux",
+        "os": "Centos",
+        "os_version": "Centos7",
+        "architecture": 64,
+        "os_image_type": "Personal",
+        "type": "MY_IMAGE",
+        "min_hdd_size": 40,
+        "licenses": [],
+        "cloudpanel_id": "ap99AA4_1",
+        "state": "DEPLOYING",
+        "description": "New image description",
+        "hdds": [
+            {
+                "id": "200FC47388A30470A376913E73B9C32D",
+                "size": 40,
+                "is_main": true
+            }
+        ],
+        "server_id": "E83777750130E1111AA89623B9557CAF",
+        "frequency": "DAILY",
+        "num_images": 5,
+        "creation_date": "2015-04-29T07:46:40+00:00"
+    }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f997b061/oneandone/src/test/resources/image/list.options.json
----------------------------------------------------------------------
diff --git a/oneandone/src/test/resources/image/list.options.json 
b/oneandone/src/test/resources/image/list.options.json
new file mode 100644
index 0000000..c0f946b
--- /dev/null
+++ b/oneandone/src/test/resources/image/list.options.json
@@ -0,0 +1,33 @@
+[
+    {
+        "id": "A0FAA4587A7CB6BBAA1EA877C844977E",
+        "name": "New image name",
+        "datacenter": {
+            "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+            "location": "USA",
+            "country_code": "US"
+        },
+        "os_family": "Linux",
+        "os": "Centos",
+        "os_version": "Centos7",
+        "architecture": 64,
+        "os_image_type": "Personal",
+        "type": "MY_IMAGE",
+        "min_hdd_size": 40,
+        "licenses": [],
+        "cloudpanel_id": "ap99AA4_1",
+        "state": "DEPLOYING",
+        "description": "New image description",
+        "hdds": [
+            {
+                "id": "200FC47388A30470A376913E73B9C32C",
+                "size": 40,
+                "is_main": true
+            }
+        ],
+        "server_id": "E83777750130E1111AA89623B9557CAF",
+        "frequency": "DAILY",
+        "num_images": 5,
+        "creation_date": "2015-04-29T07:46:40+00:00"
+    }
+]
\ No newline at end of file

Reply via email to