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 2014/06/28 01:57:59 UTC

git commit: JCLOUDS-457: Added listJobs operation

Repository: jclouds-labs-aws
Updated Branches:
  refs/heads/master 71f1fb115 -> 174b62b55


JCLOUDS-457: Added listJobs operation

Now the Glacier client supports the listJobs operation.


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/commit/174b62b5
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/tree/174b62b5
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/diff/174b62b5

Branch: refs/heads/master
Commit: 174b62b551cd5f80099c1a79301eff6cee87e6dd
Parents: 71f1fb1
Author: Roman C. Coedo <ro...@gmail.com>
Authored: Wed Jun 25 22:13:28 2014 +0200
Committer: Andrew Gaul <ga...@apache.org>
Committed: Fri Jun 27 16:57:15 2014 -0700

----------------------------------------------------------------------
 .../org/jclouds/glacier/GlacierAsyncClient.java | 23 ++++++++
 .../java/org/jclouds/glacier/GlacierClient.java | 18 ++++++
 .../glacier/domain/PaginatedJobCollection.java  | 58 ++++++++++++++++++++
 .../ParseJobMetadataListFromHttpContent.java    | 35 ++++++++++++
 .../jclouds/glacier/GlacierClientMockTest.java  | 17 ++++++
 .../resources/json/listJobsResponseBody.json    | 41 ++++++++++++++
 6 files changed, 192 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/174b62b5/glacier/src/main/java/org/jclouds/glacier/GlacierAsyncClient.java
----------------------------------------------------------------------
diff --git a/glacier/src/main/java/org/jclouds/glacier/GlacierAsyncClient.java b/glacier/src/main/java/org/jclouds/glacier/GlacierAsyncClient.java
index bacf13c..c3cee5b 100644
--- a/glacier/src/main/java/org/jclouds/glacier/GlacierAsyncClient.java
+++ b/glacier/src/main/java/org/jclouds/glacier/GlacierAsyncClient.java
@@ -42,6 +42,7 @@ import org.jclouds.glacier.binders.BindPartSizeToHeaders;
 import org.jclouds.glacier.domain.JobMetadata;
 import org.jclouds.glacier.domain.JobRequest;
 import org.jclouds.glacier.domain.MultipartUploadMetadata;
+import org.jclouds.glacier.domain.PaginatedJobCollection;
 import org.jclouds.glacier.domain.PaginatedMultipartUploadCollection;
 import org.jclouds.glacier.domain.PaginatedVaultCollection;
 import org.jclouds.glacier.domain.VaultMetadata;
@@ -50,6 +51,7 @@ import org.jclouds.glacier.filters.RequestAuthorizeSignature;
 import org.jclouds.glacier.functions.ParseArchiveIdHeader;
 import org.jclouds.glacier.functions.ParseJobIdHeader;
 import org.jclouds.glacier.functions.ParseJobMetadataFromHttpContent;
+import org.jclouds.glacier.functions.ParseJobMetadataListFromHttpContent;
 import org.jclouds.glacier.functions.ParseMultipartUploadIdHeader;
 import org.jclouds.glacier.functions.ParseMultipartUploadListFromHttpContent;
 import org.jclouds.glacier.functions.ParseMultipartUploadPartListFromHttpContent;
