{ "$schema": "../schema/vector.schema.json", "vectors": [ { "id": "versioning-0001", "group": "versioning", "kind": "api", "title": "HEAD after delete in an unversioned bucket returns 404 with no delete-marker header", "tags": [ "tier-1", "versioning", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L19403", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "frodo.txt", "body": "body version frodo.txt" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "frodo.txt" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "frodo.txt" }, "expect": { "status": 404 } } } ] }, { "id": "versioning-0002", "group": "versioning", "kind": "api", "title": "Delete under suspended versioning still creates a delete marker", "tags": [ "tier-3", "versioning", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L19428", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "ringo.txt", "body": "body version ringo.txt" } } ], "steps": [ { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "ringo.txt" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "ringo.txt" }, "expect": { "status": 404, "headers": { "x-amz-delete-marker": "true" } } } } ] }, { "id": "versioning-0003", "group": "versioning", "kind": "api", "title": "HEAD after delete in a versioned bucket reports x-amz-delete-marker true", "tags": [ "tier-1", "versioning", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L19415", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "bilbo.txt", "body": "body version bilbo.txt" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "bilbo.txt" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "bilbo.txt" }, "expect": { "status": 404, "headers": { "x-amz-delete-marker": "true" } } } } ] }, { "id": "versioning-0004", "group": "versioning", "kind": "api", "title": "Get and put the ACL of a specific object version", "description": "The owner's canonical ID and display name are captured from a first ACL read and asserted on later reads, since the runner's primary identity attributes are not directly referenceable.", "tags": [ "tier-3", "versioning", "acl", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8234", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "VersionId": "${cap.v2}" }, "capture": { "ownerId": "Owner.ID", "ownerName": "Owner.DisplayName" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "VersionId": "${cap.v2}" }, "expect": { "response": { "Owner": { "ID": "${cap.ownerId}", "DisplayName": "${cap.ownerName}" }, "Grants": [ { "Permission": "FULL_CONTROL", "Grantee": { "Type": "CanonicalUser", "ID": "${cap.ownerId}", "DisplayName": "${cap.ownerName}", "URI": { "$absent": true }, "EmailAddress": { "$absent": true } } } ] } } } }, { "$operation": { "name": "PutObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "VersionId": "${cap.v2}", "ACL": "public-read" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "VersionId": "${cap.v2}" }, "expect": { "response": { "Grants": [ { "Permission": "READ", "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/global/AllUsers", "ID": { "$absent": true }, "DisplayName": { "$absent": true }, "EmailAddress": { "$absent": true } } }, { "Permission": "FULL_CONTROL", "Grantee": { "Type": "CanonicalUser", "ID": "${cap.ownerId}", "DisplayName": "${cap.ownerName}", "URI": { "$absent": true }, "EmailAddress": { "$absent": true } } } ] } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "xyz" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "xyz" }, "expect": { "response": { "Grants": [ { "Permission": "FULL_CONTROL", "Grantee": { "Type": "CanonicalUser", "ID": "${cap.ownerId}", "DisplayName": "${cap.ownerName}", "URI": { "$absent": true }, "EmailAddress": { "$absent": true } } } ] } } } } ] }, { "id": "versioning-0005", "group": "versioning", "kind": "api", "title": "PutObjectAcl without VersionId applies to the current object version", "description": "The owner's canonical ID and display name are captured from a first ACL read and asserted on later reads, since the runner's primary identity attributes are not directly referenceable.", "tags": [ "tier-3", "versioning", "acl", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8302", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "xyz" }, "capture": { "vid": "VersionId" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "VersionId": "${cap.vid}" }, "capture": { "ownerId": "Owner.ID", "ownerName": "Owner.DisplayName" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "VersionId": "${cap.vid}" }, "expect": { "response": { "Owner": { "ID": "${cap.ownerId}", "DisplayName": "${cap.ownerName}" }, "Grants": [ { "Permission": "FULL_CONTROL", "Grantee": { "Type": "CanonicalUser", "ID": "${cap.ownerId}", "DisplayName": "${cap.ownerName}", "URI": { "$absent": true }, "EmailAddress": { "$absent": true } } } ] } } } }, { "$operation": { "name": "PutObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "ACL": "public-read" } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "xyz", "VersionId": "${cap.vid}" }, "expect": { "response": { "Grants": [ { "Permission": "READ", "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/global/AllUsers", "ID": { "$absent": true }, "DisplayName": { "$absent": true }, "EmailAddress": { "$absent": true } } }, { "Permission": "FULL_CONTROL", "Grantee": { "Type": "CanonicalUser", "ID": "${cap.ownerId}", "DisplayName": "${cap.ownerName}", "URI": { "$absent": true }, "EmailAddress": { "$absent": true } } } ] } } } } ] }, { "id": "versioning-0006", "group": "versioning", "kind": "api", "title": "PutObject returns a VersionId only on a versioning-enabled bucket", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L12382", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$bucket": { "handle": "b2" } }, { "$bucket": { "handle": "b3", "versioning": "Suspended" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "bar" }, "capture": { "vid": "VersionId" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "VersionId": "${cap.vid}" } ] } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b2.name}", "Key": "baz" }, "expect": { "response": { "VersionId": { "$absent": true } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b3.name}", "Key": "baz" }, "expect": { "response": { "VersionId": { "$absent": true } } } } } ] }, { "id": "versioning-0007", "group": "versioning", "kind": "api", "title": "Toggle bucket versioning between Suspended and Enabled and read back the status", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7654", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": { "$absent": true } } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } } ] }, { "id": "versioning-0008", "group": "versioning", "kind": "api", "title": "CompleteMultipartUpload returns a VersionId only on a versioning-enabled bucket", "description": "The same 30 MiB dataset is uploaded in six 5 MiB parts to an enabled, an unversioned and a suspended bucket; only the enabled bucket must return a VersionId.", "tags": [ "tier-3", "versioning", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L12411", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$bucket": { "handle": "b2" } }, { "$bucket": { "handle": "b3", "versioning": "Suspended" } } ], "data": { "obj": { "$prng": { "seed": "versioning-0008/obj", "size": 31457280 } }, "p1": { "$slice": { "of": "obj", "offset": 0, "length": 5242880 } }, "p2": { "$slice": { "of": "obj", "offset": 5242880, "length": 5242880 } }, "p3": { "$slice": { "of": "obj", "offset": 10485760, "length": 5242880 } }, "p4": { "$slice": { "of": "obj", "offset": 15728640, "length": 5242880 } }, "p5": { "$slice": { "of": "obj", "offset": 20971520, "length": 5242880 } }, "p6": { "$slice": { "of": "obj", "offset": 26214400, "length": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "ContentType": "text/bla", "Metadata": { "foo": "baz" } }, "capture": { "uploadIdA": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "UploadId": "${cap.uploadIdA}", "PartNumber": 1, "Body": { "$data": "p1" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "UploadId": "${cap.uploadIdA}", "PartNumber": 2, "Body": { "$data": "p2" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "UploadId": "${cap.uploadIdA}", "PartNumber": 3, "Body": { "$data": "p3" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "UploadId": "${cap.uploadIdA}", "PartNumber": 4, "Body": { "$data": "p4" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "UploadId": "${cap.uploadIdA}", "PartNumber": 5, "Body": { "$data": "p5" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "UploadId": "${cap.uploadIdA}", "PartNumber": 6, "Body": { "$data": "p6" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "UploadId": "${cap.uploadIdA}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${data.p1.etag}" }, { "PartNumber": 2, "ETag": "${data.p2.etag}" }, { "PartNumber": 3, "ETag": "${data.p3.etag}" }, { "PartNumber": 4, "ETag": "${data.p4.etag}" }, { "PartNumber": 5, "ETag": "${data.p5.etag}" }, { "PartNumber": 6, "ETag": "${data.p6.etag}" } ] } }, "capture": { "vid": "VersionId" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "VersionId": "${cap.vid}" } ] } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "baz", "ContentType": "text/bla", "Metadata": { "foo": "baz" } }, "capture": { "uploadIdB": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b2.name}", "Key": "baz", "UploadId": "${cap.uploadIdB}", "PartNumber": 1, "Body": { "$data": "p1" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b2.name}", "Key": "baz", "UploadId": "${cap.uploadIdB}", "PartNumber": 2, "Body": { "$data": "p2" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b2.name}", "Key": "baz", "UploadId": "${cap.uploadIdB}", "PartNumber": 3, "Body": { "$data": "p3" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b2.name}", "Key": "baz", "UploadId": "${cap.uploadIdB}", "PartNumber": 4, "Body": { "$data": "p4" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b2.name}", "Key": "baz", "UploadId": "${cap.uploadIdB}", "PartNumber": 5, "Body": { "$data": "p5" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b2.name}", "Key": "baz", "UploadId": "${cap.uploadIdB}", "PartNumber": 6, "Body": { "$data": "p6" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "baz", "UploadId": "${cap.uploadIdB}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${data.p1.etag}" }, { "PartNumber": 2, "ETag": "${data.p2.etag}" }, { "PartNumber": 3, "ETag": "${data.p3.etag}" }, { "PartNumber": 4, "ETag": "${data.p4.etag}" }, { "PartNumber": 5, "ETag": "${data.p5.etag}" }, { "PartNumber": 6, "ETag": "${data.p6.etag}" } ] } }, "expect": { "response": { "VersionId": { "$absent": true } } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b3.name}", "Key": "foo", "ContentType": "text/bla", "Metadata": { "foo": "baz" } }, "capture": { "uploadIdC": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b3.name}", "Key": "foo", "UploadId": "${cap.uploadIdC}", "PartNumber": 1, "Body": { "$data": "p1" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b3.name}", "Key": "foo", "UploadId": "${cap.uploadIdC}", "PartNumber": 2, "Body": { "$data": "p2" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b3.name}", "Key": "foo", "UploadId": "${cap.uploadIdC}", "PartNumber": 3, "Body": { "$data": "p3" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b3.name}", "Key": "foo", "UploadId": "${cap.uploadIdC}", "PartNumber": 4, "Body": { "$data": "p4" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b3.name}", "Key": "foo", "UploadId": "${cap.uploadIdC}", "PartNumber": 5, "Body": { "$data": "p5" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b3.name}", "Key": "foo", "UploadId": "${cap.uploadIdC}", "PartNumber": 6, "Body": { "$data": "p6" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b3.name}", "Key": "foo", "UploadId": "${cap.uploadIdC}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${data.p1.etag}" }, { "PartNumber": 2, "ETag": "${data.p2.etag}" }, { "PartNumber": 3, "ETag": "${data.p3.etag}" }, { "PartNumber": 4, "ETag": "${data.p4.etag}" }, { "PartNumber": 5, "ETag": "${data.p5.etag}" }, { "PartNumber": 6, "ETag": "${data.p6.etag}" } ] } }, "expect": { "response": { "VersionId": { "$absent": true } } } } } ] }, { "id": "versioning-0009", "group": "versioning", "kind": "api", "title": "Copy specific object versions by VersionId within and across buckets", "tags": [ "tier-1", "versioning", "copy", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8118", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$bucket": { "handle": "b2" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "key_0", "CopySource": "${res.b1.name}/testobj?versionId=${cap.v1}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "key_0" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "key_1", "CopySource": "${res.b1.name}/testobj?versionId=${cap.v2}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "key_1" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "key_2", "CopySource": "${res.b1.name}/testobj?versionId=${cap.v3}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "key_2" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b2.name}", "Key": "key_0", "CopySource": "${res.b1.name}/testobj?versionId=${cap.v1}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "key_0" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b2.name}", "Key": "key_1", "CopySource": "${res.b1.name}/testobj?versionId=${cap.v2}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "key_1" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b2.name}", "Key": "key_2", "CopySource": "${res.b1.name}/testobj?versionId=${cap.v3}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "key_2" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b2.name}", "Key": "new_key", "CopySource": "${res.b1.name}/testobj" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "new_key" }, "expect": { "body": "content-2" } } } ] }, { "id": "versioning-0010", "group": "versioning", "kind": "api", "title": "DeleteObjects removes specific versions by VersionId and is idempotent", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8155", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "key", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "key", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key", "VersionId": "${cap.v1}" }, { "Key": "key", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$absent": true } } } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key", "VersionId": "${cap.v1}" }, { "Key": "key", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$absent": true } } } } } ] }, { "id": "versioning-0011", "group": "versioning", "kind": "api", "title": "DeleteObjects removes versions and a delete marker by VersionId, and is idempotent", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8180", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "key", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "key", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "key" }, "capture": { "dm": "VersionId" }, "expect": { "response": { "DeleteMarker": true } } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key", "VersionId": "${cap.v1}" }, { "Key": "key", "VersionId": "${cap.v2}" }, { "Key": "key", "VersionId": "${cap.dm}" } ] } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$absent": true }, "DeleteMarkers": { "$absent": true } } } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key", "VersionId": "${cap.v1}" }, { "Key": "key", "VersionId": "${cap.v2}" }, { "Key": "key", "VersionId": "${cap.dm}" } ] } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$absent": true }, "DeleteMarkers": { "$absent": true } } } } } ] }, { "id": "versioning-0012", "group": "versioning", "kind": "api", "title": "DeleteObjects on a missing key creates a delete marker and reports its version id", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8213", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "key" } ] } }, "capture": { "dmv": "Deleted[0].DeleteMarkerVersionId" }, "expect": { "response": { "Deleted": [ { "DeleteMarker": true } ] } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "DeleteMarkers": [ { "Key": "key", "VersionId": "${cap.dmv}" } ] } } } } ] }, { "id": "versioning-0013", "group": "versioning", "kind": "api", "title": "Three multipart overwrites of one key create distinct versions readable by VersionId, then remove all versions", "description": "The source builds each 18 MiB object from a random 5-char string repeated to 5 MiB (uploaded as parts 1-3) plus a 3 MiB \"123\" pattern last part; fixed 5-char patterns are used here so full-body MD5s are deterministic.", "tags": [ "tier-3", "versioning", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8033", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "data": { "pay1": { "$pattern": { "pattern": "abcd1", "size": 5242880 } }, "pay2": { "$pattern": { "pattern": "abcd2", "size": 5242880 } }, "pay3": { "$pattern": { "pattern": "abcd3", "size": 5242880 } }, "last": { "$pattern": { "pattern": "123", "size": 3145728 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" }, "capture": { "uploadId1": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId1}", "PartNumber": 1, "Body": { "$data": "pay1" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId1}", "PartNumber": 2, "Body": { "$data": "pay1" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId1}", "PartNumber": 3, "Body": { "$data": "pay1" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId1}", "PartNumber": 4, "Body": { "$data": "last" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${data.pay1.etag}" }, { "PartNumber": 2, "ETag": "${data.pay1.etag}" }, { "PartNumber": 3, "ETag": "${data.pay1.etag}" }, { "PartNumber": 4, "ETag": "${data.last.etag}" } ] } }, "expect": { "response": { "ETag": { "$matches": "." } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" }, "expect": { "body": { "$size": 18874368, "$md5": "28911e20bdb8680d4216efbf7be25aaa" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" }, "capture": { "uploadId2": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId2}", "PartNumber": 1, "Body": { "$data": "pay2" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId2}", "PartNumber": 2, "Body": { "$data": "pay2" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId2}", "PartNumber": 3, "Body": { "$data": "pay2" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId2}", "PartNumber": 4, "Body": { "$data": "last" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId2}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${data.pay2.etag}" }, { "PartNumber": 2, "ETag": "${data.pay2.etag}" }, { "PartNumber": 3, "ETag": "${data.pay2.etag}" }, { "PartNumber": 4, "ETag": "${data.last.etag}" } ] } }, "expect": { "response": { "ETag": { "$matches": "." } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" }, "expect": { "body": { "$size": 18874368, "$md5": "9539fd44746673d477cda46c0ec62f7a" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" }, "capture": { "uploadId3": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId3}", "PartNumber": 1, "Body": { "$data": "pay3" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId3}", "PartNumber": 2, "Body": { "$data": "pay3" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId3}", "PartNumber": 3, "Body": { "$data": "pay3" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId3}", "PartNumber": 4, "Body": { "$data": "last" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "UploadId": "${cap.uploadId3}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${data.pay3.etag}" }, { "PartNumber": 2, "ETag": "${data.pay3.etag}" }, { "PartNumber": 3, "ETag": "${data.pay3.etag}" }, { "PartNumber": 4, "ETag": "${data.last.etag}" } ] } }, "expect": { "response": { "ETag": { "$matches": "." } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" }, "expect": { "body": { "$size": 18874368, "$md5": "89d72d6d5976248954d7f34e8f16b02e" } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "capture": { "v1": "Versions[2].VersionId", "v2": "Versions[1].VersionId", "v3": "Versions[0].VersionId" }, "expect": { "response": { "Versions": { "$length": 3 } } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v3}" }, { "Key": "testobj", "VersionId": "${cap.v2}" }, { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": { "$size": 18874368, "$md5": "28911e20bdb8680d4216efbf7be25aaa" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": { "$size": 18874368, "$md5": "9539fd44746673d477cda46c0ec62f7a" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": { "$size": 18874368, "$md5": "89d72d6d5976248954d7f34e8f16b02e" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": { "$size": 18874368, "$md5": "28911e20bdb8680d4216efbf7be25aaa" } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v3}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": { "$size": 18874368, "$md5": "9539fd44746673d477cda46c0ec62f7a" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": { "$size": 18874368, "$md5": "89d72d6d5976248954d7f34e8f16b02e" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": { "$size": 18874368, "$md5": "89d72d6d5976248954d7f34e8f16b02e" } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": { "$size": 18874368, "$md5": "9539fd44746673d477cda46c0ec62f7a" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": { "$size": 18874368, "$md5": "9539fd44746673d477cda46c0ec62f7a" } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" } } } ] }, { "id": "versioning-0014", "group": "versioning", "kind": "api", "title": "Create five object versions and delete them newest-first, verifying remaining versions after each delete", "description": "One removal-order round of the source test (removal order: version 5, then version 4, then version 3, then version 2, then version 1). After each delete the remaining versions are listed newest-first and each remaining version body is read back.", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7737", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-3" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-4" }, "capture": { "v5": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v3}" }, { "Key": "testobj", "VersionId": "${cap.v2}" }, { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v3}" }, { "Key": "testobj", "VersionId": "${cap.v2}" }, { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v2}" }, { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" } } } ] }, { "id": "versioning-0015", "group": "versioning", "kind": "api", "title": "Create five object versions and delete them oldest-first, verifying remaining versions after each delete", "description": "One removal-order round of the source test (removal order: version 1, then version 2, then version 3, then version 4, then version 5). After each delete the remaining versions are listed newest-first and each remaining version body is read back.", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7737", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-3" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-4" }, "capture": { "v5": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v3}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v3}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" } } } ] }, { "id": "versioning-0016", "group": "versioning", "kind": "api", "title": "Create five object versions and delete the second-oldest remaining version each time, verifying remaining versions", "description": "One removal-order round of the source test (removal order: version 2, then version 3, then version 4, then version 5, then version 1). After each delete the remaining versions are listed newest-first and each remaining version body is read back.", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7737", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-3" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-4" }, "capture": { "v5": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v3}" }, { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" } } } ] }, { "id": "versioning-0017", "group": "versioning", "kind": "api", "title": "Create five object versions and delete them in mixed order, verifying remaining versions after each delete", "description": "One removal-order round of the source test (removal order: version 4, then version 3, then version 1, then version 2, then version 5). After each delete the remaining versions are listed newest-first and each remaining version body is read back.", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7737", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-3" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-4" }, "capture": { "v5": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v3}" }, { "Key": "testobj", "VersionId": "${cap.v2}" }, { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v2}" }, { "Key": "testobj", "VersionId": "${cap.v1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v5}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" } } } ] }, { "id": "versioning-0018", "group": "versioning", "kind": "api", "title": "Delete the newest version by id, then add a delete marker; listing shows remaining versions and the marker", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7751", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-3" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-4" }, "capture": { "v5": "VersionId" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" }, "capture": { "dm": "VersionId" }, "expect": { "response": { "DeleteMarker": true } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$length": 4 }, "DeleteMarkers": [ { "VersionId": "${cap.dm}" } ] } } } } ] }, { "id": "versioning-0019", "group": "versioning", "kind": "api", "title": "Create ten object versions and remove them one by one in mixed order, verifying remaining versions after each delete", "description": "Removal order: version 1, then version 3, then version 5, then version 7, then version 9, then version 2, then version 8, then version 6, then version 4, then version 10.", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7999", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-3" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-4" }, "capture": { "v5": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-5" }, "capture": { "v6": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-6" }, "capture": { "v7": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-7" }, "capture": { "v8": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-8" }, "capture": { "v9": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-9" }, "capture": { "v10": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v10}" }, { "Key": "testobj", "VersionId": "${cap.v9}" }, { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v7}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v3}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v10}" }, { "Key": "testobj", "VersionId": "${cap.v9}" }, { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v7}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v10}" }, { "Key": "testobj", "VersionId": "${cap.v9}" }, { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v7}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v10}" }, { "Key": "testobj", "VersionId": "${cap.v9}" }, { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v9}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v10}" }, { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v10}" }, { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v10}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v10}" }, { "Key": "testobj", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v10}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v10}" } } } ] }, { "id": "versioning-0020", "group": "versioning", "kind": "api", "title": "Create and remove ten versions of a key with special name \":\"", "description": "Removal order: version 1, then version 3, then version 5, then version 7, then version 9, then version 2, then version 8, then version 6, then version 4, then version 10. One key of the source test per vector.", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8015", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-3" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-4" }, "capture": { "v5": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-5" }, "capture": { "v6": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-6" }, "capture": { "v7": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-7" }, "capture": { "v8": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-8" }, "capture": { "v9": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "Body": "content-9" }, "capture": { "v10": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v1}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": ":", "VersionId": "${cap.v10}" }, { "Key": ":", "VersionId": "${cap.v9}" }, { "Key": ":", "VersionId": "${cap.v8}" }, { "Key": ":", "VersionId": "${cap.v7}" }, { "Key": ":", "VersionId": "${cap.v6}" }, { "Key": ":", "VersionId": "${cap.v5}" }, { "Key": ":", "VersionId": "${cap.v4}" }, { "Key": ":", "VersionId": "${cap.v3}" }, { "Key": ":", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v3}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": ":", "VersionId": "${cap.v10}" }, { "Key": ":", "VersionId": "${cap.v9}" }, { "Key": ":", "VersionId": "${cap.v8}" }, { "Key": ":", "VersionId": "${cap.v7}" }, { "Key": ":", "VersionId": "${cap.v6}" }, { "Key": ":", "VersionId": "${cap.v5}" }, { "Key": ":", "VersionId": "${cap.v4}" }, { "Key": ":", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v5}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": ":", "VersionId": "${cap.v10}" }, { "Key": ":", "VersionId": "${cap.v9}" }, { "Key": ":", "VersionId": "${cap.v8}" }, { "Key": ":", "VersionId": "${cap.v7}" }, { "Key": ":", "VersionId": "${cap.v6}" }, { "Key": ":", "VersionId": "${cap.v4}" }, { "Key": ":", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v7}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": ":", "VersionId": "${cap.v10}" }, { "Key": ":", "VersionId": "${cap.v9}" }, { "Key": ":", "VersionId": "${cap.v8}" }, { "Key": ":", "VersionId": "${cap.v6}" }, { "Key": ":", "VersionId": "${cap.v4}" }, { "Key": ":", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v9}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": ":", "VersionId": "${cap.v10}" }, { "Key": ":", "VersionId": "${cap.v8}" }, { "Key": ":", "VersionId": "${cap.v6}" }, { "Key": ":", "VersionId": "${cap.v4}" }, { "Key": ":", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": ":", "VersionId": "${cap.v10}" }, { "Key": ":", "VersionId": "${cap.v8}" }, { "Key": ":", "VersionId": "${cap.v6}" }, { "Key": ":", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v8}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": ":", "VersionId": "${cap.v10}" }, { "Key": ":", "VersionId": "${cap.v6}" }, { "Key": ":", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v6}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": ":", "VersionId": "${cap.v10}" }, { "Key": ":", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v4}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": ":", "VersionId": "${cap.v10}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": ":", "VersionId": "${cap.v10}" } } } ] }, { "id": "versioning-0021", "group": "versioning", "kind": "api", "title": "Create and remove ten versions of a key with special name \" \"", "description": "Removal order: version 1, then version 3, then version 5, then version 7, then version 9, then version 2, then version 8, then version 6, then version 4, then version 10. One key of the source test per vector.", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8015", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-3" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-4" }, "capture": { "v5": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-5" }, "capture": { "v6": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-6" }, "capture": { "v7": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-7" }, "capture": { "v8": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-8" }, "capture": { "v9": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Body": "content-9" }, "capture": { "v10": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v1}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": " ", "VersionId": "${cap.v10}" }, { "Key": " ", "VersionId": "${cap.v9}" }, { "Key": " ", "VersionId": "${cap.v8}" }, { "Key": " ", "VersionId": "${cap.v7}" }, { "Key": " ", "VersionId": "${cap.v6}" }, { "Key": " ", "VersionId": "${cap.v5}" }, { "Key": " ", "VersionId": "${cap.v4}" }, { "Key": " ", "VersionId": "${cap.v3}" }, { "Key": " ", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v3}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": " ", "VersionId": "${cap.v10}" }, { "Key": " ", "VersionId": "${cap.v9}" }, { "Key": " ", "VersionId": "${cap.v8}" }, { "Key": " ", "VersionId": "${cap.v7}" }, { "Key": " ", "VersionId": "${cap.v6}" }, { "Key": " ", "VersionId": "${cap.v5}" }, { "Key": " ", "VersionId": "${cap.v4}" }, { "Key": " ", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v5}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": " ", "VersionId": "${cap.v10}" }, { "Key": " ", "VersionId": "${cap.v9}" }, { "Key": " ", "VersionId": "${cap.v8}" }, { "Key": " ", "VersionId": "${cap.v7}" }, { "Key": " ", "VersionId": "${cap.v6}" }, { "Key": " ", "VersionId": "${cap.v4}" }, { "Key": " ", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v7}" }, "expect": { "body": "content-6" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v7}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": " ", "VersionId": "${cap.v10}" }, { "Key": " ", "VersionId": "${cap.v9}" }, { "Key": " ", "VersionId": "${cap.v8}" }, { "Key": " ", "VersionId": "${cap.v6}" }, { "Key": " ", "VersionId": "${cap.v4}" }, { "Key": " ", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v9}" }, "expect": { "body": "content-8" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v9}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": " ", "VersionId": "${cap.v10}" }, { "Key": " ", "VersionId": "${cap.v8}" }, { "Key": " ", "VersionId": "${cap.v6}" }, { "Key": " ", "VersionId": "${cap.v4}" }, { "Key": " ", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": " ", "VersionId": "${cap.v10}" }, { "Key": " ", "VersionId": "${cap.v8}" }, { "Key": " ", "VersionId": "${cap.v6}" }, { "Key": " ", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v8}" }, "expect": { "body": "content-7" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v8}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": " ", "VersionId": "${cap.v10}" }, { "Key": " ", "VersionId": "${cap.v6}" }, { "Key": " ", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v6}" }, "expect": { "body": "content-5" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v6}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": " ", "VersionId": "${cap.v10}" }, { "Key": " ", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v4}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": " ", "VersionId": "${cap.v10}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" }, "expect": { "body": "content-9" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "VersionId": "${cap.v10}" } } } ] }, { "id": "versioning-0022", "group": "versioning", "kind": "api", "title": "ListObjectVersions orders versions by key, newest first within each key", "tags": [ "tier-3", "versioning", "listing", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L8061", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "a1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "a2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "a3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-3" }, "capture": { "a4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-4" }, "capture": { "a5": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "Body": "content-0" }, "capture": { "b1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "Body": "content-1" }, "capture": { "b2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "Body": "content-2" }, "capture": { "b3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "Body": "content-3" }, "capture": { "b4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "Body": "content-4" }, "capture": { "b5": "VersionId" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.a5}" }, { "Key": "testobj", "VersionId": "${cap.a4}" }, { "Key": "testobj", "VersionId": "${cap.a3}" }, { "Key": "testobj", "VersionId": "${cap.a2}" }, { "Key": "testobj", "VersionId": "${cap.a1}" }, { "Key": "testobj-1", "VersionId": "${cap.b5}" }, { "Key": "testobj-1", "VersionId": "${cap.b4}" }, { "Key": "testobj-1", "VersionId": "${cap.b3}" }, { "Key": "testobj-1", "VersionId": "${cap.b2}" }, { "Key": "testobj-1", "VersionId": "${cap.b1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "VersionId": "${cap.b1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "VersionId": "${cap.b2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "VersionId": "${cap.b3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "VersionId": "${cap.b4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj-1", "VersionId": "${cap.b5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.a1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.a2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.a3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.a4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.a5}" }, "expect": { "body": "content-4" } } } ] }, { "id": "versioning-0023", "group": "versioning", "kind": "api", "title": "Overwrite a pre-versioning object after enabling versioning, then delete each version by id", "tags": [ "tier-3", "versioning", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7821", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": { "$absent": true } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo", "Body": "fooz" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo", "Body": "zzz" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo" }, "capture": { "vid": "VersionId" }, "expect": { "body": "zzz" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo", "VersionId": "${cap.vid}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo" }, "expect": { "body": "fooz" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo", "VersionId": "null" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$absent": true } } } } } ] }, { "id": "versioning-0024", "group": "versioning", "kind": "api", "title": "Overwriting a pre-versioning object under suspended versioning replaces the null version", "tags": [ "tier-3", "versioning", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7854", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": { "$absent": true } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjbar", "Body": "foooz" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjbar", "Body": "zzz" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjbar" }, "expect": { "body": "zzz" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$length": 1 } } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjbar", "VersionId": "null" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjbar" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$absent": true } } } } } ] }, { "id": "versioning-0025", "group": "versioning", "kind": "api", "title": "Deleting the null version of a pre-versioning object removes it entirely", "tags": [ "tier-3", "versioning", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7801", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": { "$absent": true } } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo", "Body": "fooz" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo", "VersionId": "null" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobjfoo" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$absent": true } } } } } ] }, { "id": "versioning-0026", "group": "versioning", "kind": "api", "title": "Suspend and re-enable versioning with interleaved deletes and overwrites, then remove every version by id", "description": "Five versions are created while enabled; under suspension the key is deleted and overwritten repeatedly (null versions replace each other); three more versions are created after re-enabling. All eight surviving real versions are then removed one by one, re-listing and re-reading remaining versions after each delete.", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7919", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-3" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-4" }, "capture": { "v5": "VersionId" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "null content 1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "null content 2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "null content 3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-0" }, "capture": { "v6": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-1" }, "capture": { "v7": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "Body": "content-2" }, "capture": { "v8": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v1}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v7}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v3}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v3}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v7}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v5}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" }, "expect": { "body": "content-4" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v5}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v7}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v7}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v4}" }, { "Key": "testobj", "VersionId": "${cap.v2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" }, "expect": { "body": "content-1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v8}" }, { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" }, "expect": { "body": "content-2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v8}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v6}" }, { "Key": "testobj", "VersionId": "${cap.v4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" }, "expect": { "body": "content-3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v4}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "testobj", "VersionId": "${cap.v6}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" }, "expect": { "body": "content-0" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj", "VersionId": "${cap.v6}" } } } ] }, { "id": "versioning-0027", "group": "versioning", "kind": "api", "title": "Copy a null-version object under suspended versioning within and across buckets", "tags": [ "tier-3", "versioning", "copy", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7953", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$bucket": { "handle": "b2" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj1", "Body": "content-0" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj1", "Body": "null content" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj2", "CopySource": "${res.b1.name}/testobj1" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b2.name}", "Key": "testobj1", "CopySource": "${res.b1.name}/testobj1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "testobj2" }, "expect": { "body": "null content" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "testobj1" }, "expect": { "body": "null content" } } } ] }, { "id": "versioning-0028", "group": "versioning", "kind": "api", "title": "Repeated unversioned deletes on a versioned key stack delete markers", "tags": [ "tier-3", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7786", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "test1/a", "body": "content-0" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test1/a" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test1/a" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "test1/a" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$length": 1 }, "DeleteMarkers": { "$length": 3 } } } } } ] }, { "id": "versioning-0029", "group": "versioning", "kind": "api", "title": "Deleting a specific version of a nested key echoes that VersionId", "description": "Original skipped when versioning was unsupported; here the versioned bucket is a prerequisite, so unsupported versioning reports blocked.", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_delete_object_additional.py#L158", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo/bar/baz", "body": { "$data": "x1000" } } } ], "data": { "x1000": { "$pattern": { "pattern": "x", "size": 1000 } } }, "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo/bar/baz", "VersionId": "${res.o1.versionId}" }, "expect": { "response": { "VersionId": "${res.o1.versionId}" } } } } ] }, { "id": "versioning-0030", "group": "versioning", "kind": "api", "title": "Objects uploaded with checksum algorithms appear in the version listing", "tags": [ "tier-3", "versioning", "checksums", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_object_versions.py#L354", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj-crc32", "Body": "test data for crc32", "ChecksumAlgorithm": "CRC32" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj-sha256", "Body": "test data for sha256", "ChecksumAlgorithm": "SHA256" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "obj-crc32", "VersionId": "${cap.v1}" }, { "Key": "obj-sha256", "VersionId": "${cap.v2}" } ] } } } } ] }, { "id": "versioning-0031", "group": "versioning", "kind": "api", "title": "Version created while versioning is suspended is listed with VersionId null", "tags": [ "tier-3", "versioning", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_object_versions.py#L243", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "v1" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "null-version" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "v3" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "my-obj", "VersionId": "${cap.v3}", "IsLatest": true }, { "Key": "my-obj", "VersionId": "null" }, { "Key": "my-obj", "VersionId": "${cap.v1}" } ] } } } } ] }, { "id": "versioning-0032", "group": "versioning", "kind": "api", "title": "ListObjectVersions returns every version of every key, grouped by key", "description": "The ordered key expectation encodes the original's per-key version counts (bar=3, baz=5, foo=4) plus AWS key ordering.", "tags": [ "tier-3", "versioning", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_object_versions.py#L100", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "foo-v0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "foo-v1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "foo-v2" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": "foo-v3" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "Body": "bar-v0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "Body": "bar-v1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "bar", "Body": "bar-v2" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "baz", "Body": "baz-v0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "baz", "Body": "baz-v1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "baz", "Body": "baz-v2" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "baz", "Body": "baz-v3" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "baz", "Body": "baz-v4" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "bar" }, { "Key": "bar" }, { "Key": "bar" }, { "Key": "baz" }, { "Key": "baz" }, { "Key": "baz" }, { "Key": "baz" }, { "Key": "baz" }, { "Key": "foo" }, { "Key": "foo" }, { "Key": "foo" }, { "Key": "foo" } ] } } } } ] }, { "id": "versioning-0033", "group": "versioning", "kind": "api", "title": "All versions of a single key are listed newest-first with IsLatest on the first", "tags": [ "tier-3", "versioning", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_object_versions.py#L62", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-0" }, "capture": { "v0": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-1" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-2" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-3" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-4" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "my-obj", "VersionId": "${cap.v4}", "IsLatest": true }, { "Key": "my-obj", "VersionId": "${cap.v3}", "IsLatest": false }, { "Key": "my-obj", "VersionId": "${cap.v2}", "IsLatest": false }, { "Key": "my-obj", "VersionId": "${cap.v1}", "IsLatest": false }, { "Key": "my-obj", "VersionId": "${cap.v0}", "IsLatest": false } ] } } } } ] }, { "id": "versioning-0034", "group": "versioning", "kind": "api", "title": "MaxKeys truncates the version listing and markers resume it", "tags": [ "tier-3", "versioning", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_object_versions.py#L147", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj1", "Body": "obj1-v0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj2", "Body": "obj2-v0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj1", "Body": "obj1-v1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj2", "Body": "obj2-v1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj1", "Body": "obj1-v2" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj2", "Body": "obj2-v2" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj1", "Body": "obj1-v3" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj2", "Body": "obj2-v3" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj1", "Body": "obj1-v4" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj2", "Body": "obj2-v4" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 5 }, "capture": { "nkm": "NextKeyMarker", "nvm": "NextVersionIdMarker" }, "expect": { "response": { "IsTruncated": true, "MaxKeys": 5, "Versions": { "$length": 5 }, "NextKeyMarker": { "$exists": true }, "NextVersionIdMarker": { "$exists": true } } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}", "MaxKeys": 5, "KeyMarker": "${cap.nkm}", "VersionIdMarker": "${cap.nvm}" }, "expect": { "response": { "Versions": { "$length": 5 }, "IsTruncated": false } } } } ] }, { "id": "versioning-0035", "group": "versioning", "kind": "api", "title": "ListObjectVersions on a missing bucket returns NoSuchBucket", "description": "The missing bucket name is derived from a runner-provisioned bucket name to avoid colliding with foreign buckets in a shared namespace.", "tags": [ "tier-3", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_object_versions.py#L40", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}-m" }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "versioning-0036", "group": "versioning", "kind": "api", "title": "Pre-versioning object is listed as the null version beneath its delete marker", "tags": [ "tier-3", "versioning", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_object_versions.py#L302", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "before versioning" } } ], "steps": [ { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "dm": "VersionId" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "my-obj", "VersionId": "null", "IsLatest": false } ], "DeleteMarkers": [ { "Key": "my-obj", "VersionId": "${cap.dm}", "IsLatest": true } ] } } } } ] }, { "id": "versioning-0037", "group": "versioning", "kind": "api", "title": "Delete marker appears in DeleteMarkers with IsLatest alongside older versions", "tags": [ "tier-3", "versioning", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_object_versions.py#L194", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "v1" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "v2" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "dm": "VersionId" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "my-obj", "VersionId": "${cap.v2}" }, { "Key": "my-obj", "VersionId": "${cap.v1}" } ], "DeleteMarkers": [ { "Key": "my-obj", "VersionId": "${cap.dm}", "IsLatest": true } ] } } } } ] }, { "id": "versioning-0038", "group": "versioning", "kind": "api", "title": "ListObjectVersions on an unversioned bucket returns null version IDs", "description": "Objects created with versioning never enabled appear as versions with a null VersionId ('null' or empty per the original test), IsLatest true, and correct Key/Size. ETag and StorageClass must be present.", "tags": [ "tier-3", "versioning", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_object_versions_additional.py#L27", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj-0", "body": "" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "my-obj-1", "body": { "$data": "x100" } } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "my-obj-2", "body": { "$data": "x200" } } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "my-obj-3", "body": { "$data": "x300" } } }, { "$object": { "handle": "o5", "bucket": "b1", "key": "my-obj-4", "body": { "$data": "x400" } } } ], "data": { "x100": { "$pattern": { "pattern": "x", "size": 100 } }, "x200": { "$pattern": { "pattern": "x", "size": 200 } }, "x300": { "$pattern": { "pattern": "x", "size": 300 } }, "x400": { "$pattern": { "pattern": "x", "size": 400 } } }, "steps": [ { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "my-obj-0", "Size": 0, "IsLatest": true, "VersionId": { "$matches": "^(null)?$" }, "ETag": { "$exists": true }, "StorageClass": { "$exists": true } }, { "Key": "my-obj-1", "Size": 100, "IsLatest": true, "VersionId": { "$matches": "^(null)?$" }, "ETag": { "$exists": true }, "StorageClass": { "$exists": true } }, { "Key": "my-obj-2", "Size": 200, "IsLatest": true, "VersionId": { "$matches": "^(null)?$" }, "ETag": { "$exists": true }, "StorageClass": { "$exists": true } }, { "Key": "my-obj-3", "Size": 300, "IsLatest": true, "VersionId": { "$matches": "^(null)?$" }, "ETag": { "$exists": true }, "StorageClass": { "$exists": true } }, { "Key": "my-obj-4", "Size": 400, "IsLatest": true, "VersionId": { "$matches": "^(null)?$" }, "ETag": { "$exists": true }, "StorageClass": { "$exists": true } } ] } } } } ] }, { "id": "versioning-0039", "group": "versioning", "kind": "api", "title": "Versioning toggles through unset, Enabled, Suspended and back to Enabled", "description": "For the initial unconfigured read the original test also tolerates an empty-string Status; in the parsed API model an unconfigured bucket has no Status member.", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_bucket_versioning_config.py#L237", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": { "$absent": true } } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } } ] }, { "id": "versioning-0040", "group": "versioning", "kind": "api", "title": "GetBucketVersioning on a non-existing bucket returns NoSuchBucket", "tags": [ "tier-3", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_bucket_versioning_config.py#L132", "steps": [ { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "no-such-bucket-msst-ver-get" }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "versioning-0041", "group": "versioning", "kind": "api", "title": "GetBucketVersioning on a versioning-enabled bucket returns Status Enabled", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_bucket_versioning_config.py#L177", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } } ] }, { "id": "versioning-0042", "group": "versioning", "kind": "api", "title": "PutBucketVersioning with an invalid Status value is rejected", "description": "Original test accepts MalformedXML, InvalidArgument or IllegalVersioningConfigurationException; all are HTTP 400, so only the status is asserted.", "tags": [ "tier-3", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_bucket_versioning_config.py#L55", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "InvalidStatus" } }, "expect": { "status": 400 } } } ] }, { "id": "versioning-0043", "group": "versioning", "kind": "api", "title": "Enabling bucket versioning succeeds and is reflected by GetBucketVersioning", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_bucket_versioning_config.py#L83", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } } ] }, { "id": "versioning-0044", "group": "versioning", "kind": "api", "title": "Suspending versioning after enabling it succeeds and is reflected by GetBucketVersioning", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_bucket_versioning_config.py#L106", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } } ] }, { "id": "versioning-0045", "group": "versioning", "kind": "api", "title": "DeleteBucket on a versioned bucket holding object versions fails", "description": "Original test accepts BucketNotEmpty or VersionedBucketNotEmpty; both are HTTP 409, so only the status is asserted.", "tags": [ "tier-2", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_bucket_versioning_config.py#L202", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "v1" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "my-obj", "body": "v2" } } ], "steps": [ { "$operation": { "name": "DeleteBucket", "params": { "Bucket": "${res.b1.name}" }, "expect": { "status": 409 } } } ] }, { "id": "versioning-0046", "group": "versioning", "kind": "api", "title": "Five rapid overwrites of one key create five distinct, individually retrievable versions", "description": "The original asserted five unique version ids appear in ListObjectVersions in any order; AWS lists versions newest-first, so the listing asserts the exact order v4..v0. Each version body is read back by version id.", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_attributes.py#L195", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-0" }, "capture": { "v0": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-1" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-2" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-3" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "version-4" }, "capture": { "v4": "VersionId" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "my-obj", "VersionId": "${cap.v4}" }, { "Key": "my-obj", "VersionId": "${cap.v3}" }, { "Key": "my-obj", "VersionId": "${cap.v2}" }, { "Key": "my-obj", "VersionId": "${cap.v1}" }, { "Key": "my-obj", "VersionId": "${cap.v0}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.v0}" }, "expect": { "body": "version-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.v1}" }, "expect": { "body": "version-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.v2}" }, "expect": { "body": "version-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.v3}" }, "expect": { "body": "version-3" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.v4}" }, "expect": { "body": "version-4" } } } ] }, { "id": "versioning-0047", "group": "versioning", "kind": "api", "title": "CopyObject from a versioned source key containing '?' and '&' echoes CopySourceVersionId", "description": "The source key 'my-obj?test&data' must be URL-encoded in the x-amz-copy-source header (?->%3F, &->%26) while the trailing ?versionId= suffix stays literal (the original relied on boto3 to do this). Original tolerated a missing CopySourceVersionId (MinIO); AWS returns it.", "tags": [ "tier-1", "versioning", "copy", "encoding", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_attributes.py#L155", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj?test&data", "body": "source data with special chars" } } ], "steps": [ { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj", "CopySource": "${res.b1.name}/my-obj%3Ftest%26data?versionId=${res.o1.versionId}" }, "expect": { "response": { "CopySourceVersionId": "${res.o1.versionId}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj" }, "expect": { "body": "source data with special chars" } } } ] }, { "id": "versioning-0048", "group": "versioning", "kind": "api", "title": "GetObjectAttributes on a delete marker fails", "description": "Original accepted NoSuchKey/MethodNotAllowed/404/405 for the delete-marker version and NoSuchKey/404 without a version id; AWS S3 returns 405 MethodNotAllowed for the delete-marker version and 404 NoSuchKey when the latest version is a delete marker.", "tags": [ "tier-3", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_attributes.py#L96", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "dmVersionId": "VersionId" }, "expect": { "response": { "VersionId": { "$exists": true } } } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.dmVersionId}", "ObjectAttributes": [ "ETag", "ObjectSize" ] }, "expect": { "status": 405, "error": "MethodNotAllowed" } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "ObjectAttributes": [ "ETag", "ObjectSize" ] }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "versioning-0049", "group": "versioning", "kind": "api", "title": "GetObjectAttributes returns per-version attributes and defaults to the latest version", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_attributes.py#L33", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "version 1 data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "my-obj", "body": "version 2 data is longer" } } ], "steps": [ { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${res.o1.versionId}", "ObjectAttributes": [ "ETag", "ObjectSize", "StorageClass" ] }, "expect": { "response": { "VersionId": "${res.o1.versionId}", "ETag": { "$exists": true }, "ObjectSize": 14, "StorageClass": { "$exists": true } } } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${res.o2.versionId}", "ObjectAttributes": [ "ETag", "ObjectSize", "StorageClass" ] }, "expect": { "response": { "VersionId": "${res.o2.versionId}", "ObjectSize": 24 } } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "ObjectAttributes": [ "ETag", "ObjectSize", "StorageClass" ] }, "expect": { "response": { "VersionId": "${res.o2.versionId}", "ObjectSize": 24 } } } } ] }, { "id": "versioning-0050", "group": "versioning", "kind": "api", "title": "DeleteObject with VersionId permanently removes that version only", "description": "Deleting a specific version echoes its VersionId without a DeleteMarker flag (original also accepted an explicit false); that version is then gone while the other version remains latest. Original accepted NoSuchVersion/NoSuchKey/404 for the deleted version; AWS returns 404 NoSuchVersion.", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L408", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "v1" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "my-obj", "body": "v2" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${res.o1.versionId}" }, "expect": { "response": { "VersionId": "${res.o1.versionId}", "DeleteMarker": { "$absent": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${res.o1.versionId}" }, "expect": { "status": 404, "error": "NoSuchVersion" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "body": "v2", "response": { "VersionId": "${res.o2.versionId}" } } } } ] }, { "id": "versioning-0051", "group": "versioning", "kind": "api", "title": "DeleteObject on a non-existing key in a versioned bucket returns 204", "description": "AWS S3 creates a delete marker, but the original only asserted the 204 status (MinIO returns no VersionId/DeleteMarker for this case).", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L455", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "non-existing-key" }, "expect": { "status": 204 } } } ] }, { "id": "versioning-0052", "group": "versioning", "kind": "api", "title": "GetObject with a malformed VersionId returns InvalidArgument", "description": "Original accepted NoSuchVersion or InvalidArgument; AWS S3 returns 400 InvalidArgument for a version id that is not a valid version id format.", "tags": [ "tier-1", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L231", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "invalid-version-id" }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "versioning-0053", "group": "versioning", "kind": "api", "title": "GetObject with VersionId=null retrieves the pre-versioning object", "description": "An object stored before versioning was enabled is retrievable as VersionId=null while a plain GET returns the newer version. Original tolerated a missing VersionId on the null-version GET (MinIO); AWS returns 'null'.", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L264", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "before versioning" } } ], "steps": [ { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "after versioning" }, "capture": { "newVersionId": "VersionId" }, "expect": { "response": { "VersionId": { "$exists": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "null" }, "expect": { "body": "before versioning", "response": { "VersionId": "null" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "body": "after versioning", "response": { "VersionId": "${cap.newVersionId}" } } } } ] }, { "id": "versioning-0054", "group": "versioning", "kind": "api", "title": "GetObject by VersionId and without it both return the stored version", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L186", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": { "$data": "x2000" } } } ], "data": { "x2000": { "$pattern": { "pattern": "x", "size": 2000 } } }, "steps": [ { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${res.o1.versionId}" }, "expect": { "response": { "ContentLength": 2000, "VersionId": "${res.o1.versionId}" }, "body": { "$data": "x2000" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "ContentLength": 2000, "VersionId": "${res.o1.versionId}" }, "body": { "$data": "x2000" } } } } ] }, { "id": "versioning-0055", "group": "versioning", "kind": "api", "title": "HeadObject with a malformed VersionId returns 400", "description": "HEAD responses carry no error body, so only the status is asserted. Original accepted NoSuchVersion/404/400/NoSuchKey/InvalidArgument; AWS S3 returns 400 (InvalidArgument) for a malformed version id.", "tags": [ "tier-1", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L343", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "invalid-version-id" }, "expect": { "status": 400 } } } ] }, { "id": "versioning-0056", "group": "versioning", "kind": "api", "title": "HeadObject with and without VersionId returns the version's metadata", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L307", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": { "$data": "x1000" } } } ], "data": { "x1000": { "$pattern": { "pattern": "x", "size": 1000 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${res.o1.versionId}" }, "expect": { "response": { "ContentLength": 1000, "VersionId": "${res.o1.versionId}", "ETag": { "$exists": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "ContentLength": 1000, "VersionId": "${res.o1.versionId}" } } } } ] }, { "id": "versioning-0057", "group": "versioning", "kind": "api", "title": "HeadObject without VersionId returns the latest version", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L380", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "v1" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "my-obj", "body": { "$data": "v2x100" } } } ], "data": { "v2x100": { "$pattern": { "pattern": "v2", "size": 200 } } }, "steps": [ { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "VersionId": "${res.o2.versionId}", "ContentLength": 200 } } } } ] }, { "id": "versioning-0058", "group": "versioning", "kind": "api", "title": "Object created before versioning is enabled remains readable as versionId=null", "description": "PutObject before versioning returns no VersionId; after enabling versioning a new PUT gets a real VersionId, GetObject with VersionId=null returns the original bytes, and a plain GetObject returns the new version. Original tolerated a missing VersionId on the null-version GET (MinIO); AWS returns 'null'.", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L93", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "original data" }, "expect": { "response": { "VersionId": { "$absent": true } } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "new data" }, "capture": { "newVersionId": "VersionId" }, "expect": { "response": { "VersionId": { "$exists": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "null" }, "expect": { "body": "original data", "response": { "VersionId": "null" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "body": "new data", "response": { "VersionId": "${cap.newVersionId}" } } } } ] }, { "id": "versioning-0059", "group": "versioning", "kind": "api", "title": "Overwrites after enabling versioning create new versions above the null version", "description": "A null-version object exists, versioning is enabled, then two more PUTs. The latest GET returns the newest body and VersionId, and the intermediate version stays retrievable by its id (which also proves the two new version ids differ, as the original asserted).", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L141", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "v1" } } ], "steps": [ { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "v2" }, "capture": { "vid1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "v3" }, "capture": { "vid2": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "body": "v3", "response": { "VersionId": "${cap.vid2}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.vid1}" }, "expect": { "body": "v2" } } } ] }, { "id": "versioning-0060", "group": "versioning", "kind": "api", "title": "PutObject to a versioning-enabled bucket returns a non-empty VersionId", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_basic.py#L40", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "test data" }, "expect": { "response": { "VersionId": { "$matches": "^.+$" } } } } } ] }, { "id": "versioning-0061", "group": "versioning", "kind": "api", "title": "CopyObject with a versionId CopySource copies the specified (older) version", "tags": [ "tier-1", "versioning", "copy", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L360", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "src-obj", "body": "version 1 data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "src-obj", "body": "version 2 data" } } ], "steps": [ { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj", "CopySource": "${res.b1.name}/src-obj?versionId=${res.o1.versionId}" }, "expect": { "response": { "VersionId": { "$exists": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj" }, "expect": { "body": "version 1 data" } } } ] }, { "id": "versioning-0062", "group": "versioning", "kind": "api", "title": "CopyObject onto an existing key in a versioned bucket creates a new version", "tags": [ "tier-1", "versioning", "copy", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L279", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$bucket": { "handle": "b2", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b2", "key": "src-obj", "body": { "$data": "src" } } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "dest-obj", "body": "old data" } } ], "data": { "src": { "$pattern": { "pattern": "z", "size": 2345 } } }, "steps": [ { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj", "CopySource": "${res.b2.name}/src-obj" }, "capture": { "newVersion": "VersionId" }, "expect": { "response": { "VersionId": { "$exists": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj" }, "expect": { "response": { "VersionId": "${cap.newVersion}" }, "body": { "$data": "src" } } } } ] }, { "id": "versioning-0063", "group": "versioning", "kind": "api", "title": "DeleteObject with VersionId=null permanently removes the pre-versioning null version", "description": "An object written before versioning is enabled has version id \"null\". Deleting that null version specifically removes it; a versioned GET of the null version then fails. The source test accepted NoSuchVersion/NoSuchKey/404; AWS returns NoSuchVersion.", "tags": [ "tier-3", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L201", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "null version data" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": "versioned data" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "null" }, "expect": { "response": { "VersionId": "null" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "null" }, "expect": { "status": 404, "error": "NoSuchVersion" } } } ] }, { "id": "versioning-0064", "group": "versioning", "kind": "api", "title": "Deleting a delete marker restores visibility of the previous version", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L155", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "original data" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "dmVersion": "VersionId" }, "expect": { "response": { "DeleteMarker": true } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.dmVersion}" }, "expect": { "response": { "DeleteMarker": true } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "VersionId": "${res.o1.versionId}" }, "body": "original data" } } } ] }, { "id": "versioning-0065", "group": "versioning", "kind": "api", "title": "DeleteObject with versioning suspended returns 204 and existing versions remain readable", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L241", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "v1" } } ], "steps": [ { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "status": 204 } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${res.o1.versionId}" }, "expect": { "body": "v1" } } } ] }, { "id": "versioning-0066", "group": "versioning", "kind": "api", "title": "DeleteObjects with explicit version IDs permanently removes the delete marker and the object version", "tags": [ "tier-1", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L445", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "data" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "dmVersion": "VersionId" } } }, { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "my-obj", "VersionId": "${cap.dmVersion}" }, { "Key": "my-obj", "VersionId": "${res.o1.versionId}" } ] } }, "expect": { "response": { "Deleted": { "$length": 2 } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "versioning-0067", "group": "versioning", "kind": "api", "title": "DeleteObjects on a versioned bucket creates delete markers hiding all keys", "tags": [ "tier-1", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L400", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "obj1", "body": "test data" } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "obj2", "body": "test data" } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "obj3", "body": "test data" } } ], "steps": [ { "$operation": { "name": "DeleteObjects", "params": { "Bucket": "${res.b1.name}", "Delete": { "Objects": [ { "Key": "obj1" }, { "Key": "obj2" }, { "Key": "obj3" } ] } }, "expect": { "response": { "Deleted": { "$length": 3 } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj1" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj2" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj3" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "versioning-0068", "group": "versioning", "kind": "api", "title": "GetObject addressing a delete-marker version returns MethodNotAllowed", "tags": [ "tier-1", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L117", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "dmVersion": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.dmVersion}" }, "expect": { "status": 405, "error": "MethodNotAllowed" } } } ] }, { "id": "versioning-0069", "group": "versioning", "kind": "api", "title": "GetObject without version ID on a key whose latest version is a delete marker returns NoSuchKey", "tags": [ "tier-1", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L86", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "versioning-0070", "group": "versioning", "kind": "api", "title": "HeadObject on a delete-marker version returns 405; HeadObject without version returns 404", "tags": [ "tier-1", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_delete_copy.py#L39", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "my-obj", "body": { "$data": "x2000" } } } ], "data": { "x2000": { "$pattern": { "pattern": "x", "size": 2000 } } }, "steps": [ { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "dmVersion": "VersionId" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.dmVersion}" }, "expect": { "status": 405 } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "status": 404 } } } ] }, { "id": "versioning-0071", "group": "versioning", "kind": "api", "title": "Aborted multipart upload on a versioned bucket creates no version", "tags": [ "tier-3", "versioning", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_multipart.py#L342", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "data": { "part": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part" } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$absent": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "versioning-0072", "group": "versioning", "kind": "api", "title": "Multipart upload over existing versions creates a distinct third, latest version", "tags": [ "tier-3", "versioning", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_multipart.py#L89", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "data": { "v1": { "$pattern": { "pattern": "v1", "size": 200 } }, "v2": { "$pattern": { "pattern": "v2", "size": 200 } }, "part3": { "$pattern": { "pattern": "v3", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": { "$data": "v1" } }, "capture": { "ver1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Body": { "$data": "v2" } }, "capture": { "ver2": "VersionId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part3" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part3" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" } ] } }, "capture": { "ver3": "VersionId" }, "expect": { "response": { "VersionId": { "$exists": true } } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$length": 3 } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "VersionId": "${cap.ver3}", "ContentLength": 10485760 } } } } ] }, { "id": "versioning-0073", "group": "versioning", "kind": "api", "title": "CompleteMultipartUpload on a versioned bucket returns a VersionId", "tags": [ "tier-1", "versioning", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_multipart.py#L33", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "data": { "part": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "part" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "part" } }, "capture": { "etag4": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "part" } }, "capture": { "etag5": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" }, { "PartNumber": 3, "ETag": "${cap.etag3}" }, { "PartNumber": 4, "ETag": "${cap.etag4}" }, { "PartNumber": 5, "ETag": "${cap.etag5}" } ] } }, "capture": { "version": "VersionId" }, "expect": { "response": { "VersionId": { "$exists": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "VersionId": "${cap.version}", "ContentLength": 26214400 } } } } ] }, { "id": "versioning-0074", "group": "versioning", "kind": "api", "title": "Multipart upload metadata and content type are preserved on the created version", "tags": [ "tier-1", "versioning", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_multipart.py#L284", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "data": { "part": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Metadata": { "key1": "value1", "key2": "value2" }, "ContentType": "application/octet-stream" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" } ] } }, "capture": { "version": "VersionId" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "VersionId": "${cap.version}" }, "expect": { "response": { "Metadata": { "key1": "value1", "key2": "value2" }, "ContentType": "application/octet-stream" } } } } ] }, { "id": "versioning-0075", "group": "versioning", "kind": "api", "title": "UploadPartCopy from a specific source version copies that version's bytes", "tags": [ "tier-1", "versioning", "multipart", "copy", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_versioning_multipart.py#L207", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "src-obj", "body": { "$data": "z5" } } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "src-obj", "body": { "$data": "y5" } } } ], "data": { "z5": { "$pattern": { "pattern": "z", "size": 5242880 } }, "y5": { "$pattern": { "pattern": "y", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/src-obj?versionId=${res.o1.versionId}" }, "capture": { "partEtag": "CopyPartResult.ETag" }, "expect": { "response": { "CopySourceVersionId": "${res.o1.versionId}" } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "Parts": [ { "PartNumber": 1, "Size": 5242880 } ] } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.partEtag}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "dest-obj" }, "expect": { "body": { "$data": "z5" } } } } ] }, { "id": "versioning-0076", "group": "versioning", "kind": "api", "title": "Copy-to-self with REPLACE metadata creates a new version each time", "description": "On a versioned bucket, each CopyObject onto the same key with MetadataDirective REPLACE creates a distinct version that retains its own metadata.", "tags": [ "tier-3", "versioning", "copy", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3009.py#L231", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned/config.yaml", "Body": "config: initial", "Metadata": { "version": "0" } } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned/config.yaml", "CopySource": "${res.b1.name}/versioned/config.yaml", "MetadataDirective": "REPLACE", "Metadata": { "version": "1" } }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned/config.yaml", "CopySource": "${res.b1.name}/versioned/config.yaml", "MetadataDirective": "REPLACE", "Metadata": { "version": "2" } }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned/config.yaml", "CopySource": "${res.b1.name}/versioned/config.yaml", "MetadataDirective": "REPLACE", "Metadata": { "version": "3" } }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned/config.yaml", "VersionId": "${cap.v1}" }, "expect": { "response": { "Metadata": { "version": "1" } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned/config.yaml", "VersionId": "${cap.v2}" }, "expect": { "response": { "Metadata": { "version": "2" } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned/config.yaml", "VersionId": "${cap.v3}" }, "expect": { "response": { "Metadata": { "version": "3" } } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}", "Prefix": "versioned/config.yaml" }, "expect": { "response": { "Versions": { "$length": 4 } } } } } ] }, { "id": "versioning-0077", "group": "versioning", "kind": "api", "title": "A captured version is immutable under subsequent overwrites", "description": "After capturing version IDs, overwriting the keys with new versions does not change the bytes returned when reading the captured versions by VersionId.", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3013.py#L136", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.txt", "Body": "initial-0" }, "capture": { "vA1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0001.txt", "Body": "initial-1" }, "capture": { "vB1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.txt", "Body": "update-0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0001.txt", "Body": "update-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.txt", "VersionId": "${cap.vA1}" }, "expect": { "body": "initial-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0001.txt", "VersionId": "${cap.vB1}" }, "expect": { "body": "initial-1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.txt", "Body": "AFTER-SNAPSHOT-UPDATE" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0001.txt", "Body": "AFTER-SNAPSHOT-UPDATE" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0000.txt", "VersionId": "${cap.vA1}" }, "expect": { "body": "initial-0" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/object-0001.txt", "VersionId": "${cap.vB1}" }, "expect": { "body": "initial-1" } } } ] }, { "id": "versioning-0078", "group": "versioning", "kind": "api", "title": "Historical versions are retrievable by VersionId", "description": "On a versioned bucket, each PutObject creates a distinct version; GetObject with a VersionId returns that version's bytes, and GetObject without one returns the latest.", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3013.py#L32", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/time-travel.txt", "Body": "version-0" }, "capture": { "v0": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/time-travel.txt", "Body": "version-1" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/time-travel.txt", "Body": "version-2" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/time-travel.txt", "Body": "version-3" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/time-travel.txt", "VersionId": "${cap.v1}" }, "expect": { "body": "version-1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/time-travel.txt", "VersionId": "${cap.v2}" }, "expect": { "body": "version-2" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "data/time-travel.txt" }, "expect": { "body": "version-3" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}", "Prefix": "data/time-travel.txt" }, "expect": { "response": { "Versions": { "$length": 4 } } } } } ] }, { "id": "versioning-0079", "group": "versioning", "kind": "api", "title": "Enable then suspend bucket versioning across the object version lifecycle", "description": "New bucket reports no versioning; enabling produces distinct versions retrievable by VersionId; suspending stops new-version creation and GetObject returns the latest write.", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/200.py#L14", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": { "$absent": true } } } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Enabled" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Enabled" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object.txt", "Body": "Version 1 content\n", "Metadata": { "version_num": "1" } }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object.txt", "Body": "Version 2 content\n", "Metadata": { "version_num": "2" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object.txt", "Body": "Version 3 content\n", "Metadata": { "version_num": "3" } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$length": 3 } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object.txt", "VersionId": "${cap.v1}" }, "expect": { "status": 200, "body": "Version 1 content\n" } } }, { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object.txt", "Body": "Final version after suspension\n" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object.txt" }, "expect": { "status": 200, "body": "Final version after suspension\n" } } } ] }, { "id": "versioning-0080", "group": "versioning", "kind": "api", "title": "Three PUTs of one key on a versioned bucket yield three versions", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/240.py#L14", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object.txt", "Body": "Version 0" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object.txt", "Body": "Version 1" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object.txt", "Body": "Version 2" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": { "$length": 3 } } } } } ] }, { "id": "versioning-0081", "group": "versioning", "kind": "api", "title": "New bucket reports no versioning status", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_bucket_versioning.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "status": 200, "response": { "Status": { "$absent": true } } } } } ] }, { "id": "versioning-0082", "group": "versioning", "kind": "api", "title": "Repeated puts create distinct retrievable versions, listed newest-first", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_bucket_versioning.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "Body": "Version 1 content" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "Body": "Version 2 content" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "Body": "Version 3 content" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object" }, "expect": { "body": "Version 3 content" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "VersionId": "${cap.v1}" }, "expect": { "body": "Version 1 content" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "VersionId": "${cap.v2}" }, "expect": { "body": "Version 2 content" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "versioned-object", "VersionId": "${cap.v3}" }, { "Key": "versioned-object", "VersionId": "${cap.v2}" }, { "Key": "versioned-object", "VersionId": "${cap.v1}" } ] } } } } ] }, { "id": "versioning-0083", "group": "versioning", "kind": "api", "title": "Deleting a specific version leaves the other versions intact", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_bucket_versioning.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "Body": "Version 1 content" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "Body": "Version 2 content" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "Body": "Version 3 content" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Versions": [ { "Key": "versioned-object", "VersionId": "${cap.v3}" }, { "Key": "versioned-object", "VersionId": "${cap.v1}" } ] } } } } ] }, { "id": "versioning-0084", "group": "versioning", "kind": "api", "title": "Deleting current version creates a delete marker; removing it restores the object", "tags": [ "tier-3", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_bucket_versioning.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "Body": "Version 1 content" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "Body": "Version 2 content" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "Body": "Version 3 content" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object" }, "capture": { "marker": "VersionId" }, "expect": { "response": { "DeleteMarker": true } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "DeleteMarkers": { "$length": 1 } } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object", "VersionId": "${cap.marker}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "versioned-object" }, "expect": { "body": "Version 3 content" } } } ] }, { "id": "versioning-0085", "group": "versioning", "kind": "api", "title": "Suspending versioning makes a new put get the null version id", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_bucket_versioning.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutBucketVersioning", "params": { "Bucket": "${res.b1.name}", "VersioningConfiguration": { "Status": "Suspended" } } } }, { "$operation": { "name": "GetBucketVersioning", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Status": "Suspended" } } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "suspended-test", "Body": "test with suspended versioning" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "suspended-test" }, "expect": { "response": { "VersionId": "null" } } } } ] }, { "id": "versioning-0086", "group": "versioning", "kind": "api", "title": "Each version retains its own user metadata", "tags": [ "tier-1", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_bucket_versioning.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-test", "Body": "version 1 with metadata", "Metadata": { "test-key": "test-value-1", "version": "1" } }, "capture": { "m1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-test", "Body": "version 2 with metadata", "Metadata": { "test-key": "test-value-2", "version": "2" } }, "capture": { "m2": "VersionId" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-test", "VersionId": "${cap.m1}" }, "expect": { "response": { "Metadata": { "version": "1" } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-test", "VersionId": "${cap.m2}" }, "expect": { "response": { "Metadata": { "version": "2" } } } } } ] }, { "id": "versioning-0087", "group": "versioning", "kind": "api", "title": "Copy the current object and copy a specific version by id", "tags": [ "tier-1", "versioning", "copy", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_bucket_versioning.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "copy-source", "Body": "source for copying" }, "capture": { "src": "VersionId" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "copy-dest", "CopySource": "${res.b1.name}/copy-source" } } }, { "$operation": { "name": "CopyObject", "params": { "Bucket": "${res.b1.name}", "Key": "copy-dest-v2", "CopySource": "${res.b1.name}/copy-source?versionId=${cap.src}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "copy-dest" }, "expect": { "body": "source for copying" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "copy-dest-v2" }, "expect": { "body": "source for copying" } } } ] }, { "id": "versioning-0088", "group": "versioning", "kind": "api", "title": "Two multipart uploads to one key create two independent versions", "tags": [ "tier-1", "versioning", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_bucket_versioning.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "data": { "aaa": { "$pattern": { "pattern": "A", "size": 5242880 } }, "bbb": { "$pattern": { "pattern": "B", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-versioned" }, "capture": { "u1": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-versioned", "UploadId": "${cap.u1}", "PartNumber": 1, "Body": { "$data": "aaa" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-versioned", "UploadId": "${cap.u1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" } ] } }, "capture": { "ver1": "VersionId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-versioned" }, "capture": { "u2": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-versioned", "UploadId": "${cap.u2}", "PartNumber": 1, "Body": { "$data": "bbb" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-versioned", "UploadId": "${cap.u2}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e2}" } ] } }, "capture": { "ver2": "VersionId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-versioned", "VersionId": "${cap.ver1}" }, "expect": { "body": { "$data": "aaa" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-versioned", "VersionId": "${cap.ver2}" }, "expect": { "body": { "$data": "bbb" } } } } ] }, { "id": "versioning-0089", "group": "versioning", "kind": "api", "title": "Delete marker hides object, version-id read bypasses it, removing the marker restores it", "tags": [ "tier-1", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_delete_markers.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "delete-marker-test", "Body": "version1" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "delete-marker-test" }, "capture": { "marker": "VersionId" }, "expect": { "response": { "DeleteMarker": true } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "delete-marker-test" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "delete-marker-test", "VersionId": "${cap.v1}" }, "expect": { "body": "version1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "delete-marker-test", "VersionId": "${cap.marker}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "delete-marker-test" }, "expect": { "body": "version1" } } } ] }, { "id": "versioning-0090", "group": "versioning", "kind": "api", "title": "Three put/delete cycles yield three versions and three delete markers", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_delete_markers.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "multiple-delete-markers", "Body": "v1" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "multiple-delete-markers" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "multiple-delete-markers", "Body": "v2" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "multiple-delete-markers" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "multiple-delete-markers", "Body": "v3" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "multiple-delete-markers" } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}", "Prefix": "multiple-delete-markers" }, "expect": { "response": { "Versions": { "$length": 3 }, "DeleteMarkers": { "$length": 3 } } } } } ] }, { "id": "versioning-0091", "group": "versioning", "kind": "api", "title": "Deleting a non-current version preserves the remaining versions", "tags": [ "tier-1", "versioning", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_delete_markers.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "specific-version-delete", "Body": "version1" }, "capture": { "v1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "specific-version-delete", "Body": "version2" }, "capture": { "v2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "specific-version-delete", "Body": "version3" }, "capture": { "v3": "VersionId" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "specific-version-delete", "VersionId": "${cap.v2}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "specific-version-delete", "VersionId": "${cap.v2}" }, "expect": { "status": 404, "error": "NoSuchVersion" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "specific-version-delete", "VersionId": "${cap.v1}" }, "expect": { "body": "version1" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "specific-version-delete" }, "expect": { "body": "version3" } } } ] }, { "id": "versioning-0092", "group": "versioning", "kind": "api", "title": "Deleting an already-deleted object creates a second, distinct delete marker", "tags": [ "tier-3", "versioning", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/versioning/test_delete_markers.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "double-delete", "Body": "test" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "double-delete" }, "expect": { "response": { "DeleteMarker": true } } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "double-delete" }, "expect": { "response": { "DeleteMarker": true } } } }, { "$operation": { "name": "ListObjectVersions", "params": { "Bucket": "${res.b1.name}", "Prefix": "double-delete" }, "expect": { "response": { "DeleteMarkers": { "$length": 2 } } } } } ] } ] }