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

jclouds git commit: JCLOUDS-660: Implement AzureBlob set ACL

Repository: jclouds
Updated Branches:
  refs/heads/master d3c1e2eab -> 35d6313e6


JCLOUDS-660: Implement AzureBlob set ACL

Reference:

http://msdn.microsoft.com/en-us/library/azure/dd179391.aspx


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

Branch: refs/heads/master
Commit: 35d6313e63a3f6b6b40dda262b54369dbaab437f
Parents: d3c1e2e
Author: Andrew Gaul <ga...@apache.org>
Authored: Sat Jan 3 17:38:16 2015 -0800
Committer: Andrew Gaul <ga...@apache.org>
Committed: Fri Jan 9 14:05:05 2015 -0800

----------------------------------------------------------------------
 .../org/jclouds/azureblob/AzureBlobClient.java  | 12 +++++
 .../binders/BindPublicAccessToRequest.java      | 56 ++++++++++++++++++++
 .../azureblob/AzureBlobClientLiveTest.java      | 23 ++++++++
 .../jclouds/azureblob/AzureBlobClientTest.java  | 26 +++++++++
 4 files changed, 117 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/35d6313e/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java
----------------------------------------------------------------------
diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java
index a6e17c4..7223888 100644
--- a/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java
+++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java
@@ -45,6 +45,7 @@ import org.jclouds.azure.storage.reference.AzureStorageHeaders;
 import org.jclouds.azureblob.binders.BindAzureBlobMetadataToRequest;
 import org.jclouds.azureblob.binders.BindAzureBlobMetadataToMultipartRequest;
 import org.jclouds.azureblob.binders.BindAzureBlocksToRequest;
+import org.jclouds.azureblob.binders.BindPublicAccessToRequest;
 import org.jclouds.azureblob.domain.AzureBlob;
 import org.jclouds.azureblob.domain.BlobProperties;
 import org.jclouds.azureblob.domain.ContainerProperties;
