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"
+}