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,