You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ad...@apache.org on 2013/10/01 00:33:33 UTC

git commit: JCLOUDS-311. work around mixed versions in hpcloud-objectstorage regions

Updated Branches:
  refs/heads/master f1fc63ab7 -> 6eda031e2


JCLOUDS-311. work around mixed versions in hpcloud-objectstorage regions


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

Branch: refs/heads/master
Commit: 6eda031e27acaf37e4154bd3217f84f00edf166f
Parents: f1fc63a
Author: Adrian Cole <ad...@gmail.com>
Authored: Mon Sep 30 15:11:31 2013 -0700
Committer: Adrian Cole <ad...@gmail.com>
Committed: Mon Sep 30 15:33:23 2013 -0700

----------------------------------------------------------------------
 providers/hpcloud-objectstorage/pom.xml         |  5 ++
 .../HPCloudObjectStorageApiMetadata.java        | 31 ++++++-
 .../HPCloudObjectStorageApiMockTest.java        | 87 ++++++++++++++++++++
 .../BaseHPCloudObjectStorageMockTest.java       | 86 +++++++++++++++++++
 4 files changed, 207 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/6eda031e/providers/hpcloud-objectstorage/pom.xml
----------------------------------------------------------------------
diff --git a/providers/hpcloud-objectstorage/pom.xml b/providers/hpcloud-objectstorage/pom.xml
index 7ab1b3f..4abdcad 100644
--- a/providers/hpcloud-objectstorage/pom.xml
+++ b/providers/hpcloud-objectstorage/pom.xml
@@ -93,6 +93,11 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>com.google.mockwebserver</groupId>
+      <artifactId>mockwebserver</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>log4j</groupId>
       <artifactId>log4j</artifactId>
       <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/6eda031e/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/HPCloudObjectStorageApiMetadata.java
----------------------------------------------------------------------
diff --git a/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/HPCloudObjectStorageApiMetadata.java b/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/HPCloudObjectStorageApiMetadata.java
index a2027d6..68ad6a6 100644
--- a/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/HPCloudObjectStorageApiMetadata.java
+++ b/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/HPCloudObjectStorageApiMetadata.java
@@ -16,22 +16,28 @@
  */
 package org.jclouds.hpcloud.objectstorage;
 
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.SERVICE_TYPE;
 import static org.jclouds.rest.config.BinderUtils.bindSyncToAsyncHttpApi;
 
 import java.net.URI;
 import java.util.Properties;
 
+import javax.inject.Named;
+
 import org.jclouds.blobstore.BlobRequestSigner;
 import org.jclouds.hpcloud.objectstorage.blobstore.HPCloudObjectStorageBlobRequestSigner;
 import org.jclouds.hpcloud.objectstorage.blobstore.config.HPCloudObjectStorageBlobStoreContextModule;
 import org.jclouds.hpcloud.objectstorage.config.HPCloudObjectStorageRestClientModule;
-import org.jclouds.openstack.keystone.v2_0.config.MappedAuthenticationApiModule;
+import org.jclouds.location.suppliers.RegionIdToURISupplier;
 import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.RegionModule;
+import org.jclouds.openstack.keystone.v2_0.config.MappedAuthenticationApiModule;
+import org.jclouds.openstack.keystone.v2_0.suppliers.RegionIdToAdminURISupplier;
 import org.jclouds.openstack.swift.SwiftKeystoneApiMetadata;
 import org.jclouds.openstack.swift.blobstore.config.TemporaryUrlExtensionModule;
 import org.jclouds.openstack.swift.config.SwiftRestClientModule.KeystoneStorageEndpointModule;
 import org.jclouds.openstack.swift.extensions.KeystoneTemporaryUrlKeyAsyncApi;
 import org.jclouds.openstack.swift.extensions.TemporaryUrlKeyApi;
