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 <[email protected]> Authored: Wed Jun 25 22:13:28 2014 +0200 Committer: Andrew Gaul <[email protected]> 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" +}
