Repository: jclouds-examples Updated Branches: refs/heads/master 276f6caa0 -> cae84da83
Add glacier example Project: http://git-wip-us.apache.org/repos/asf/jclouds-examples/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-examples/commit/cae84da8 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-examples/tree/cae84da8 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-examples/diff/cae84da8 Branch: refs/heads/master Commit: cae84da833968ba930859201b00e6e97b78ef27b Parents: 276f6ca Author: Roman Coedo <[email protected]> Authored: Sun Aug 3 18:55:23 2014 +0200 Committer: Andrew Gaul <[email protected]> Committed: Sun Aug 10 23:26:47 2014 -0700 ---------------------------------------------------------------------- glacier/README.md | 17 ++ glacier/pom.xml | 79 ++++++ .../src/main/assembly/jar-with-dependencies.xml | 42 ++++ .../org/jclouds/examples/glacier/MainApp.java | 238 +++++++++++++++++++ 4 files changed, 376 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-examples/blob/cae84da8/glacier/README.md ---------------------------------------------------------------------- diff --git a/glacier/README.md b/glacier/README.md new file mode 100755 index 0000000..823f4f1 --- /dev/null +++ b/glacier/README.md @@ -0,0 +1,17 @@ +# Glacier + +This is a simple example using the Glacier provider and BlobStore. + +## Run + +Invoke the jar, passing the identity and the credential. + +Example: + +java -jar target/glacier-jar-with-dependencies.jar accesskey secretkey + +## License + +Copyright (C) 2009-2014 The Apache Software Foundation + +Licensed under the Apache License, Version 2.0 http://git-wip-us.apache.org/repos/asf/jclouds-examples/blob/cae84da8/glacier/pom.xml ---------------------------------------------------------------------- diff --git a/glacier/pom.xml b/glacier/pom.xml new file mode 100644 index 0000000..f0e6782 --- /dev/null +++ b/glacier/pom.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + 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. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>org.apache.jclouds.examples</groupId> + <artifactId>glacier</artifactId> + <version>1.8.0</version> + <name>glacier</name> + + <dependencies> + <dependency> + <groupId>org.apache.jclouds.labs</groupId> + <artifactId>glacier</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + <build> + <finalName>${project.artifactId}</finalName> + <plugins> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>2.4</version> + <configuration> + <archive> + <manifest> + <mainClass>org.jclouds.examples.glacier.MainApp</mainClass> + </manifest> + </archive> + </configuration> + </plugin> + + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <version>2.2.1</version> + <configuration> + <descriptors> + <descriptor>src/main/assembly/jar-with-dependencies.xml</descriptor> + </descriptors> + <archive> + <manifest> + <mainClass>org.jclouds.examples.glacier.MainApp</mainClass> + </manifest> + </archive> + </configuration> + <executions> + <execution> + <id>make-assembly</id> + <phase>package</phase> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + + </build> + +</project> http://git-wip-us.apache.org/repos/asf/jclouds-examples/blob/cae84da8/glacier/src/main/assembly/jar-with-dependencies.xml ---------------------------------------------------------------------- diff --git a/glacier/src/main/assembly/jar-with-dependencies.xml b/glacier/src/main/assembly/jar-with-dependencies.xml new file mode 100644 index 0000000..f0ea9bc --- /dev/null +++ b/glacier/src/main/assembly/jar-with-dependencies.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + 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. + +--> +<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> + <!-- copied from jar-with-dependencies (http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html#jar-with-dependencies) --> + <id>jar-with-dependencies</id> + <formats> + <format>jar</format> + </formats> + <includeBaseDirectory>false</includeBaseDirectory> + <containerDescriptorHandlers> + <containerDescriptorHandler> + <handlerName>metaInf-services</handlerName> + </containerDescriptorHandler> + </containerDescriptorHandlers> + <dependencySets> + <dependencySet> + <outputDirectory>/</outputDirectory> + <useProjectArtifact>true</useProjectArtifact> + <unpack>true</unpack> + <scope>runtime</scope> + </dependencySet> + </dependencySets> +</assembly> http://git-wip-us.apache.org/repos/asf/jclouds-examples/blob/cae84da8/glacier/src/main/java/org/jclouds/examples/glacier/MainApp.java ---------------------------------------------------------------------- diff --git a/glacier/src/main/java/org/jclouds/examples/glacier/MainApp.java b/glacier/src/main/java/org/jclouds/examples/glacier/MainApp.java new file mode 100755 index 0000000..d694312 --- /dev/null +++ b/glacier/src/main/java/org/jclouds/examples/glacier/MainApp.java @@ -0,0 +1,238 @@ +/* + * 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.examples.glacier; + +import static com.google.common.net.MediaType.PLAIN_TEXT_UTF_8; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.InputMismatchException; +import java.util.Scanner; +import java.util.UUID; + +import org.jclouds.ContextBuilder; +import org.jclouds.blobstore.BlobStore; +import org.jclouds.blobstore.BlobStoreContext; +import org.jclouds.blobstore.domain.Blob; +import org.jclouds.blobstore.options.PutOptions; +import org.jclouds.glacier.GlacierClient; +import org.jclouds.glacier.blobstore.strategy.internal.BasePollingStrategy; +import org.jclouds.glacier.domain.ArchiveRetrievalJobRequest; +import org.jclouds.glacier.domain.JobRequest; +import org.jclouds.io.ByteSources; +import org.jclouds.io.Payload; +import org.jclouds.io.payloads.ByteSourcePayload; +import org.jclouds.util.Strings2; + +import com.google.common.base.Charsets; +import com.google.common.base.Throwables; +import com.google.common.io.ByteSource; +import com.google.common.io.CharStreams; + +/** + * Demonstrates the use of Glacier provider and BlobStore. + * + * Usage is: java MainApp "identity" "credential" + */ +public class MainApp { + private static final long MiB = 1L << 20; + + public static void main(String[] args) throws IOException { + if (args.length < 2) { + throw new IllegalArgumentException("Invalid number of parameters. Syntax is: \"identity\" \"credential\""); + } + + String identity = args[0]; + String credentials = args[1]; + + // Init + BlobStoreContext context = ContextBuilder.newBuilder("glacier") + .credentials(identity, credentials) + .buildView(BlobStoreContext.class); + + try { + while (chooseOption(context)); + } finally { + context.close(); + } + } + + private static void putAndRetrieveBlobExample(BlobStore blobstore) throws IOException { + // Create a container + String containerName = "jclouds_putAndRetrieveBlobExample_" + UUID.randomUUID().toString(); + blobstore.createContainerInLocation(null, containerName); // Create a vault + + // Create a blob + ByteSource payload = ByteSource.wrap("data".getBytes(Charsets.UTF_8)); + Blob blob = blobstore.blobBuilder("ignored") // The blob name is ignored in Glacier + .payload(payload) + .contentLength(payload.size()) + .build(); + + // Put the blob in the container + String blobId = blobstore.putBlob(containerName, blob); + + // Retrieve the blob + Blob result = blobstore.getBlob(containerName, blobId); + + // Print the result + InputStream is = result.getPayload().openStream(); + try { + String data = CharStreams.toString(new InputStreamReader(is, Charsets.UTF_8)); + System.out.println("The retrieved payload is: " + data); + } finally { + is.close(); + } + } + + private static void multipartUploadExample(BlobStore blobstore) throws IOException { + // Create a container + String containerName = "jclouds_multipartUploadExample_" + UUID.randomUUID().toString(); + blobstore.createContainerInLocation(null, containerName); // Create a vault + + // Create a blob + ByteSource payload = buildData(16 * MiB); + Blob blob = blobstore.blobBuilder("ignored") // The blob name is ignored in Glacier + .payload(payload) + .contentLength(payload.size()) + .build(); + + // Create the PutOptions + PutOptions options = PutOptions.Builder.multipart(true); + + // Put the blob in the container + blobstore.putBlob(containerName, blob, options); + System.out.println("The blob has been uploaded"); + } + + private static void interruptionExample(final BlobStore blobstore) throws IOException { + // Create a container + final String containerName = "jclouds_interruptionExample_" + UUID.randomUUID().toString(); + blobstore.createContainerInLocation(null, containerName); // Create a vault + + // Create a blob + ByteSource payload = ByteSource.wrap("data".getBytes(Charsets.UTF_8)); + Blob blob = blobstore.blobBuilder("ignored") // The blob name is ignored in Glacier + .payload(payload) + .contentLength(payload.size()) + .build(); + + // Put the blob in the container + final String blobId = blobstore.putBlob(containerName, blob); + + // New thread + Thread thread = new Thread() { + public void run() { + try { + blobstore.getBlob(containerName, blobId); + } catch (RuntimeException e) { + System.out.println("The request was aborted"); + } + } + }; + + // Start and interrupt the thread + thread.start(); + thread.interrupt(); + try { + thread.join(); + } catch (InterruptedException e) { + Throwables.propagate(e); + } + } + + private static void providerExample(BlobStoreContext context) throws IOException { + // Get the provider API + GlacierClient client = context.unwrapApi(GlacierClient.class); + + // Create a vault + final String vaultName = "jclouds_providerExample_" + UUID.randomUUID().toString(); + client.createVault(vaultName); + + // Upload an archive + Payload payload = new ByteSourcePayload(buildData(16)); + payload.getContentMetadata().setContentType(PLAIN_TEXT_UTF_8.toString()); + payload.getContentMetadata().setContentLength(16L); + String archiveId = client.uploadArchive(vaultName, payload); + + // Create an archive retrieval job request + JobRequest archiveRetrievalJobRequest = ArchiveRetrievalJobRequest.builder() + .archiveId(archiveId) + .description("retrieval job") + .build(); + + // Initiate job + String jobId = client.initiateJob(vaultName, archiveRetrievalJobRequest); + try { + // Poll until the job is done + new BasePollingStrategy(client).waitForSuccess(vaultName, jobId); + + // Get the job output + Payload result = client.getJobOutput(vaultName, jobId); + + // Print the result + System.out.println("The retrieved payload is: " + Strings2.toStringAndClose(result.openStream())); + } catch (InterruptedException e) { + Throwables.propagate(e); + } + } + + public static boolean chooseOption(BlobStoreContext context) throws IOException { + Scanner scan = new Scanner(System.in); + System.out.println(""); + System.out.println("Glacier examples"); + System.out.println("1. Put and retrieve blob (~4-5 hours)"); + System.out.println("2. Multipart upload (~1-5 minutes)"); + System.out.println("3. Call interruption (~0-2 minutes)"); + System.out.println("4. Provider API (~4-5 hours)"); + System.out.println("5. Exit"); + System.out.print("Choose an option: "); + try{ + switch(scan.nextInt()){ + case 1: + putAndRetrieveBlobExample(context.getBlobStore()); + break; + case 2: + multipartUploadExample(context.getBlobStore()); + break; + case 3: + interruptionExample(context.getBlobStore()); + break; + case 4: + providerExample(context); + break; + case 5: + return false; + default: + System.out.println("Not a valid option"); + break; + } + } + catch(InputMismatchException e) { + System.out.println("Not a valid option"); + } + return true; + } + + private static ByteSource buildData(long size) { + byte[] array = new byte[1024]; + Arrays.fill(array, (byte) 'a'); + return ByteSources.repeatingArrayByteSource(array).slice(0, size); + } +}