+import org.jclouds.rest.annotations.ApiVersion;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.reflect.TypeToken;
@@ -84,7 +90,7 @@ public class HPCloudObjectStorageApiMetadata extends SwiftKeystoneApiMetadata {
          .defaultModules(ImmutableSet.<Class<? extends Module>>builder()
                                      .add(MappedAuthenticationApiModule.class)
                                      .add(KeystoneStorageEndpointModule.class)
-                                     .add(RegionModule.class)
+                                     .add(IgnoreRegionVersionsModule.class)
                                      .add(HPCloudObjectStorageRestClientModule.class)
                                      .add(HPCloudObjectStorageBlobStoreContextModule.class)
                                      .add(HPCloudObjectStorageTemporaryUrlExtensionModule.class).build());
@@ -115,4 +121,25 @@ public class HPCloudObjectStorageApiMetadata extends SwiftKeystoneApiMetadata {
          bindSyncToAsyncHttpApi(binder(), TemporaryUrlKeyApi.class, KeystoneTemporaryUrlKeyAsyncApi.class);
       }
    }
+
+   /**
+    * Use this when the keystone configuration incorrectly mismatches api
+    * versions across regions.
+    */
+   public static class IgnoreRegionVersionsModule extends RegionModule {
+
+      @Override
+      protected RegionIdToURISupplier provideRegionIdToURISupplierForApiVersion(
+            @Named(SERVICE_TYPE) String serviceType, @ApiVersion String apiVersion,
+            RegionIdToURISupplier.Factory factory) {
+         return factory.createForApiTypeAndVersion(serviceType, null);
+      }
+
+      @Override
+      protected RegionIdToAdminURISupplier provideRegionIdToAdminURISupplierForApiVersion(
+            @Named(SERVICE_TYPE) String serviceType, @ApiVersion String apiVersion,
+            RegionIdToAdminURISupplier.Factory factory) {
+         return factory.createForApiTypeAndVersion(serviceType, null);
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/6eda031e/providers/hpcloud-objectstorage/src/test/java/org/jclouds/hpcloud/objectstorage/HPCloudObjectStorageApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/hpcloud-objectstorage/src/test/java/org/jclouds/hpcloud/objectstorage/HPCloudObjectStorageApiMockTest.java b/providers/hpcloud-objectstorage/src/test/java/org/jclouds/hpcloud/objectstorage/HPCloudObjectStorageApiMockTest.java
new file mode 100644
index 0000000..8b0be06
--- /dev/null
+++ b/providers/hpcloud-objectstorage/src/test/java/org/jclouds/hpcloud/objectstorage/HPCloudObjectStorageApiMockTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.jclouds.hpcloud.objectstorage;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.hpcloud.objectstorage.internal.BaseHPCloudObjectStorageMockTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.mockwebserver.MockResponse;
+import com.google.mockwebserver.MockWebServer;
+import com.google.mockwebserver.RecordedRequest;
+
+@Test
+public class HPCloudObjectStorageApiMockTest extends BaseHPCloudObjectStorageMockTest {
+
+   String mixedSwiftVersions = "" //
+         + "{\"access\": {\n" //
+         + "  \"token\": {\n" //
+         + "    \"expires\": \"2013-10-01T09:16:20.177Z\",\n" //
+         + "    \"id\": \"HPAuth10_1234567890\",\n" //
+         + "    \"tenant\": {\n" //
+         + "      \"id\": \"12345678\",\n" //
+         + "      \"name\": \"jclouds-project\"\n" //
+         + "    }\n" //
+         + "  },\n" //
+         + "  \"user\": {\n" //
+         + "    \"id\": \"12345678\",\n" //
+         + "    \"name\": \"jclouds\"\n" //
+         + "  },\n" //
+         + "  \"serviceCatalog\": [\n" //
+         + "    {\n" //
+         + "      \"name\": \"Object Storage\",\n" //
+         + "      \"type\": \"object-store\",\n" //
+         + "      \"endpoints\": [\n" //
+         + "        {\n" //
+         + "          \"tenantId\": \"12345678\",\n" //
+         + "          \"publicURL\": \"URL\\/v1\\/12345678\",\n" //
+         + "          \"region\": \"region-a.geo-1\",\n" //
+         + "          \"versionId\": \"1.0\",\n" //
+         + "          \"versionInfo\": \"URL\\/v1.0\\/\",\n" //
+         + "          \"versionList\": \"URL\"\n" //
+         + "        },\n" //
+         + "        {\n" //
+         + "          \"tenantId\": \"12345678\",\n" //
+         + "          \"publicURL\": \"URL\\/v1\\/12345678\",\n" //
+         + "          \"region\": \"region-b.geo-1\",\n" //
+         + "          \"versionId\": \"1\",\n" //
+         + "          \"versionInfo\": \"URL\\/v1\\/\",\n" //
+         + "          \"versionList\": \"URL\"\n" //
+         + "      }]\n" //
+         + "    }\n" //
+         + "  ]\n" //
+         + "}}";
+
+   public void mixedVersionsInRegions() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(mixedSwiftVersions));
+      try {
+
+         HPCloudObjectStorageApi api = api(server.getUrl("/").toString());
+
+         assertEquals(api.getConfiguredRegions(), ImmutableSet.of("region-a.geo-1", "region-b.geo-1"));
+
+         assertEquals(server.getRequestCount(), 1);
+         RecordedRequest authRequest = server.takeRequest();
+         assertEquals(authRequest.getRequestLine(), "POST /tokens HTTP/1.1");
+      } finally {
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/6eda031e/providers/hpcloud-objectstorage/src/test/java/org/jclouds/hpcloud/objectstorage/internal/BaseHPCloudObjectStorageMockTest.java
----------------------------------------------------------------------
diff --git a/providers/hpcloud-objectstorage/src/test/java/org/jclouds/hpcloud/objectstorage/internal/BaseHPCloudObjectStorageMockTest.java b/providers/hpcloud-objectstorage/src/test/java/org/jclouds/hpcloud/objectstorage/internal/BaseHPCloudObjectStorageMockTest.java
new file mode 100644
index 0000000..67772a0
--- /dev/null
+++ b/providers/hpcloud-objectstorage/src/test/java/org/jclouds/hpcloud/objectstorage/internal/BaseHPCloudObjectStorageMockTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.jclouds.hpcloud.objectstorage.internal;
+
+import static com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor;
+import static org.jclouds.Constants.PROPERTY_MAX_RETRIES;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.concurrent.config.ExecutorServiceModule;
+import org.jclouds.hpcloud.objectstorage.HPCloudObjectStorageApi;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
+import com.google.mockwebserver.MockResponse;
+import com.google.mockwebserver.MockWebServer;
+import com.google.mockwebserver.QueueDispatcher;
+import com.google.mockwebserver.RecordedRequest;
+
+public class BaseHPCloudObjectStorageMockTest {
+
+   public static HPCloudObjectStorageApi api(String uri) {
+      Properties overrides = new Properties();
+      overrides.setProperty(PROPERTY_MAX_RETRIES, "1");
+
+      return ContextBuilder.newBuilder("hpcloud-objectstorage") //
+            .credentials("jclouds:joe", "letmein") //
+            .endpoint(uri) //
+            .overrides(overrides) //
+            .modules(ImmutableSet.<Module> of(new ExecutorServiceModule(sameThreadExecutor(), sameThreadExecutor()))) //
+            .buildApi(HPCloudObjectStorageApi.class);
+   }
+
+   public static MockWebServer mockWebServer() throws IOException {
+      MockWebServer server = new MockWebServer();
+      server.play();
+      URL url = server.getUrl("");
+      server.setDispatcher(getURLReplacingQueueDispatcher(url));
+      return server;
+   }
+
+   /**
+    * there's no built-in way to defer evaluation of a response header, hence
+    * this method, which allows us to send back links to the mock server.
+    */
+   public static QueueDispatcher getURLReplacingQueueDispatcher(final URL url) {
+      final QueueDispatcher dispatcher = new QueueDispatcher() {
+         protected final BlockingQueue<MockResponse> responseQueue = new LinkedBlockingQueue<MockResponse>();
+
+         @Override
+         public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
+            MockResponse response = responseQueue.take();
+            if (response.getBody() != null) {
+               String newBody = new String(response.getBody()).replace(":\"URL", ":\"" + url.toString());
+               response = response.setBody(newBody);
+            }
+            return response;
+         }
+
+         @Override
+         public void enqueueResponse(MockResponse response) {
+            responseQueue.add(response);
+         }
+      };
+      return dispatcher;
+   }
+}