You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2018/07/17 17:47:47 UTC

jclouds-labs git commit: JCLOUDS-1432 - handle RESOURCE_NOT_FOUND, do not expect 404 when assets not found

Repository: jclouds-labs
Updated Branches:
  refs/heads/master 4a9536b8c -> 2d9cb407e


JCLOUDS-1432 - handle RESOURCE_NOT_FOUND, do not expect 404 when assets not found


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

Branch: refs/heads/master
Commit: 2d9cb407e61b1568e2ce9a118bf8bc2c8a2c9855
Parents: 4a9536b
Author: FileIOUtility <no...@itaas.dimensiondata.com>
Authored: Tue Jul 17 14:28:37 2018 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Jul 17 10:47:39 2018 -0700

----------------------------------------------------------------------
 .../cloudcontrol/features/ServerApi.java        |  2 --
 .../DimensionDataCloudControlErrorHandler.java  | 26 +++++++++++-------
 .../features/ServerApiMockTest.java             | 28 +++++++++-----------
 .../BaseDimensionDataCloudControlMockTest.java  | 12 +++++++--
 4 files changed, 40 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2d9cb407/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java
----------------------------------------------------------------------
diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java
index 6338258..f6ba5c5 100644
--- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java
+++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApi.java
@@ -68,7 +68,6 @@ public interface ServerApi {
    @GET
    @Path("/server")
    @ResponseParser(ParseServers.class)
-   @Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
    PaginatedCollection<Server> listServers(DatacenterIdListFilters datacenterIdListFilters);
 
    @Named("server:list")
@@ -76,7 +75,6 @@ public interface ServerApi {
    @Path("/server")
    @Transform(ParseServers.ToPagedIterable.class)
    @ResponseParser(ParseServers.class)
-   @Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class)
    PagedIterable<Server> listServers();
 
    @Named("server:get")

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2d9cb407/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/handlers/DimensionDataCloudControlErrorHandler.java
----------------------------------------------------------------------
diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/handlers/DimensionDataCloudControlErrorHandler.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/handlers/DimensionDataCloudControlErrorHandler.java
index 1d65315..896d8be 100644
--- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/handlers/DimensionDataCloudControlErrorHandler.java
+++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/handlers/DimensionDataCloudControlErrorHandler.java
@@ -26,6 +26,8 @@ import org.jclouds.rest.ResourceNotFoundException;
 
 import javax.inject.Singleton;
 
+import java.util.ConcurrentModificationException;
+
 import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream;
 
 /**
@@ -47,16 +49,22 @@ public class DimensionDataCloudControlErrorHandler implements HttpErrorHandler {
             String.format("%s -> %s", command.getCurrentRequest().getRequestLine(), response.getStatusLine());
       switch (response.getStatusCode()) {
          case 400:
-            if (message.contains("RESOURCE_NOT_FOUND") || message.contains("OPERATION_NOT_SUPPORTED")) {
+            if (message.contains("RESOURCE_NOT_FOUND")) {
                exception = new ResourceNotFoundException(message, exception);
-            } else if (message.contains("INVALID_INPUT_DATA") || message.contains("ORGANIZATION_NOT_VERIFIED")
-                  || (message.contains("SYSTEM_ERROR") && !message.contains("RETRYABLE_SYSTEM_ERROR")) || message
-                  .contains("CPU_SPEED_NOT_AVAILABLE") || message.contains("CONFIGURATION_NOT_SUPPORTED")) {
+            } else if (message.contains("OPERATION_NOT_SUPPORTED")) {
+               exception = new UnsupportedOperationException(message, exception);
+            } else if (message.contains("RESOURCE_BUSY")) {
+               exception = new ConcurrentModificationException(message, exception);
+            } else if (message.contains("RESOURCE_LOCKED")) {
                exception = new IllegalStateException(message, exception);
-            } else if (message.contains("RESOURCE_BUSY") || message.contains("UNEXPECTED_ERROR")) {
-               exception = new ResourceNotFoundException(message, exception);
             } else if (message.contains("NAME_NOT_UNIQUE")) {
                exception = new ResourceAlreadyExistsException(message, exception);
+            } else if (message.contains("UNEXPECTED_ERROR")
+                  || message.contains("RETRYABLE_SYSTEM_ERROR")
+                  || message.contains("SYSTEM_ERROR")) {
+               break;
+            } else {
+               exception = new IllegalArgumentException(message, exception);
             }
             break;
          case 401:
@@ -66,9 +74,9 @@ public class DimensionDataCloudControlErrorHandler implements HttpErrorHandler {
             exception = new AuthorizationException(message, exception);
             break;
          case 404:
-            if (!command.getCurrentRequest().getMethod().equals("DELETE")) {
-               exception = new ResourceNotFoundException(message, exception);
-            }
+            // CloudControl uses error code 400 with RESOURCE_NOT_FOUND to report missing assets
+            // 404 means malformed URI only
+            exception = new IllegalArgumentException(message, exception);
             break;
       }
       command.setException(exception);

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2d9cb407/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java
----------------------------------------------------------------------
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java
index e396139..c8cd46d 100644
--- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/ServerApiMockTest.java
@@ -26,11 +26,10 @@ import org.jclouds.dimensiondata.cloudcontrol.domain.Server;
 import org.jclouds.dimensiondata.cloudcontrol.domain.options.CloneServerOptions;
 import org.jclouds.dimensiondata.cloudcontrol.domain.options.CreateServerOptions;
 import org.jclouds.dimensiondata.cloudcontrol.internal.BaseAccountAwareCloudControlMockTest;
+import org.jclouds.http.HttpResponseException;
 import org.jclouds.http.Uris;
-import org.jclouds.rest.ResourceNotFoundException;
 import org.testng.annotations.Test;
 
-import javax.ws.rs.HttpMethod;
 import java.util.List;
 
 import static javax.ws.rs.HttpMethod.GET;
@@ -39,6 +38,7 @@ import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
 import static org.jclouds.dimensiondata.cloudcontrol.options.DatacenterIdListFilters.Builder.datacenterId;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
 /**
@@ -55,8 +55,8 @@ public class ServerApiMockTest extends BaseAccountAwareCloudControlMockTest {
       try {
          serverApi().deployServer(ServerApiMockTest.class.getSimpleName(), "imageId", true, networkInfo,
                "administratorPassword");
-         failBecauseExceptionWasNotThrown(ResourceNotFoundException.class);
-      } catch (ResourceNotFoundException e) {
+         failBecauseExceptionWasNotThrown(HttpResponseException.class);
+      } catch (HttpResponseException e) {
          assertNotNull(e);
          assertSent(POST, "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/deployServer");
       }
@@ -121,10 +121,9 @@ public class ServerApiMockTest extends BaseAccountAwareCloudControlMockTest {
       return Uris.uriBuilder("/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/server");
    }
 
-   public void testListServers_404() throws Exception {
-      server.enqueue(response404());
-      assertTrue(serverApi().listServers().concat().isEmpty());
-      assertSent(HttpMethod.GET, getListServerUriBuilder().toString());
+   public void testListServers_NoServersFound() {
+      server.enqueue(emptyListResponse("server"));
+      assertTrue(serverApi().listServers().concat().isEmpty(), "should return empty list when no Servers found");
    }
 
    public void testGetServer() throws Exception {
@@ -135,10 +134,10 @@ public class ServerApiMockTest extends BaseAccountAwareCloudControlMockTest {
       assertNotNull(found.guest().vmTools());
    }
 
-   public void testGetServer_404() throws Exception {
-      server.enqueue(response404());
-      serverApi().getServer("12345");
-      assertSent(GET, "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/server/12345");
+   public void testGetServer_NotFound() {
+      server.enqueue(responseResourceNotFound());
+      Server foundServer = serverApi().getServer("12345");
+      assertNull(foundServer, "should return null when Server was not found");
    }
 
    public void testDeleteServer() throws Exception {
@@ -149,10 +148,9 @@ public class ServerApiMockTest extends BaseAccountAwareCloudControlMockTest {
       assertBodyContains(recordedRequest, "{\"id\":\"12345\"}");
    }
 
-   public void testDeleteServer_404() throws Exception {
-      server.enqueue(response404());
+   public void testDeleteServer_NotFound() {
+      server.enqueue(responseResourceNotFound());
       serverApi().deleteServer("12345");
-      assertSent(POST, "/caas/2.4/6ac1e746-b1ea-4da5-a24e-caf1a978789d/server/deleteServer");
    }
 
    public void testPowerOffServer() throws Exception {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2d9cb407/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java
----------------------------------------------------------------------
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java
index 72dfd2c..7ddba51 100644
--- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlMockTest.java
@@ -149,7 +149,7 @@ public class BaseDimensionDataCloudControlMockTest implements IHookable {
     */
    protected MockResponse responseUnexpectedError() {
       return new MockResponse().setResponseCode(400).setStatus("HTTP/1.1 400 Bad Request")
-            .setBody("content: [{\"operation\":\"OPERATION\",\"responseCode\":\"UNEXPECTED_ERROR\"}]");
+            .setBody("{\"operation\":\"OPERATION\",\"responseCode\":\"UNEXPECTED_ERROR\"}");
    }
 
    /**
@@ -159,13 +159,21 @@ public class BaseDimensionDataCloudControlMockTest implements IHookable {
     */
    protected MockResponse responseResourceNotFound() {
       return new MockResponse().setResponseCode(400).setStatus("HTTP/1.1 400 Bad Request")
-            .setBody("content: [{\"operation\":\"OPERATION\",\"responseCode\":\"RESOURCE_NOT_FOUND\"}]");
+            .setBody("{\"operation\":\"OPERATION\",\"responseCode\":\"RESOURCE_NOT_FOUND\"}");
    }
 
    protected MockResponse response404() {
       return new MockResponse().setStatus("HTTP/1.1 404 Not Found");
    }
 
+   protected MockResponse emptyListResponse(String assetName) {
+      return new MockResponse().setBody("{ \"" + assetName + "\": [],"
+            + " \"pageNumber\": 1,\n"
+            + " \"pageCount\": 0,\n"
+            + " \"totalCount\": 0,\n"
+            + " \"pageSize\": 250}");
+   }
+
    /**
     * Mocked OK 200 Response
     *