@@ -290,4 +292,25 @@ public interface GlacierAsyncClient extends Closeable {
    ListenableFuture<JobMetadata> describeJob(
          @ParamValidators(VaultNameValidator.class) @PathParam("vault") String vaultName,
          @PathParam("job") String jobId);
+
+   /**
+    * @see GlacierClient#listJobs(PaginationOptions)
+    */
+   @Named("ListJobs")
+   @GET
+   @Path("/-/vaults/{vault}/jobs")
+   @ResponseParser(ParseJobMetadataListFromHttpContent.class)
+   ListenableFuture<PaginatedJobCollection> listJobs(
+         @ParamValidators(VaultNameValidator.class) @PathParam("vault") String vaultName,
+         PaginationOptions options);
+
+   /**
+    * @see GlacierClient#listJobs
+    */
+   @Named("ListJobs")
+   @GET
+   @Path("/-/vaults/{vault}/jobs")
+   @ResponseParser(ParseJobMetadataListFromHttpContent.class)
+   ListenableFuture<PaginatedJobCollection> listJobs(
+         @ParamValidators(VaultNameValidator.class) @PathParam("vault") String vaultName);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/174b62b5/glacier/src/main/java/org/jclouds/glacier/GlacierClient.java
----------------------------------------------------------------------
diff --git a/glacier/src/main/java/org/jclouds/glacier/GlacierClient.java b/glacier/src/main/java/org/jclouds/glacier/GlacierClient.java
index 20c2fdd..ab8d694 100644
--- a/glacier/src/main/java/org/jclouds/glacier/GlacierClient.java
+++ b/glacier/src/main/java/org/jclouds/glacier/GlacierClient.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.jclouds.glacier.domain.JobMetadata;
 import org.jclouds.glacier.domain.JobRequest;
 import org.jclouds.glacier.domain.MultipartUploadMetadata;
+import org.jclouds.glacier.domain.PaginatedJobCollection;
 import org.jclouds.glacier.domain.PaginatedMultipartUploadCollection;
 import org.jclouds.glacier.domain.PaginatedVaultCollection;
 import org.jclouds.glacier.domain.VaultMetadata;
@@ -244,4 +245,21 @@ public interface GlacierClient extends Closeable {
     * @see <a href="http://docs.aws.amazon.com/amazonglacier/latest/dev/api-describe-job-get.html" />
     */
    JobMetadata describeJob(String vaultName, String jobId);
+
+   /**
+    * Lists jobs.
+    *
+    * @param vaultName
+    *           Name of the target Vault.
+    * @param options
+    *          Options used for pagination
+    * @return A PaginatedJobCollection, containing an iterable job list with a marker.
+    * @see <a href="http://docs.aws.amazon.com/amazonglacier/latest/dev/api-jobs-get.html" />
+    */
+   PaginatedJobCollection listJobs(String vaultName, PaginationOptions options);
+
+   /**
+    * Lists jobs.
+    */
+   PaginatedJobCollection listJobs(String vaultName);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/174b62b5/glacier/src/main/java/org/jclouds/glacier/domain/PaginatedJobCollection.java
----------------------------------------------------------------------
diff --git a/glacier/src/main/java/org/jclouds/glacier/domain/PaginatedJobCollection.java b/glacier/src/main/java/org/jclouds/glacier/domain/PaginatedJobCollection.java
new file mode 100644
index 0000000..6e4ae4e
--- /dev/null
+++ b/glacier/src/main/java/org/jclouds/glacier/domain/PaginatedJobCollection.java
@@ -0,0 +1,58 @@
+/*
+ * 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.glacier.domain;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+import java.util.Iterator;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.glacier.options.PaginationOptions;
+
+import com.google.common.base.Optional;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Paginated collection used to store Job listing information.
+ */
+public class PaginatedJobCollection extends IterableWithMarker<JobMetadata> {
+   @SerializedName("JobList")
+   private final Iterable<JobMetadata> jobs;
+   @SerializedName("Marker")
+   private final String marker;
+
+   @ConstructorProperties({ "JobList", "Marker" })
+   public PaginatedJobCollection(Iterable<JobMetadata> jobs, String marker) {
+      this.jobs = checkNotNull(jobs, "jobs");
+      this.marker = marker;
+   }
+
+   @Override
+   public Iterator<JobMetadata> iterator() {
+      return jobs.iterator();
+   }
+
+   @Override
+   public Optional<Object> nextMarker() {
+      return Optional.<Object>fromNullable(marker);
+   }
+
+   public PaginationOptions nextPaginationOptions() {
+      return PaginationOptions.class.cast(nextMarker().get());
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/174b62b5/glacier/src/main/java/org/jclouds/glacier/functions/ParseJobMetadataListFromHttpContent.java
----------------------------------------------------------------------
diff --git a/glacier/src/main/java/org/jclouds/glacier/functions/ParseJobMetadataListFromHttpContent.java b/glacier/src/main/java/org/jclouds/glacier/functions/ParseJobMetadataListFromHttpContent.java
new file mode 100644
index 0000000..b288d4f
--- /dev/null
+++ b/glacier/src/main/java/org/jclouds/glacier/functions/ParseJobMetadataListFromHttpContent.java
@@ -0,0 +1,35 @@
+/*
+ * 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.glacier.functions;
+
+import org.jclouds.glacier.domain.PaginatedJobCollection;
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+
+import com.google.inject.Inject;
+import com.google.inject.TypeLiteral;
+
+/**
+ * Parses the JSON job list from the HttpResponse.
+ */
+public class ParseJobMetadataListFromHttpContent extends ParseJson<PaginatedJobCollection> {
+
+   @Inject
+   public ParseJobMetadataListFromHttpContent(Json json) {
+      super(json, TypeLiteral.get(PaginatedJobCollection.class));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/174b62b5/glacier/src/test/java/org/jclouds/glacier/GlacierClientMockTest.java
----------------------------------------------------------------------
diff --git a/glacier/src/test/java/org/jclouds/glacier/GlacierClientMockTest.java b/glacier/src/test/java/org/jclouds/glacier/GlacierClientMockTest.java
index 62dd74d..b3ac6c2 100644
--- a/glacier/src/test/java/org/jclouds/glacier/GlacierClientMockTest.java
+++ b/glacier/src/test/java/org/jclouds/glacier/GlacierClientMockTest.java
@@ -41,6 +41,7 @@ import org.jclouds.glacier.domain.ArchiveRetrievalJobRequest;
 import org.jclouds.glacier.domain.InventoryRetrievalJobRequest;
 import org.jclouds.glacier.domain.JobMetadata;
 import org.jclouds.glacier.domain.MultipartUploadMetadata;
+import org.jclouds.glacier.domain.PaginatedJobCollection;
 import org.jclouds.glacier.domain.PaginatedMultipartUploadCollection;
 import org.jclouds.glacier.domain.PaginatedVaultCollection;
 import org.jclouds.glacier.domain.PartMetadata;
@@ -454,4 +455,20 @@ public class GlacierClientMockTest {
       assertEquals(ContentRange.fromString("0-16777215"), job.getRetrievalByteRange());
       assertEquals(job.getVaultArn(), "arn:aws:glacier:us-east-1:012345678901:vaults/examplevault");
    }
+
+   @Test
+   public void testListJobs() throws IOException, InterruptedException {
+      MockResponse mr = buildBaseResponse(200);
+      mr.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.JSON_UTF_8);
+      mr.setBody(getResponseBody("/json/listJobsResponseBody.json"));
+      mr.addHeader(HttpHeaders.CONTENT_LENGTH, mr.getBody().length);
+      server.enqueue(mr);
+
+      PaginatedJobCollection jb = client.listJobs("examplevault");
+      Iterator<JobMetadata> i = jb.iterator();
+      assertEquals(i.next().getJobId(), "s4MvaNHIh6mOa1f8iY4ioG2921SDPihXxh3Kv0FBX-JbNPctpRvE4c2_BifuhdGLqEhGBNGeB6Ub-JMunR9JoVa8y1hQ");
+      assertEquals(i.next().getJobId(), "CQ_tf6fOR4jrJCL61Mfk6VM03oY8lmnWK93KK4gLig1UPAbZiN3UV4G_5nq4AfmJHQ_dOMLOX5k8ItFv0wCPN0oaz5dG");
+      assertFalse(i.hasNext());
+      assertEquals(server.takeRequest().getRequestLine(), "GET /-/vaults/examplevault/jobs HTTP/1.1");
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/174b62b5/glacier/src/test/resources/json/listJobsResponseBody.json
----------------------------------------------------------------------
diff --git a/glacier/src/test/resources/json/listJobsResponseBody.json b/glacier/src/test/resources/json/listJobsResponseBody.json
new file mode 100644
index 0000000..fba321e
--- /dev/null
+++ b/glacier/src/test/resources/json/listJobsResponseBody.json
@@ -0,0 +1,41 @@
+{
+  "JobList": [
+    {
+      "Action": "ArchiveRetrieval",
+      "ArchiveId": "58-3KpZfcMPUznvMZNPaKyJx9wODCsWTnqcjtx2CjKZ6b-XgxEuA8yvZOYTPQfd7gWR4GRm2XR08gcnWbLV4VPV_kDWtZJKi0TFhKKVPzwrZnA4-FXuIBfViYUIVveeiBE51FO4bvg",
+      "ArchiveSizeInBytes": 8388608,
+      "ArchiveSHA256TreeHash": "106086b256ddf0fedf3d9e72f461d5983a2566247ebe7e1949246bc61359b4f4",
+      "Completed": true,
+      "CompletionDate": "2012-05-01T00:25:20.043Z",
+      "CreationDate": "2012-05-01T00:25:16.344Z",
+      "InventorySizeInBytes": null,
+      "JobDescription": "aaabbbccc",
+      "JobId": "s4MvaNHIh6mOa1f8iY4ioG2921SDPihXxh3Kv0FBX-JbNPctpRvE4c2_BifuhdGLqEhGBNGeB6Ub-JMunR9JoVa8y1hQ",
+      "RetrievalByteRange": "0-8388607",
+      "SHA256TreeHash": "106086b256ddf0fedf3d9e72f461d5983a2566247ebe7e1949246bc61359b4f4",
+      "SNSTopic": null,
+      "StatusCode": "Succeeded",
+      "StatusMessage": "Succeeded",
+      "VaultARN": "arn:aws:glacier:us-east-1:012345678901:vaults/examplevault"
+    },
+    {
+      "Action": "ArchiveRetrieval",
+      "ArchiveId": "2NVGpf83U6qB9M2u-Ihh61yoFLRDEoh7YLZWKBn80A2i1xG8uieBwGjAr4RkzOHA0E07ZjtI267R03Z-6Hxd8pyGQkBdciCSH1-Lw63Kx9qKpZbPCdU0uTW_WAdwF6lR6w8iSyKdvw",
+      "ArchiveSizeInBytes": 1048576,
+      "ArchiveSHA256TreeHash": "3d2ae052b2978727e0c51c0a5e32961c6a56650d1f2e4ceccab6472a5ed4a0",
+      "Completed": true,
+      "CompletionDate": "2012-05-01T16:59:48.444Z",
+      "CreationDate": "2012-05-01T16:59:42.977Z",
+      "InventorySizeInBytes": null,
+      "JobDescription": "aaabbbccc",
+      "JobId": "CQ_tf6fOR4jrJCL61Mfk6VM03oY8lmnWK93KK4gLig1UPAbZiN3UV4G_5nq4AfmJHQ_dOMLOX5k8ItFv0wCPN0oaz5dG",
+      "RetrievalByteRange": "0-1048575",
+      "SHA256TreeHash": "3d2ae052b2978727e0c51c0a5e32961c6a56650d1f2e4ceccab6472a5ed4a0",
+      "SNSTopic": null,
+      "StatusCode": "Succeeded",
+      "StatusMessage": "Succeeded",
+      "VaultARN": "arn:aws:glacier:us-east-1:012345678901:vaults/examplevault"
+    }
+  ],
+  "Marker": "CQ_tf6fOR4jrJCL61Mfk6VM03oY8lmnWK93KK4gLig1UPAbZiN3UV4G_5nq4AfmJHQ_dOMLOX5k8ItFv0wCPN0oaz5dG"
+}