Updated Branches: refs/heads/master 11fbcaacd -> af428a52d
Add --signed-url option to blob read and write This will allow future automation to script jclouds-cli and visualize conformance of various optional features and semantic quirks. Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-karaf/commit/af428a52 Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-karaf/tree/af428a52 Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-karaf/diff/af428a52 Branch: refs/heads/master Commit: af428a52d58ba543e096646a5b1fd54bd660b38b Parents: 11fbcaa Author: Andrew Gaul <[email protected]> Authored: Mon Jul 15 23:07:59 2013 -0700 Committer: Andrew Gaul <[email protected]> Committed: Thu Jul 18 18:09:31 2013 -0700 ---------------------------------------------------------------------- .../commands/blobstore/BlobReadCommand.java | 5 ++- .../blobstore/BlobStoreCommandBase.java | 33 ++++++++++++++++++-- .../commands/blobstore/BlobWriteCommand.java | 6 +++- 3 files changed, 39 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-jclouds-karaf/blob/af428a52/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobReadCommand.java ---------------------------------------------------------------------- diff --git a/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobReadCommand.java b/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobReadCommand.java index 51dfa58..2b3d705 100644 --- a/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobReadCommand.java +++ b/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobReadCommand.java @@ -52,11 +52,14 @@ public class BlobReadCommand extends BlobStoreCommandWithOptions { @Option(name = "-d", aliases = "--display", description = "Display the content to the console", required = false, multiValued = false) boolean display; + @Option(name = "-S", aliases = "--signed-request", description = "Use a signed request", required = false, multiValued = false) + boolean signedRequest; + @Override protected Object doExecute() throws Exception { BlobStore blobStore = getBlobStore(); - InputSupplier<InputStream> supplier = getBlobInputStream(blobStore, containerName, blobName); + InputSupplier<InputStream> supplier = getBlobInputStream(blobStore, containerName, blobName, signedRequest); if (display) { CharStreams.copy(CharStreams.newReaderSupplier(supplier, Charsets.UTF_8), System.out); http://git-wip-us.apache.org/repos/asf/incubator-jclouds-karaf/blob/af428a52/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobStoreCommandBase.java ---------------------------------------------------------------------- diff --git a/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobStoreCommandBase.java b/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobStoreCommandBase.java index d59d079..fd9d349 100644 --- a/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobStoreCommandBase.java +++ b/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobStoreCommandBase.java @@ -23,15 +23,19 @@ import org.apache.felix.service.command.CommandSession; import org.apache.karaf.shell.console.AbstractAction; import org.jclouds.apis.ApiMetadata; import org.jclouds.blobstore.BlobStore; +import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.ContainerNotFoundException; import org.jclouds.blobstore.KeyNotFoundException; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.options.PutOptions; import org.jclouds.blobstore.util.BlobStoreUtils; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; import org.jclouds.karaf.cache.BasicCacheProvider; import org.jclouds.karaf.cache.CacheProvider; import org.jclouds.karaf.core.Constants; import org.jclouds.providers.ProviderMetadata; +import org.jclouds.rest.HttpClient; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.slf4j.Logger; @@ -120,8 +124,20 @@ public abstract class BlobStoreCommandBase extends AbstractAction { * @param blobName * @return */ - public InputSupplier<InputStream> getBlobInputStream(BlobStore blobStore, String containerName, String blobName) + public InputSupplier<InputStream> getBlobInputStream(BlobStore blobStore, String containerName, String blobName, boolean signedRequest) throws Exception { + if (signedRequest) { + BlobStoreContext context = blobStore.getContext(); + HttpRequest request = context.getSigner().signGetBlob(containerName, blobName); + HttpClient httpClient = context.utils().http(); + HttpResponse response = httpClient.invoke(request); + int statusCode = response.getStatusCode(); + if (statusCode != 200) { + throw new IOException(response.getStatusLine()); + } + return response.getPayload(); + } + Blob blob = blobStore.getBlob(containerName, blobName); if (blob == null) { if (!blobStore.containerExists(containerName)) { @@ -141,7 +157,7 @@ public abstract class BlobStoreCommandBase extends AbstractAction { * @param blob * @param options */ - public void write(BlobStore blobStore, String bucket, String blobName, Blob blob, PutOptions options) throws Exception { + public void write(BlobStore blobStore, String bucket, String blobName, Blob blob, PutOptions options, boolean signedRequest) throws Exception { if (blobName.contains("/")) { String directory = BlobStoreUtils.parseDirectoryFromPath(blobName); if (!Strings.isNullOrEmpty(directory)) { @@ -149,7 +165,18 @@ public abstract class BlobStoreCommandBase extends AbstractAction { } } - blobStore.putBlob(bucket, blob, options); + if (signedRequest) { + BlobStoreContext context = blobStore.getContext(); + HttpRequest request = context.getSigner().signPutBlob(bucket, blob); + HttpClient httpClient = context.utils().http(); + HttpResponse response = httpClient.invoke(request); + int statusCode = response.getStatusCode(); + if (statusCode != 200 && statusCode != 201) { + throw new IOException(response.getStatusLine()); + } + } else { + blobStore.putBlob(bucket, blob, options); + } } protected void printBlobStoreProviders(Iterable<ProviderMetadata> providers, List<BlobStore> blobStores, http://git-wip-us.apache.org/repos/asf/incubator-jclouds-karaf/blob/af428a52/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobWriteCommand.java ---------------------------------------------------------------------- diff --git a/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobWriteCommand.java b/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobWriteCommand.java index 8d84fd0..490ea17 100644 --- a/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobWriteCommand.java +++ b/commands/src/main/java/org/jclouds/karaf/commands/blobstore/BlobWriteCommand.java @@ -55,6 +55,9 @@ public class BlobWriteCommand extends BlobStoreCommandWithOptions { @Option(name = "-m", aliases = "--multipart-upload", description = "Use multi-part upload", required = false, multiValued = false) boolean multipartUpload; + @Option(name = "-S", aliases = "--signed-request", description = "Use a signed request", required = false, multiValued = false) + boolean signedRequest; + @Override protected Object doExecute() throws Exception { BlobStore blobStore = getBlobStore(); @@ -78,7 +81,8 @@ public class BlobWriteCommand extends BlobStoreCommandWithOptions { } PutOptions options = multipartUpload ? new PutOptions().multipart(true) : PutOptions.NONE; - write(blobStore, containerName, blobName, builder.build(), options); + + write(blobStore, containerName, blobName, builder.build(), options, signedRequest); cacheProvider.getProviderCacheForType("container").put(blobStore.getContext().unwrap().getId(), containerName); cacheProvider.getProviderCacheForType("blob").put(blobStore.getContext().unwrap().getId(), blobName);