@@ -221,6 +222,17 @@ public interface AzureBlobClient extends Closeable {
    PublicAccess getPublicAccessForContainer(
          @PathParam("container") @ParamValidators(ContainerNameValidator.class) String container);
 
+   /**
+    * Returns whether data in the container may be accessed publicly and the level of access
+    */
+   @Named("SetContainerACL")
+   @PUT
+   @Path("{container}")
+   @QueryParams(keys = { "restype", "comp" }, values = { "container", "acl" })
+   @ResponseParser(ParseETagHeader.class)
+   String setPublicAccessForContainer(
+         @PathParam("container") @ParamValidators(ContainerNameValidator.class) String container,
+         @BinderParam(BindPublicAccessToRequest.class) PublicAccess access);
 
    /**
     * The Delete Container operation marks the specified container for deletion. The container and

http://git-wip-us.apache.org/repos/asf/jclouds/blob/35d6313e/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindPublicAccessToRequest.java
----------------------------------------------------------------------
diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindPublicAccessToRequest.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindPublicAccessToRequest.java
new file mode 100644
index 0000000..c6d23fc
--- /dev/null
+++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindPublicAccessToRequest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.azureblob.binders;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.azureblob.domain.PublicAccess;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.Binder;
+
+@Singleton
+public final class BindPublicAccessToRequest implements Binder {
+
+   @Inject
+   public BindPublicAccessToRequest() {
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      checkNotNull(request, "request");
+      checkArgument(checkNotNull(input, "input") instanceof PublicAccess, "this binder is only valid for PublicAccess");
+      PublicAccess access = (PublicAccess) input;
+
+      switch (access) {
+      case PRIVATE:
+         // Without a header Azure sets the container to private access.
+         break;
+      default:
+         request = (R) request.toBuilder()
+               .replaceHeader("x-ms-blob-public-access", access.name().toLowerCase())
+               .build();
+         break;
+      }
+
+      return request;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/35d6313e/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
index 1930116..de8d90c 100644
--- a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
+++ b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
@@ -17,6 +17,7 @@
 package org.jclouds.azureblob;
 
 import static com.google.common.io.BaseEncoding.base16;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.jclouds.azure.storage.options.ListOptions.Builder.includeMetadata;
 import static org.jclouds.azureblob.options.CreateContainerOptions.Builder.withMetadata;
 import static org.jclouds.azureblob.options.CreateContainerOptions.Builder.withPublicAccess;
@@ -372,4 +373,26 @@ public class AzureBlobClientLiveTest extends BaseBlobStoreIntegrationTest {
       assertEquals(1, blocks.getBlocks().get(2).getContentLength());
       getApi().deleteContainer(blockContainer);
    }
+
+   @Test
+   public void testGetSetACL() throws Exception {
+      AzureBlobClient client = getApi();
+      String blockContainer = CONTAINER_PREFIX + new SecureRandom().nextInt();
+      client.createContainer(blockContainer);
+      try {
+         assertThat(client.getPublicAccessForContainer(blockContainer)).isEqualTo(PublicAccess.PRIVATE);
+
+         setAndVerifyACL(client, blockContainer, PublicAccess.CONTAINER);
+         setAndVerifyACL(client, blockContainer, PublicAccess.BLOB);
+         setAndVerifyACL(client, blockContainer, PublicAccess.PRIVATE);
+      } finally {
+         client.deleteContainer(blockContainer);
+      }
+   }
+
+   private static void setAndVerifyACL(AzureBlobClient client, String blockContainer, PublicAccess access)
+         throws Exception {
+      client.setPublicAccessForContainer(blockContainer, access);
+      assertThat(client.getPublicAccessForContainer(blockContainer)).isEqualTo(access);
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/35d6313e/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java
----------------------------------------------------------------------
diff --git a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java
index c738e45..18a266a 100644
--- a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java
+++ b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientTest.java
@@ -40,6 +40,7 @@ import org.jclouds.azureblob.xml.ContainerNameEnumerationResultsHandler;
 import org.jclouds.blobstore.BlobStoreFallbacks.NullOnContainerNotFound;
 import org.jclouds.blobstore.BlobStoreFallbacks.NullOnKeyNotFound;
 import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseETagHeader;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.http.functions.ReleasePayloadAndReturn;
 import org.jclouds.http.functions.ReturnTrueIf2xx;
@@ -232,6 +233,31 @@ public class AzureBlobClientTest extends BaseRestAnnotationProcessingTest<AzureB
       assertFallbackClassEquals(method, NullOnContainerNotFound.class);
    }
 
+   public void testSetPublicAccessForContainer() throws SecurityException, NoSuchMethodException, IOException {
+      setAndVerifyPublicAccessForContainer(PublicAccess.CONTAINER,
+            "x-ms-blob-public-access: container\n");
+      setAndVerifyPublicAccessForContainer(PublicAccess.BLOB,
+            "x-ms-blob-public-access: blob\n");
+      setAndVerifyPublicAccessForContainer(PublicAccess.PRIVATE,
+            "");
+   }
+
+   private void setAndVerifyPublicAccessForContainer(PublicAccess access, String expectedHeader) {
+      Invokable<?, ?> method = method(AzureBlobClient.class, "setPublicAccessForContainer", String.class, PublicAccess.class);
+      GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("container", access));
+
+      assertRequestLineEquals(request,
+               "PUT https://identity.blob.core.windows.net/container?restype=container&comp=acl HTTP/1.1");
+      assertNonPayloadHeadersEqual(request,
+               expectedHeader +
+               "x-ms-version: 2012-02-12\n");
+      assertPayloadEquals(request, null, null, false);
+
+      assertResponseParserClassEquals(method, request, ParseETagHeader.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertFallbackClassEquals(method, null);
+   }
+
    public void testSetResourceMetadata() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(AzureBlobClient.class, "setResourceMetadata", String.class, Map.class);
       GeneratedHttpRequest request = processor.createRequest(method,