{ "$schema": "../schema/vector.schema.json", "vectors": [ { "id": "multipart-0001", "group": "multipart", "kind": "api", "title": "Aborting a multipart upload leaves no object", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6487", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "obj": { "$prng": { "seed": "multipart-0001/obj", "size": 10485760 } }, "ap1": { "$slice": { "of": "obj", "offset": 0, "length": 5242880 } }, "ap2": { "$slice": { "of": "obj", "offset": 5242880, "length": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "ap1" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "ap2" } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}" } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "mymultipart" }, "expect": { "response": { "Contents": { "$absent": true } } } } } ] }, { "id": "multipart-0002", "group": "multipart", "kind": "api", "title": "AbortMultipartUpload with an unknown UploadId returns NoSuchUpload", "tags": [ "tier-1", "multipart", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6499", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "mymultipart" } } ], "steps": [ { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "56788" }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0003", "group": "multipart", "kind": "api", "title": "An in-progress multipart upload does not replace the existing object until completed", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L7469", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": "bar" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "body": "bar" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "UploadId": "${cap.uploadId}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "expect": { "body": "bar" } } } ] }, { "id": "multipart-0004", "group": "multipart", "kind": "api", "title": "ListMultipartUploads reports all in-progress uploads", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6511", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "u1": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "u2": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart2" }, "capture": { "u3": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$contains": { "UploadId": "${cap.u1}" } } } } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$contains": { "UploadId": "${cap.u2}" } } } } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$contains": { "UploadId": "${cap.u3}" } } } } } } ] }, { "id": "multipart-0005", "group": "multipart", "kind": "api", "title": "ListMultipartUploads reports each upload's initiator and owner identity", "tags": [ "tier-3", "multipart", "acl", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6542", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$credential": { "handle": "alt" } } ], "steps": [ { "$operation": { "name": "PutBucketAcl", "params": { "Bucket": "${res.b1.name}", "ACL": "public-read-write" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart1" }, "identity": "main", "capture": { "u1": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart2" }, "identity": "alt", "capture": { "u2": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "identity": "main", "expect": { "response": { "Uploads": [ { "Key": "multipart1", "UploadId": "${cap.u1}", "Initiator": { "ID": { "$exists": true } }, "Owner": { "ID": { "$exists": true } } }, { "Key": "multipart2", "UploadId": "${cap.u2}", "Initiator": { "ID": "${res.alt.canonicalId}", "DisplayName": "${res.alt.displayName}" }, "Owner": { "ID": "${res.alt.canonicalId}", "DisplayName": "${res.alt.displayName}" } } ] } } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "identity": "alt", "expect": { "response": { "Uploads": [ { "Key": "multipart1", "UploadId": "${cap.u1}", "Initiator": { "ID": { "$exists": true } }, "Owner": { "ID": { "$exists": true } } }, { "Key": "multipart2", "UploadId": "${cap.u2}", "Initiator": { "ID": "${res.alt.canonicalId}", "DisplayName": "${res.alt.displayName}" }, "Owner": { "ID": "${res.alt.canonicalId}", "DisplayName": "${res.alt.displayName}" } } ] } } } } ] }, { "id": "multipart-0006", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with a bad top-level SHA256 checksum returns BadDigest", "tags": [ "tier-1", "multipart", "checksums", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L15006", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 1024 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "ChecksumAlgorithm": "SHA256" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "ChecksumAlgorithm": "SHA256" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" }, "ChecksumAlgorithm": "SHA256", "ChecksumSHA256": "${data.pa.sha256B64}" }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "ChecksumSHA256": "bad", "MultipartUpload": { "Parts": [ { "ETag": "${cap.e1}", "ChecksumSHA256": "${data.pa.sha256B64}", "PartNumber": 1 } ] } }, "expect": { "status": 400, "error": "InvalidRequest" } } } ] }, { "id": "multipart-0007", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with a missing per-part checksum and bad top-level checksum returns BadDigest", "tags": [ "tier-1", "multipart", "checksums", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L15034", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 1024 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart2", "ChecksumAlgorithm": "SHA256" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "ChecksumAlgorithm": "SHA256" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart2", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" }, "ChecksumAlgorithm": "SHA256", "ChecksumSHA256": "${data.pa.sha256B64}" }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart2", "UploadId": "${cap.uploadId}", "ChecksumSHA256": "bad", "MultipartUpload": { "Parts": [ { "ETag": "${cap.e1}", "PartNumber": 1 } ] } }, "expect": { "status": 400, "error": "InvalidRequest" } } } ] }, { "id": "multipart-0008", "group": "multipart", "kind": "api", "title": "Multipart upload with SHA256 checksum completes and reports the composite checksum on demand", "tags": [ "tier-1", "multipart", "checksums", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L15050", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 1024 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumAlgorithm": "SHA256" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "ChecksumAlgorithm": "SHA256" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" }, "ChecksumAlgorithm": "SHA256", "ChecksumSHA256": "${data.pa.sha256B64}" }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "ChecksumSHA256": "Ok6Cs5b96ux6+MWQkJO7UBT5sKPBeXBLwvj/hK89smg=-1", "MultipartUpload": { "Parts": [ { "ETag": "${cap.e1}", "ChecksumSHA256": "${data.pa.sha256B64}", "PartNumber": 1 } ] } }, "expect": { "response": { "ChecksumSHA256": "Ok6Cs5b96ux6+MWQkJO7UBT5sKPBeXBLwvj/hK89smg=-1" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3" }, "expect": { "response": { "ChecksumSHA256": { "$absent": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumSHA256": "Ok6Cs5b96ux6+MWQkJO7UBT5sKPBeXBLwvj/hK89smg=-1" } } } } ] }, { "id": "multipart-0009", "group": "multipart", "kind": "api", "title": "UploadPartCopy with syntactically invalid CopySourceRange values returns InvalidArgument", "tags": [ "tier-1", "multipart", "copy", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6135", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source", "body": { "$data": "src" } } } ], "data": { "src": { "$prng": { "seed": "multipart-0009/src", "size": 5 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "dest" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "Key": "dest", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/source", "CopySourceRange": "0-2" }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "Key": "dest", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/source", "CopySourceRange": "bytes=0" }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "Key": "dest", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/source", "CopySourceRange": "bytes=hello-world" }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "Key": "dest", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/source", "CopySourceRange": "bytes=0-bar" }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "Key": "dest", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/source", "CopySourceRange": "bytes=hello-" }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "Key": "dest", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/source", "CopySourceRange": "bytes=0-2,3-5" }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0010", "group": "multipart", "kind": "api", "title": "UploadPartCopy with a CopySourceRange past the end of the source returns InvalidRange", "description": "Original accepts HTTP status 400 or 416 with error code InvalidRange; only the error code is asserted here.", "tags": [ "tier-1", "multipart", "copy", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6113", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source", "body": { "$data": "src" } } } ], "data": { "src": { "$prng": { "seed": "multipart-0010/src", "size": 5 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "dest" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "Key": "dest", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/source", "CopySourceRange": "bytes=0-21" }, "expect": { "error": "InvalidArgument" } } } ] }, { "id": "multipart-0011", "group": "multipart", "kind": "api", "title": "Multipart copy of a prefix of a 12MiB source at sizes straddling the part boundary", "description": "Original copies six prefix sizes; this vector covers representative 1-, 2- and 3-part copy sizes and verifies each destination equals the source prefix.", "tags": [ "tier-1", "multipart", "copy", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6373", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$bucket": { "handle": "b2" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": { "$data": "src" } } } ], "data": { "src": { "$prng": { "seed": "multipart-0011/src", "size": 12582912 } }, "c1": { "$slice": { "of": "src", "offset": 0, "length": 5242880 } }, "c2": { "$slice": { "of": "src", "offset": 0, "length": 5345280 } }, "c3": { "$slice": { "of": "src", "offset": 0, "length": 11100160 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "uA": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uA}", "PartNumber": 1, "CopySource": "${res.b1.name}/foo", "CopySourceRange": "bytes=0-5242879" }, "capture": { "a1": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uA}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.a1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 5242880 }, "body": { "$data": "c1" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "uB": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uB}", "PartNumber": 1, "CopySource": "${res.b1.name}/foo", "CopySourceRange": "bytes=0-5242879" }, "capture": { "b1c": "CopyPartResult.ETag" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uB}", "PartNumber": 2, "CopySource": "${res.b1.name}/foo", "CopySourceRange": "bytes=5242880-5345279" }, "capture": { "b2c": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uB}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.b1c}" }, { "PartNumber": 2, "ETag": "${cap.b2c}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 5345280 }, "body": { "$data": "c2" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "uC": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uC}", "PartNumber": 1, "CopySource": "${res.b1.name}/foo", "CopySourceRange": "bytes=0-5242879" }, "capture": { "d1": "CopyPartResult.ETag" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uC}", "PartNumber": 2, "CopySource": "${res.b1.name}/foo", "CopySourceRange": "bytes=5242880-10485759" }, "capture": { "d2": "CopyPartResult.ETag" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uC}", "PartNumber": 3, "CopySource": "${res.b1.name}/foo", "CopySourceRange": "bytes=10485760-11100159" }, "capture": { "d3": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uC}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.d1}" }, { "PartNumber": 2, "ETag": "${cap.d2}" }, { "PartNumber": 3, "ETag": "${cap.d3}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 11100160 }, "body": { "$data": "c3" } } } } ] }, { "id": "multipart-0012", "group": "multipart", "kind": "api", "title": "UploadPartCopy of a single byte from a 7MiB source object", "tags": [ "tier-1", "multipart", "copy", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6096", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$bucket": { "handle": "b2" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "foo", "body": { "$data": "src" } } } ], "data": { "src": { "$prng": { "seed": "multipart-0012/src", "size": 7340032 } }, "f1": { "$slice": { "of": "src", "offset": 0, "length": 1 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/foo", "CopySourceRange": "bytes=0-0" }, "capture": { "c1": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.c1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 1 }, "body": { "$data": "f1" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Range": "bytes=0-0" }, "expect": { "body": { "$data": "f1" } } } } ] }, { "id": "multipart-0013", "group": "multipart", "kind": "api", "title": "Multipart copy from source keys with special names (space, underscores, '?versionId')", "tags": [ "tier-1", "multipart", "copy", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6192", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$bucket": { "handle": "b2" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": " ", "body": { "$data": "src1" } } }, { "$object": { "handle": "o2", "bucket": "b1", "key": "_", "body": { "$data": "src2" } } }, { "$object": { "handle": "o3", "bucket": "b1", "key": "__", "body": { "$data": "src3" } } }, { "$object": { "handle": "o4", "bucket": "b1", "key": "?versionId", "body": { "$data": "src4" } } } ], "data": { "src1": { "$prng": { "seed": "multipart-0013/src1", "size": 7340032 } }, "src2": { "$prng": { "seed": "multipart-0013/src2", "size": 7340032 } }, "src3": { "$prng": { "seed": "multipart-0013/src3", "size": 7340032 } }, "src4": { "$prng": { "seed": "multipart-0013/src4", "size": 7340032 } }, "f1": { "$slice": { "of": "src1", "offset": 0, "length": 1 } }, "f2": { "$slice": { "of": "src2", "offset": 0, "length": 1 } }, "f3": { "$slice": { "of": "src3", "offset": 0, "length": 1 } }, "f4": { "$slice": { "of": "src4", "offset": 0, "length": 1 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "u1": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u1}", "PartNumber": 1, "CopySource": { "Bucket": "${res.b1.name}", "Key": " " }, "CopySourceRange": "bytes=0-0" }, "capture": { "c1": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.c1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 1 }, "body": { "$data": "f1" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": " ", "Range": "bytes=0-0" }, "expect": { "body": { "$data": "f1" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "u2": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u2}", "PartNumber": 1, "CopySource": { "Bucket": "${res.b1.name}", "Key": "_" }, "CopySourceRange": "bytes=0-0" }, "capture": { "c2": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u2}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.c2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 1 }, "body": { "$data": "f2" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "_", "Range": "bytes=0-0" }, "expect": { "body": { "$data": "f2" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "u3": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u3}", "PartNumber": 1, "CopySource": { "Bucket": "${res.b1.name}", "Key": "__" }, "CopySourceRange": "bytes=0-0" }, "capture": { "c3": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u3}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.c3}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 1 }, "body": { "$data": "f3" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "__", "Range": "bytes=0-0" }, "expect": { "body": { "$data": "f3" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "u4": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u4}", "PartNumber": 1, "CopySource": { "Bucket": "${res.b1.name}", "Key": "?versionId" }, "CopySourceRange": "bytes=0-0" }, "capture": { "c4": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u4}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.c4}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 1 }, "body": { "$data": "f4" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "?versionId", "Range": "bytes=0-0" }, "expect": { "body": { "$data": "f4" } } } } ] }, { "id": "multipart-0014", "group": "multipart", "kind": "api", "title": "Multipart copy of each version of a versioned source object", "tags": [ "tier-1", "multipart", "copy", "versioning", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6285", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } }, { "$bucket": { "handle": "b2" } } ], "data": { "v1": { "$prng": { "seed": "multipart-0014/v1", "size": 15728640 } }, "v2": { "$prng": { "seed": "multipart-0014/v2", "size": 15728640 } }, "v3": { "$prng": { "seed": "multipart-0014/v3", "size": 15728640 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": { "$data": "v1" } }, "capture": { "vid1": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": { "$data": "v2" } }, "capture": { "vid2": "VersionId" } } }, { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "Body": { "$data": "v3" } }, "capture": { "vid3": "VersionId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "u1": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u1}", "PartNumber": 1, "CopySource": "${res.b1.name}/foo?versionId=${cap.vid1}", "CopySourceRange": "bytes=0-5242879" }, "capture": { "a1": "CopyPartResult.ETag" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u1}", "PartNumber": 2, "CopySource": "${res.b1.name}/foo?versionId=${cap.vid1}", "CopySourceRange": "bytes=5242880-10485759" }, "capture": { "a2": "CopyPartResult.ETag" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u1}", "PartNumber": 3, "CopySource": "${res.b1.name}/foo?versionId=${cap.vid1}", "CopySourceRange": "bytes=10485760-15728639" }, "capture": { "a3": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.a1}" }, { "PartNumber": 2, "ETag": "${cap.a2}" }, { "PartNumber": 3, "ETag": "${cap.a3}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 15728640 }, "body": { "$data": "v1" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "u2": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u2}", "PartNumber": 1, "CopySource": "${res.b1.name}/foo?versionId=${cap.vid2}", "CopySourceRange": "bytes=0-5242879" }, "capture": { "b1c": "CopyPartResult.ETag" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u2}", "PartNumber": 2, "CopySource": "${res.b1.name}/foo?versionId=${cap.vid2}", "CopySourceRange": "bytes=5242880-10485759" }, "capture": { "b2c": "CopyPartResult.ETag" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u2}", "PartNumber": 3, "CopySource": "${res.b1.name}/foo?versionId=${cap.vid2}", "CopySourceRange": "bytes=10485760-15728639" }, "capture": { "b3c": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u2}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.b1c}" }, { "PartNumber": 2, "ETag": "${cap.b2c}" }, { "PartNumber": 3, "ETag": "${cap.b3c}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 15728640 }, "body": { "$data": "v2" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "capture": { "u3": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u3}", "PartNumber": 1, "CopySource": "${res.b1.name}/foo?versionId=${cap.vid3}", "CopySourceRange": "bytes=0-5242879" }, "capture": { "d1": "CopyPartResult.ETag" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u3}", "PartNumber": 2, "CopySource": "${res.b1.name}/foo?versionId=${cap.vid3}", "CopySourceRange": "bytes=5242880-10485759" }, "capture": { "d2": "CopyPartResult.ETag" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u3}", "PartNumber": 3, "CopySource": "${res.b1.name}/foo?versionId=${cap.vid3}", "CopySourceRange": "bytes=10485760-15728639" }, "capture": { "d3": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart", "UploadId": "${cap.u3}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.d1}" }, { "PartNumber": 2, "ETag": "${cap.d2}" }, { "PartNumber": 3, "ETag": "${cap.d3}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 15728640 }, "body": { "$data": "v3" } } } } ] }, { "id": "multipart-0015", "group": "multipart", "kind": "api", "title": "UploadPartCopy without CopySourceRange copies the whole source object", "tags": [ "tier-1", "multipart", "copy", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6165", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$bucket": { "handle": "b2" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source", "body": { "$data": "src" } } } ], "data": { "src": { "$prng": { "seed": "multipart-0015/src", "size": 10 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipartcopy" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipartcopy", "UploadId": "${cap.uploadId}", "PartNumber": 1, "CopySource": "${res.b1.name}/source" }, "capture": { "c1": "CopyPartResult.ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipartcopy", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.c1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b2.name}", "Key": "mymultipartcopy" }, "expect": { "response": { "ContentLength": 10 }, "body": { "$data": "src" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "source", "Range": "bytes=0-9" }, "expect": { "body": { "$data": "src" } } } } ] }, { "id": "multipart-0016", "group": "multipart", "kind": "api", "title": "GetObject/HeadObject with PartNumber on a completed multipart object", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6626", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "obj": { "$prng": { "seed": "multipart-0016/obj", "size": 16777216 } }, "gp1": { "$slice": { "of": "obj", "offset": 0, "length": 5242880 } }, "gp2": { "$slice": { "of": "obj", "offset": 5242880, "length": 5242880 } }, "gp3": { "$slice": { "of": "obj", "offset": 10485760, "length": 5242880 } }, "gp4": { "$slice": { "of": "obj", "offset": 15728640, "length": 1048576 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "gp1" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "gp2" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "gp3" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "gp3" } }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "gp4" } }, "capture": { "e4": "ETag" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 1 }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" }, { "PartNumber": 4, "ETag": "${cap.e4}" } ] } }, "capture": { "cetag": "ETag" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 1 }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 1 }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}", "ContentLength": 5242880 }, "body": { "$data": "gp1" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 2 }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 2 }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}", "ContentLength": 5242880 }, "body": { "$data": "gp2" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 3 }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 3 }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}", "ContentLength": 5242880 }, "body": { "$data": "gp3" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 4 }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 4 }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}", "ContentLength": 1048576 }, "body": { "$data": "gp4" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 5 }, "expect": { "status": 416, "error": "InvalidPartNumber" } } } ] }, { "id": "multipart-0017", "group": "multipart", "kind": "api", "title": "Three-part SHA256 multipart upload yields a stable composite ETag and checksum across repeated completes", "tags": [ "tier-1", "multipart", "checksums", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L15071", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 5242880 } }, "pb": { "$pattern": { "pattern": "B", "size": 5242880 } }, "pc": { "$pattern": { "pattern": "C", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "ChecksumAlgorithm": "SHA256" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "ChecksumAlgorithm": "SHA256" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" }, "ChecksumAlgorithm": "SHA256", "ChecksumSHA256": "${data.pa.sha256B64}" }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "pb" }, "ChecksumAlgorithm": "SHA256", "ChecksumSHA256": "${data.pb.sha256B64}" }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "pc" }, "ChecksumAlgorithm": "SHA256", "ChecksumSHA256": "${data.pc.sha256B64}" }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "ChecksumSHA256": "uWBwpe1dxI4Vw8Gf0X9ynOdw/SS6VBzfWm9giiv1sf4=-3", "MultipartUpload": { "Parts": [ { "ETag": "${cap.e1}", "ChecksumSHA256": "${data.pa.sha256B64}", "PartNumber": 1 }, { "ETag": "${cap.e2}", "ChecksumSHA256": "${data.pb.sha256B64}", "PartNumber": 2 }, { "ETag": "${cap.e3}", "ChecksumSHA256": "${data.pc.sha256B64}", "PartNumber": 3 } ] } }, "capture": { "cetag": "ETag" }, "expect": { "response": { "ETag": { "$matches": "b2add96cc9702bbf4efb0ccdfc6b7747-3" }, "ChecksumSHA256": "uWBwpe1dxI4Vw8Gf0X9ynOdw/SS6VBzfWm9giiv1sf4=-3" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "ChecksumSHA256": "uWBwpe1dxI4Vw8Gf0X9ynOdw/SS6VBzfWm9giiv1sf4=-3", "MultipartUpload": { "Parts": [ { "ETag": "${cap.e1}", "ChecksumSHA256": "${data.pa.sha256B64}", "PartNumber": 1 }, { "ETag": "${cap.e2}", "ChecksumSHA256": "${data.pb.sha256B64}", "PartNumber": 2 }, { "ETag": "${cap.e3}", "ChecksumSHA256": "${data.pc.sha256B64}", "PartNumber": 3 } ] } }, "expect": { "response": { "ETag": "${cap.cetag}", "ChecksumSHA256": { "$absent": true } } } } } ] }, { "id": "multipart-0018", "group": "multipart", "kind": "api", "title": "GetObject/HeadObject with PartNumber on a single-part multipart object", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6723", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "sg": { "$prng": { "seed": "multipart-0018/sg", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "sg" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 1 }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" } ] } }, "capture": { "cetag": "ETag" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 1 }, "expect": { "response": { "PartsCount": 1, "ETag": "${cap.cetag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 1 }, "expect": { "response": { "PartsCount": 1, "ETag": "${cap.cetag}", "ContentLength": 5242880 }, "body": { "$data": "sg" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 5 }, "expect": { "status": 416, "error": "InvalidPartNumber" } } } ] }, { "id": "multipart-0019", "group": "multipart", "kind": "api", "title": "GetObject/HeadObject with PartNumber on an SSE-C multipart object", "description": "SSE-C customer key is the well-known s3-tests test key, supplied as raw key bytes via $base64.", "tags": [ "tier-1", "multipart", "sse", "encryption", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6669", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "obj": { "$prng": { "seed": "multipart-0019/obj", "size": 16777216 } }, "se1": { "$slice": { "of": "obj", "offset": 0, "length": 5242880 } }, "se2": { "$slice": { "of": "obj", "offset": 5242880, "length": 5242880 } }, "se3": { "$slice": { "of": "obj", "offset": 10485760, "length": 5242880 } }, "se4": { "$slice": { "of": "obj", "offset": 15728640, "length": 1048576 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "se1" }, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "se2" }, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "se3" }, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "se3" }, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "se4" }, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "capture": { "e4": "ETag" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 1 }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" }, { "PartNumber": 4, "ETag": "${cap.e4}" } ] }, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "capture": { "cetag": "ETag" } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 1, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 1, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}", "ContentLength": 5242880 }, "body": { "$data": "se1" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 2, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}", "ContentLength": 5242880 }, "body": { "$data": "se2" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 3, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}", "ContentLength": 5242880 }, "body": { "$data": "se3" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 4, "SSECustomerAlgorithm": "AES256", "SSECustomerKey": { "$base64": "pO3upElrwuEXSoFwCfnZPdSsmt/xWeFa0N9KgDijwVs=" }, "SSECustomerKeyMD5": "DWygnHRtgiJ77HCm+1rvHw==" }, "expect": { "response": { "PartsCount": 4, "ETag": "${cap.cetag}", "ContentLength": 1048576 }, "body": { "$data": "se4" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "PartNumber": 5 }, "expect": { "status": 400, "error": "InvalidPart" } } } ] }, { "id": "multipart-0020", "group": "multipart", "kind": "api", "title": "30MiB multipart upload with metadata and content-type, full and ranged read-back", "description": "Original also verifies the whole object via _check_content_using_range in 1MB and 10MB steps; a representative ranged GET of the first 1MB is asserted here.", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6226", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "big": { "$prng": { "seed": "multipart-0020/big", "size": 31457280 } }, "b1p": { "$slice": { "of": "big", "offset": 0, "length": 5242880 } }, "b2p": { "$slice": { "of": "big", "offset": 5242880, "length": 5242880 } }, "b3p": { "$slice": { "of": "big", "offset": 10485760, "length": 5242880 } }, "b4p": { "$slice": { "of": "big", "offset": 15728640, "length": 5242880 } }, "b5p": { "$slice": { "of": "big", "offset": 20971520, "length": 5242880 } }, "b6p": { "$slice": { "of": "big", "offset": 26214400, "length": 5242880 } }, "r0": { "$slice": { "of": "big", "offset": 0, "length": 1000000 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "ContentType": "text/bla", "Metadata": { "foo": "bar" } }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "b1p" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "b2p" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "b3p" } }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "b4p" } }, "capture": { "e4": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "b5p" } }, "capture": { "e5": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 6, "Body": { "$data": "b6p" } }, "capture": { "e6": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" }, { "PartNumber": 4, "ETag": "${cap.e4}" }, { "PartNumber": 5, "ETag": "${cap.e5}" }, { "PartNumber": 6, "ETag": "${cap.e6}" } ] } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" }, { "PartNumber": 4, "ETag": "${cap.e4}" }, { "PartNumber": 5, "ETag": "${cap.e5}" }, { "PartNumber": 6, "ETag": "${cap.e6}" } ] } }, "expect": { "status": 200 } } }, { "$operation": { "name": "ListObjectsV2", "params": { "Bucket": "${res.b1.name}", "Prefix": "mymultipart" }, "expect": { "response": { "Contents": [ { "Key": "mymultipart", "Size": 31457280 } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentType": "text/bla", "ContentLength": 31457280, "Metadata": { "foo": "bar" } }, "body": { "$data": "big" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "Range": "bytes=0-999999" }, "expect": { "response": { "ContentLength": 1000000 }, "body": { "$data": "r0" } } } } ] }, { "id": "multipart-0021", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with an unknown UploadId returns NoSuchUpload", "tags": [ "tier-1", "multipart", "errors", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6001", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "abc1234def", "MultipartUpload": { "Parts": [ { "ETag": "1234", "PartNumber": 1 } ] } }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0022", "group": "multipart", "kind": "api", "title": "Multipart upload of three 5MiB parts plus a 3MiB tail reads back concatenated", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6458", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "full": { "$prng": { "seed": "multipart-0022/full", "size": 18874368 } }, "cp1": { "$slice": { "of": "full", "offset": 0, "length": 5242880 } }, "cp2": { "$slice": { "of": "full", "offset": 5242880, "length": 5242880 } }, "cp3": { "$slice": { "of": "full", "offset": 10485760, "length": 5242880 } }, "cp4": { "$slice": { "of": "full", "offset": 15728640, "length": 3145728 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "cp1" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "cp2" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "cp3" } }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "cp4" } }, "capture": { "e4": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" }, { "PartNumber": 4, "ETag": "${cap.e4}" } ] } }, "expect": { "response": { "ETag": { "$matches": "-4" } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 18874368 }, "body": { "$data": "full" } } } } ] }, { "id": "multipart-0023", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with no parts (empty body) returns MalformedXML", "description": "boto3 sends an empty request body when MultipartUpload is omitted; expressed as a raw POST ?uploadId with an empty body.", "tags": [ "tier-1", "multipart", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L5988", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$http": { "method": "POST", "path": "/${res.b1.name}/mymultipart", "query": { "uploadId": "${cap.uploadId}" }, "body": "", "expect": { "status": 400, "error": "InvalidRequest" } } } ] }, { "id": "multipart-0024", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with a wrong part ETag returns InvalidPart", "tags": [ "tier-1", "multipart", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6606", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$base64": "AA==" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "ETag": "ffffffffffffffffffffffffffffffff", "PartNumber": 1 } ] } }, "expect": { "status": 400, "error": "InvalidPart" } } } ] }, { "id": "multipart-0025", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload referencing a part number that was never uploaded returns InvalidPart", "tags": [ "tier-1", "multipart", "errors", "source:ceph-s3-tests", "source:msst-s3" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6587", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$base64": "AA==" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "ETag": "${cap.e1}", "PartNumber": 9999 } ] } }, "expect": { "status": 400, "error": "InvalidPart" } } } ] }, { "id": "multipart-0026", "group": "multipart", "kind": "api", "title": "Multipart uploads at sizes straddling the 5MiB part boundary complete", "description": "Original exercises six sizes (5MiB, +100KiB, +600KiB, 10MiB+100KiB, 10MiB+600KiB, 10MiB); this vector covers representative 1-, 2- and 3-part sizes on the same key.", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6342", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "sA": { "$prng": { "seed": "multipart-0026/sA", "size": 5242880 } }, "sB": { "$prng": { "seed": "multipart-0026/sB", "size": 5345280 } }, "sBp1": { "$slice": { "of": "sB", "offset": 0, "length": 5242880 } }, "sBp2": { "$slice": { "of": "sB", "offset": 5242880, "length": 102400 } }, "sC": { "$prng": { "seed": "multipart-0026/sC", "size": 11100160 } }, "sCp1": { "$slice": { "of": "sC", "offset": 0, "length": 5242880 } }, "sCp2": { "$slice": { "of": "sC", "offset": 5242880, "length": 5242880 } }, "sCp3": { "$slice": { "of": "sC", "offset": 10485760, "length": 614400 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uA": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uA}", "PartNumber": 1, "Body": { "$data": "sA" } }, "capture": { "eA1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uA}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.eA1}" } ] } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uB": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uB}", "PartNumber": 1, "Body": { "$data": "sBp1" } }, "capture": { "eB1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uB}", "PartNumber": 2, "Body": { "$data": "sBp2" } }, "capture": { "eB2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uB}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.eB1}" }, { "PartNumber": 2, "ETag": "${cap.eB2}" } ] } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uC": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uC}", "PartNumber": 1, "Body": { "$data": "sCp1" } }, "capture": { "eC1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uC}", "PartNumber": 2, "Body": { "$data": "sCp2" } }, "capture": { "eC2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uC}", "PartNumber": 3, "Body": { "$data": "sCp3" } }, "capture": { "eC3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uC}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.eC1}" }, { "PartNumber": 2, "ETag": "${cap.eC2}" }, { "PartNumber": 3, "ETag": "${cap.eC3}" } ] } }, "expect": { "status": 200 } } } ] }, { "id": "multipart-0027", "group": "multipart", "kind": "api", "title": "Multipart upload succeeds on a bucket carrying an allow-all bucket policy", "description": "Original uploads 50MiB; a 10MiB two-part upload is used here since the point is that the bucket policy does not block the owner's multipart upload.", "tags": [ "tier-3", "multipart", "policy", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L14469", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "obj": { "$prng": { "seed": "multipart-0027/obj", "size": 10485760 } }, "pp1": { "$slice": { "of": "obj", "offset": 0, "length": 5242880 } }, "pp2": { "$slice": { "of": "obj", "offset": 5242880, "length": 5242880 } } }, "steps": [ { "$operation": { "name": "PutBucketPolicy", "params": { "Bucket": "${res.b1.name}", "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"*\",\"Resource\":[\"arn:aws:s3:::${res.b1.name}\",\"arn:aws:s3:::${res.b1.name}/*\"]}]}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "foo" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pp1" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "pp2" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "foo", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" } ] } }, "expect": { "status": 200 } } } ] }, { "id": "multipart-0028", "group": "multipart", "kind": "api", "title": "Multipart upload overwrites an existing single-PUT object", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6462", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "mymultipart", "body": { "$data": "part" } } } ], "data": { "full": { "$pattern": { "pattern": "12345", "size": 10485760 } }, "part": { "$pattern": { "pattern": "12345", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 10485760 }, "body": { "$data": "full" } } } } ] }, { "id": "multipart-0029", "group": "multipart", "kind": "api", "title": "Re-uploading a part with identical data before completing produces the correct object", "description": "Original repeats this for several resend sets ([0],[1],[2],[1,2],[0..5]); this vector re-sends part 2 as a representative case.", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6331", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "big": { "$prng": { "seed": "multipart-0029/big", "size": 31457280 } }, "b1p": { "$slice": { "of": "big", "offset": 0, "length": 5242880 } }, "b2p": { "$slice": { "of": "big", "offset": 5242880, "length": 5242880 } }, "b3p": { "$slice": { "of": "big", "offset": 10485760, "length": 5242880 } }, "b4p": { "$slice": { "of": "big", "offset": 15728640, "length": 5242880 } }, "b5p": { "$slice": { "of": "big", "offset": 20971520, "length": 5242880 } }, "b6p": { "$slice": { "of": "big", "offset": 26214400, "length": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "ContentType": "text/bla", "Metadata": { "foo": "bar" } }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "b1p" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "b2p" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "b2p" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "b3p" } }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "b4p" } }, "capture": { "e4": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "b5p" } }, "capture": { "e5": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 6, "Body": { "$data": "b6p" } }, "capture": { "e6": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" }, { "PartNumber": 4, "ETag": "${cap.e4}" }, { "PartNumber": 5, "ETag": "${cap.e5}" }, { "PartNumber": 6, "ETag": "${cap.e6}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentType": "text/bla", "ContentLength": 31457280, "Metadata": { "foo": "bar" } }, "body": { "$data": "big" } } } } ] }, { "id": "multipart-0030", "group": "multipart", "kind": "api", "title": "Completing a multipart upload whose non-final parts are below 5MiB returns EntityTooSmall", "tags": [ "tier-1", "multipart", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6411", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "obj": { "$prng": { "seed": "multipart-0030/obj", "size": 102400 } }, "p1": { "$slice": { "of": "obj", "offset": 0, "length": 10240 } }, "p2": { "$slice": { "of": "obj", "offset": 10240, "length": 10240 } }, "p3": { "$slice": { "of": "obj", "offset": 20480, "length": 10240 } }, "p4": { "$slice": { "of": "obj", "offset": 30720, "length": 10240 } }, "p5": { "$slice": { "of": "obj", "offset": 40960, "length": 10240 } }, "p6": { "$slice": { "of": "obj", "offset": 51200, "length": 10240 } }, "p7": { "$slice": { "of": "obj", "offset": 61440, "length": 10240 } }, "p8": { "$slice": { "of": "obj", "offset": 71680, "length": 10240 } }, "p9": { "$slice": { "of": "obj", "offset": 81920, "length": 10240 } }, "p10": { "$slice": { "of": "obj", "offset": 92160, "length": 10240 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "p1" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "p2" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "p3" } }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "p4" } }, "capture": { "e4": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "p5" } }, "capture": { "e5": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 6, "Body": { "$data": "p6" } }, "capture": { "e6": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 7, "Body": { "$data": "p7" } }, "capture": { "e7": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 8, "Body": { "$data": "p8" } }, "capture": { "e8": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 9, "Body": { "$data": "p9" } }, "capture": { "e9": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 10, "Body": { "$data": "p10" } }, "capture": { "e10": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" }, { "PartNumber": 4, "ETag": "${cap.e4}" }, { "PartNumber": 5, "ETag": "${cap.e5}" }, { "PartNumber": 6, "ETag": "${cap.e6}" }, { "PartNumber": 7, "ETag": "${cap.e7}" }, { "PartNumber": 8, "ETag": "${cap.e8}" }, { "PartNumber": 9, "ETag": "${cap.e9}" }, { "PartNumber": 10, "ETag": "${cap.e10}" } ] } }, "expect": { "status": 400, "error": "EntityTooSmall" } } } ] }, { "id": "multipart-0031", "group": "multipart", "kind": "api", "title": "One-byte multipart upload completes; retrying the complete is idempotent", "tags": [ "tier-1", "multipart", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L6020", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "obj": { "$prng": { "seed": "multipart-0031/obj", "size": 1 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "obj" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart" }, "expect": { "response": { "ContentLength": 1 } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" } ] } }, "expect": { "status": 200 } } } ] }, { "id": "multipart-0032", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload If-Match is evaluated against the current version on a versioned bucket", "tags": [ "tier-1", "multipart", "conditional", "versioning", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L19654", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u1": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u1}", "PartNumber": 1, "Body": "content-part-01" }, "capture": { "p1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u1}", "IfMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p1}" } ] } }, "expect": { "status": 501, "error": "NotImplemented" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u2": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u2}", "PartNumber": 1, "Body": "content-part-02" }, "capture": { "p2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u2}", "IfMatch": "badetag", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p2}" } ] } }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u3": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u3}", "PartNumber": 1, "Body": "content-part-03" }, "capture": { "p3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u3}", "IfNoneMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p3}" } ] } }, "expect": { "status": 200 }, "capture": { "etagV1": "ETag" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u4": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u4}", "PartNumber": 1, "Body": "content-part-04" }, "capture": { "p4": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u4}", "IfMatch": "${cap.etagV1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p4}" } ] } }, "expect": { "status": 200 }, "capture": { "etagV2": "ETag" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u5": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u5}", "PartNumber": 1, "Body": "content-part-05" }, "capture": { "p5": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u5}", "IfMatch": "${cap.etagV1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p5}" } ] } }, "expect": { "status": 412, "error": "PreconditionFailed" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u6": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u6}", "PartNumber": 1, "Body": "content-part-06" }, "capture": { "p6": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u6}", "IfMatch": "${cap.etagV2}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p6}" } ] } }, "expect": { "status": 200 }, "capture": { "etagV3": "ETag" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u7": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u7}", "PartNumber": 1, "Body": "content-part-07" }, "capture": { "p7": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u7}", "IfMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p7}" } ] } }, "expect": { "status": 501, "error": "NotImplemented" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u8": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u8}", "PartNumber": 1, "Body": "content-part-08" }, "capture": { "p8": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u8}", "IfNoneMatch": "deadbeef", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p8}" } ] } }, "expect": { "status": 501, "error": "NotImplemented" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u9": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u9}", "PartNumber": 1, "Body": "content-part-09" }, "capture": { "p9": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u9}", "IfNoneMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p9}" } ] } }, "expect": { "status": 412, "error": "PreconditionFailed" } } } ] }, { "id": "multipart-0033", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload If-None-Match is evaluated against the current version on a versioned bucket", "tags": [ "tier-1", "multipart", "conditional", "versioning", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L19596", "prerequisites": [ { "$bucket": { "handle": "b1", "versioning": "Enabled" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u1": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u1}", "PartNumber": 1, "Body": "data1" }, "capture": { "p1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u1}", "IfNoneMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p1}" } ] } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u2": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u2}", "PartNumber": 1, "Body": "data2" }, "capture": { "p2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u2}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p2}" } ] } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u3": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u3}", "PartNumber": 1, "Body": "abc" }, "capture": { "p3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u3}", "IfNoneMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p3}" } ] } }, "expect": { "status": 412, "error": "PreconditionFailed" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u4": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u4}", "PartNumber": 1, "Body": "abc" }, "capture": { "p4": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u4}", "IfNoneMatch": "${cap.etag2}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p4}" } ] } }, "expect": { "status": 501, "error": "NotImplemented" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u5": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u5}", "PartNumber": 1, "Body": "abc" }, "capture": { "p5": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u5}", "IfNoneMatch": "${cap.etag1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p5}" } ] } }, "expect": { "status": 501, "error": "NotImplemented" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u6": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u6}", "PartNumber": 1, "Body": "abc" }, "capture": { "p6": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u6}", "IfNoneMatch": "badetag", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p6}" } ] } }, "expect": { "status": 501, "error": "NotImplemented" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj" } } } ] }, { "id": "multipart-0034", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload If-Match/If-None-Match conditions on an unversioned bucket, including after delete", "tags": [ "tier-1", "multipart", "conditional", "errors", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L19532", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u1": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u1}", "PartNumber": 1, "Body": "content-part-01" }, "capture": { "p1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u1}", "IfMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p1}" } ] } }, "expect": { "status": 501, "error": "NotImplemented" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u2": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u2}", "PartNumber": 1, "Body": "content-part-02" }, "capture": { "p2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u2}", "IfMatch": "badetag", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p2}" } ] } }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u3": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u3}", "PartNumber": 1, "Body": "content-part-03" }, "capture": { "p3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u3}", "IfNoneMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p3}" } ] } }, "expect": { "status": 200 }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u4": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u4}", "PartNumber": 1, "Body": "content-part-04" }, "capture": { "p4": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u4}", "IfNoneMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p4}" } ] } }, "expect": { "status": 412, "error": "PreconditionFailed" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u5": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u5}", "PartNumber": 1, "Body": "content-part-05" }, "capture": { "p5": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u5}", "IfNoneMatch": "deadbeef", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p5}" } ] } }, "expect": { "status": 501, "error": "NotImplemented" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u6": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u6}", "PartNumber": 1, "Body": "content-part-06" }, "capture": { "p6": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u6}", "IfMatch": "${cap.etag1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p6}" } ] } }, "expect": { "status": 200 }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u7": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u7}", "PartNumber": 1, "Body": "content-part-07" }, "capture": { "p7": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u7}", "IfMatch": "${cap.etag1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p7}" } ] } }, "expect": { "status": 412, "error": "PreconditionFailed" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u8": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u8}", "PartNumber": 1, "Body": "content-part-08" }, "capture": { "p8": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u8}", "IfMatch": "badetag", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p8}" } ] } }, "expect": { "status": 412, "error": "PreconditionFailed" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u9": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u9}", "PartNumber": 1, "Body": "content-part-09" }, "capture": { "p9": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u9}", "IfMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p9}" } ] } }, "expect": { "status": 501, "error": "NotImplemented" } } }, { "$operation": { "name": "DeleteObject", "params": { "Bucket": "${res.b1.name}", "Key": "obj" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u10": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u10}", "PartNumber": 1, "Body": "content-part-10" }, "capture": { "p10": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u10}", "IfMatch": "badetag", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p10}" } ] } }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj" }, "capture": { "u11": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u11}", "PartNumber": 1, "Body": "content-part-11" }, "capture": { "p11": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj", "UploadId": "${cap.u11}", "IfNoneMatch": "*", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p11}" } ] } }, "expect": { "status": 200 } } } ] }, { "id": "multipart-0035", "group": "multipart", "kind": "api", "title": "Three-part multipart upload with CRC32 FULL_OBJECT checksums: complete, HEAD, object attributes, per-part GET", "tags": [ "tier-3", "multipart", "checksums", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L15228", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 5242880 } }, "pb": { "$pattern": { "pattern": "B", "size": 5242880 } }, "pc": { "$pattern": { "pattern": "C", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumAlgorithm": "CRC32", "ChecksumType": "FULL_OBJECT" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "ChecksumAlgorithm": "CRC32" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" }, "ChecksumAlgorithm": "CRC32", "ChecksumCRC32": "${data.pa.crc32B64}" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "pb" }, "ChecksumAlgorithm": "CRC32", "ChecksumCRC32": "${data.pb.crc32B64}" }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "pc" }, "ChecksumAlgorithm": "CRC32", "ChecksumCRC32": "${data.pc.crc32B64}" }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "ChecksumCRC32": "WgDhBQ==", "ChecksumType": "FULL_OBJECT", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}", "ChecksumCRC32": "${data.pa.crc32B64}" }, { "PartNumber": 2, "ETag": "${cap.etag2}", "ChecksumCRC32": "${data.pb.crc32B64}" }, { "PartNumber": 3, "ETag": "${cap.etag3}", "ChecksumCRC32": "${data.pc.crc32B64}" } ] } }, "expect": { "response": { "ChecksumType": "FULL_OBJECT", "ChecksumCRC32": "WgDhBQ==" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3" }, "expect": { "response": { "ChecksumCRC32": { "$absent": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "FULL_OBJECT", "ChecksumCRC32": "WgDhBQ==" } } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ObjectAttributes": [ "Checksum", "ObjectParts" ] }, "expect": { "response": { "Checksum": { "ChecksumType": "FULL_OBJECT", "ChecksumCRC32": "WgDhBQ==" }, "ObjectParts": { "TotalPartsCount": 3, "PartNumberMarker": { "$absent": true }, "NextPartNumberMarker": { "$absent": true }, "MaxParts": { "$absent": true }, "IsTruncated": { "$absent": true }, "Parts": { "$absent": true } } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 1, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumCRC32": { "$absent": true }, "ChecksumType": { "$absent": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 2, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumCRC32": { "$absent": true }, "ChecksumType": { "$absent": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 3, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumCRC32": { "$absent": true }, "ChecksumType": { "$absent": true } } } } } ] }, { "id": "multipart-0036", "group": "multipart", "kind": "api", "title": "Three-part multipart upload with CRC32C FULL_OBJECT checksums: complete, HEAD, object attributes, per-part GET", "tags": [ "tier-3", "multipart", "checksums", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L15252", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 5242880 } }, "pb": { "$pattern": { "pattern": "B", "size": 5242880 } }, "pc": { "$pattern": { "pattern": "C", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumAlgorithm": "CRC32C", "ChecksumType": "FULL_OBJECT" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "ChecksumAlgorithm": "CRC32C" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" }, "ChecksumAlgorithm": "CRC32C", "ChecksumCRC32C": "${data.pa.crc32cB64}" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "pb" }, "ChecksumAlgorithm": "CRC32C", "ChecksumCRC32C": "${data.pb.crc32cB64}" }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "pc" }, "ChecksumAlgorithm": "CRC32C", "ChecksumCRC32C": "${data.pc.crc32cB64}" }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "ChecksumCRC32C": "xU+Krw==", "ChecksumType": "FULL_OBJECT", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}", "ChecksumCRC32C": "${data.pa.crc32cB64}" }, { "PartNumber": 2, "ETag": "${cap.etag2}", "ChecksumCRC32C": "${data.pb.crc32cB64}" }, { "PartNumber": 3, "ETag": "${cap.etag3}", "ChecksumCRC32C": "${data.pc.crc32cB64}" } ] } }, "expect": { "response": { "ChecksumType": "FULL_OBJECT", "ChecksumCRC32C": "xU+Krw==" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3" }, "expect": { "response": { "ChecksumCRC32C": { "$absent": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "FULL_OBJECT", "ChecksumCRC32C": "xU+Krw==" } } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ObjectAttributes": [ "Checksum", "ObjectParts" ] }, "expect": { "response": { "Checksum": { "ChecksumType": "FULL_OBJECT", "ChecksumCRC32C": "xU+Krw==" }, "ObjectParts": { "TotalPartsCount": 3, "PartNumberMarker": { "$absent": true }, "NextPartNumberMarker": { "$absent": true }, "MaxParts": { "$absent": true }, "IsTruncated": { "$absent": true }, "Parts": { "$absent": true } } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 1, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumCRC32C": { "$absent": true }, "ChecksumType": { "$absent": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 2, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumCRC32C": { "$absent": true }, "ChecksumType": { "$absent": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 3, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumCRC32C": { "$absent": true }, "ChecksumType": { "$absent": true } } } } } ] }, { "id": "multipart-0037", "group": "multipart", "kind": "api", "title": "Three-part multipart upload with CRC64NVME FULL_OBJECT checksums: complete, HEAD, object attributes, per-part GET", "tags": [ "tier-3", "multipart", "checksums", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L15204", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 5242880 } }, "pb": { "$pattern": { "pattern": "B", "size": 5242880 } }, "pc": { "$pattern": { "pattern": "C", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumAlgorithm": "CRC64NVME", "ChecksumType": "FULL_OBJECT" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "ChecksumAlgorithm": "CRC64NVME" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" }, "ChecksumAlgorithm": "CRC64NVME", "ChecksumCRC64NVME": "${data.pa.crc64nvmeB64}" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "pb" }, "ChecksumAlgorithm": "CRC64NVME", "ChecksumCRC64NVME": "${data.pb.crc64nvmeB64}" }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "pc" }, "ChecksumAlgorithm": "CRC64NVME", "ChecksumCRC64NVME": "${data.pc.crc64nvmeB64}" }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "ChecksumCRC64NVME": "i+6LR0y3eFo=", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}", "ChecksumCRC64NVME": "${data.pa.crc64nvmeB64}" }, { "PartNumber": 2, "ETag": "${cap.etag2}", "ChecksumCRC64NVME": "${data.pb.crc64nvmeB64}" }, { "PartNumber": 3, "ETag": "${cap.etag3}", "ChecksumCRC64NVME": "${data.pc.crc64nvmeB64}" } ] } }, "expect": { "response": { "ChecksumType": "FULL_OBJECT", "ChecksumCRC64NVME": "i+6LR0y3eFo=" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3" }, "expect": { "response": { "ChecksumCRC64NVME": { "$absent": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "FULL_OBJECT", "ChecksumCRC64NVME": "i+6LR0y3eFo=" } } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ObjectAttributes": [ "Checksum", "ObjectParts" ] }, "expect": { "response": { "Checksum": { "ChecksumType": "FULL_OBJECT", "ChecksumCRC64NVME": "i+6LR0y3eFo=" }, "ObjectParts": { "TotalPartsCount": 3, "PartNumberMarker": { "$absent": true }, "NextPartNumberMarker": { "$absent": true }, "MaxParts": { "$absent": true }, "IsTruncated": { "$absent": true }, "Parts": { "$absent": true } } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 1, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumCRC64NVME": { "$absent": true }, "ChecksumType": { "$absent": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 2, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumCRC64NVME": { "$absent": true }, "ChecksumType": { "$absent": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 3, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumCRC64NVME": { "$absent": true }, "ChecksumType": { "$absent": true } } } } } ] }, { "id": "multipart-0038", "group": "multipart", "kind": "api", "title": "Three-part multipart upload with SHA1 COMPOSITE checksums: complete, HEAD, object attributes, per-part GET", "tags": [ "tier-3", "multipart", "checksums", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L15276", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 5242880 } }, "pb": { "$pattern": { "pattern": "B", "size": 5242880 } }, "pc": { "$pattern": { "pattern": "C", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumAlgorithm": "SHA1", "ChecksumType": "COMPOSITE" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "ChecksumAlgorithm": "SHA1" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" }, "ChecksumAlgorithm": "SHA1", "ChecksumSHA1": "${data.pa.sha1B64}" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "pb" }, "ChecksumAlgorithm": "SHA1", "ChecksumSHA1": "${data.pb.sha1B64}" }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "pc" }, "ChecksumAlgorithm": "SHA1", "ChecksumSHA1": "${data.pc.sha1B64}" }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "ChecksumSHA1": "sizjvY4eud3MrcHdZM3cQ/ol39o=-3", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}", "ChecksumSHA1": "${data.pa.sha1B64}" }, { "PartNumber": 2, "ETag": "${cap.etag2}", "ChecksumSHA1": "${data.pb.sha1B64}" }, { "PartNumber": 3, "ETag": "${cap.etag3}", "ChecksumSHA1": "${data.pc.sha1B64}" } ] } }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA1": "sizjvY4eud3MrcHdZM3cQ/ol39o=-3" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3" }, "expect": { "response": { "ChecksumSHA1": { "$absent": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA1": "sizjvY4eud3MrcHdZM3cQ/ol39o=-3" } } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ObjectAttributes": [ "Checksum" ] }, "expect": { "response": { "Checksum": { "ChecksumType": "COMPOSITE", "ChecksumSHA1": "sizjvY4eud3MrcHdZM3cQ/ol39o=" } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 1, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA1": "${data.pa.sha1B64}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 2, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA1": "${data.pb.sha1B64}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 3, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA1": "${data.pc.sha1B64}" } } } } ] }, { "id": "multipart-0039", "group": "multipart", "kind": "api", "title": "Three-part multipart upload with SHA256 COMPOSITE checksums: complete, HEAD, object attributes, per-part GET", "tags": [ "tier-3", "multipart", "checksums", "source:ceph-s3-tests" ], "source": "https://github.com/ceph/s3-tests/blob/5522d1c351f75bc00ae0f64f742f3f095f5939d9/s3tests/functional/test_s3.py#L15180", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 5242880 } }, "pb": { "$pattern": { "pattern": "B", "size": 5242880 } }, "pc": { "$pattern": { "pattern": "C", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumAlgorithm": "SHA256", "ChecksumType": "COMPOSITE" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "ChecksumAlgorithm": "SHA256" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" }, "ChecksumAlgorithm": "SHA256", "ChecksumSHA256": "${data.pa.sha256B64}" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "pb" }, "ChecksumAlgorithm": "SHA256", "ChecksumSHA256": "${data.pb.sha256B64}" }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "pc" }, "ChecksumAlgorithm": "SHA256", "ChecksumSHA256": "${data.pc.sha256B64}" }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "UploadId": "${cap.uploadId}", "ChecksumSHA256": "uWBwpe1dxI4Vw8Gf0X9ynOdw/SS6VBzfWm9giiv1sf4=-3", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}", "ChecksumSHA256": "${data.pa.sha256B64}" }, { "PartNumber": 2, "ETag": "${cap.etag2}", "ChecksumSHA256": "${data.pb.sha256B64}" }, { "PartNumber": 3, "ETag": "${cap.etag3}", "ChecksumSHA256": "${data.pc.sha256B64}" } ] } }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA256": "uWBwpe1dxI4Vw8Gf0X9ynOdw/SS6VBzfWm9giiv1sf4=-3" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3" }, "expect": { "response": { "ChecksumSHA256": { "$absent": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA256": "uWBwpe1dxI4Vw8Gf0X9ynOdw/SS6VBzfWm9giiv1sf4=-3" } } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "ObjectAttributes": [ "Checksum" ] }, "expect": { "response": { "Checksum": { "ChecksumType": "COMPOSITE", "ChecksumSHA256": "uWBwpe1dxI4Vw8Gf0X9ynOdw/SS6VBzfWm9giiv1sf4=" } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 1, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA256": "${data.pa.sha256B64}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 2, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA256": "${data.pb.sha256B64}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "mymultipart3", "PartNumber": 3, "ChecksumMode": "ENABLED" }, "expect": { "response": { "ChecksumType": "COMPOSITE", "ChecksumSHA256": "${data.pc.sha256B64}" } } } } ] }, { "id": "multipart-0040", "group": "multipart", "kind": "api", "title": "10 MiB two-part multipart upload preserves content integrity and size", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/5.py#L14", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "big": { "$prng": { "seed": "multipart-0040/big", "size": 10485760 } }, "part1": { "$slice": { "of": "big", "offset": 0, "length": 5242880 } }, "part2": { "$slice": { "of": "big", "offset": 5242880, "length": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large-file-test.bin" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-file-test.bin", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-file-test.bin", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large-file-test.bin", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "large-file-test.bin" }, "expect": { "body": { "$size": 10485760, "$sha256": "${data.big.sha256}" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "large-file-test.bin" }, "expect": { "response": { "ContentLength": 10485760 } } } } ] }, { "id": "multipart-0041", "group": "multipart", "kind": "api", "title": "In-progress multipart upload is discoverable via ListMultipartUploads/ListParts and can be resumed and completed", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/basic/7.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "all": { "$prng": { "seed": "multipart-0041/all", "size": 20971520 } }, "p1": { "$slice": { "of": "all", "offset": 0, "length": 5242880 } }, "p2": { "$slice": { "of": "all", "offset": 5242880, "length": 5242880 } }, "p3": { "$slice": { "of": "all", "offset": 10485760, "length": 5242880 } }, "p4": { "$slice": { "of": "all", "offset": 15728640, "length": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "resume-multipart-test.bin" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "resume-multipart-test.bin", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "p1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "resume-multipart-test.bin", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "p2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$contains": { "Key": "resume-multipart-test.bin", "UploadId": "${cap.uploadId}" } } } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "resume-multipart-test.bin", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "Parts": { "$length": 2 } } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "resume-multipart-test.bin", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "p3" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "resume-multipart-test.bin", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "p4" } }, "capture": { "etag4": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "resume-multipart-test.bin", "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}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "resume-multipart-test.bin" }, "expect": { "response": { "ContentLength": 20971520 } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "resume-multipart-test.bin" }, "expect": { "body": { "$size": 20971520, "$sha256": "${data.all.sha256}" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "resume-test-2.bin" }, "capture": { "uploadId2": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "resume-test-2.bin", "UploadId": "${cap.uploadId2}", "PartNumber": 1, "Body": { "$data": "p1" } } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$contains": { "Key": "resume-test-2.bin" } } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "resume-test-2.bin", "UploadId": "${cap.uploadId2}" } } } ] }, { "id": "multipart-0042", "group": "multipart", "kind": "api", "title": "Multipart ETag differs from the single-part ETag of the same content and contains a dash", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_etag_edge_cases.py#L16", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "s10": { "$pattern": { "pattern": "S", "size": 10485760 } }, "sp1": { "$slice": { "of": "s10", "offset": 0, "length": 5242880 } }, "sp2": { "$slice": { "of": "s10", "offset": 5242880, "length": 5242880 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "single-part-etag", "Body": { "$data": "s10" } }, "capture": { "singleEtag": "ETag" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-etag" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-etag", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "sp1" } }, "capture": { "p1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-etag", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "sp2" } }, "capture": { "p2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-etag", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.p1}" }, { "PartNumber": 2, "ETag": "${cap.p2}" } ] } }, "expect": { "response": { "ETag": { "$ne": "${cap.singleEtag}", "$matches": "-" } } } } } ] }, { "id": "multipart-0043", "group": "multipart", "kind": "api", "title": "Aborting an already-aborted multipart upload is idempotent and returns 204", "description": "The source tolerated MinIO's idempotent second abort; converted to the AWS behavior where a second AbortMultipartUpload on the same upload id fails with NoSuchUpload.", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_final_coverage.py#L31", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" }, "expect": { "status": 204 } } } ] }, { "id": "multipart-0044", "group": "multipart", "kind": "api", "title": "CacheControl set on CreateMultipartUpload is preserved on the completed object", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_final_coverage.py#L454", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "CacheControl": "max-age=3600, public" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": "test data" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "CacheControl": "max-age=3600, public" } } } } ] }, { "id": "multipart-0045", "group": "multipart", "kind": "api", "title": "ContentType set on CreateMultipartUpload is preserved on the completed object", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_final_coverage.py#L405", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "ContentType": "application/json" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": "{\"test\": \"data\"}" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "ContentType": "application/json" } } } } ] }, { "id": "multipart-0046", "group": "multipart", "kind": "api", "title": "ListMultipartUploads accepts a KeyMarker parameter", "description": "The source tolerates both full KeyMarker filtering (AWS) and implementations that return all uploads (MinIO); only the unconditional assertion (the request succeeds and Uploads is present) is converted.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_final_coverage.py#L358", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "aaa" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "bbb" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "ccc" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "ddd" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "KeyMarker": "bbb" }, "expect": { "response": { "Uploads": { "$exists": true } } } } } ] }, { "id": "multipart-0047", "group": "multipart", "kind": "api", "title": "ListParts with PartNumberMarker returns only the parts after the marker", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_final_coverage.py#L185", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1k": { "$pattern": { "pattern": "x", "size": 1024 } } }, "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": "part1k" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part1k" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "part1k" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "part1k" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "part1k" } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumberMarker": 3 }, "expect": { "response": { "Parts": [ { "PartNumber": 4 }, { "PartNumber": 5 } ] } } } } ] }, { "id": "multipart-0048", "group": "multipart", "kind": "api", "title": "ListMultipartUploads reports an Initiated timestamp for an in-progress upload", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_final_coverage.py#L278", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$contains": { "UploadId": "${cap.uploadId}", "Initiated": { "$exists": true } } } } } } } ] }, { "id": "multipart-0049", "group": "multipart", "kind": "api", "title": "Completed multipart upload no longer appears in ListMultipartUploads", "description": "The source asserts the specific upload id is absent from the listing; in this dedicated bucket that is equivalent to Uploads being absent from the parsed response.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_final_coverage.py#L227", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part5m": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$contains": { "UploadId": "${cap.uploadId}" } } } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part5m" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$absent": true } } } } } ] }, { "id": "multipart-0050", "group": "multipart", "kind": "api", "title": "UploadPart accepts a zero-byte part and returns an ETag", "description": "The source tolerated implementations rejecting zero-byte parts; converted to the AWS behavior where UploadPart accepts an empty body and returns an ETag (the 5 MiB minimum is enforced only at CompleteMultipartUpload, never on an individual UploadPart).", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_final_coverage.py#L315", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "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": "" }, "expect": { "response": { "ETag": { "$exists": true } } } } } ] }, { "id": "multipart-0051", "group": "multipart", "kind": "api", "title": "GetObject with PartNumber returns exactly that part's bytes and PartsCount", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_additional.py#L30", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "p1": { "$pattern": { "pattern": "Part-1-Data", "size": 11534336 } }, "p2": { "$pattern": { "pattern": "Part-2-Data", "size": 11534336 } }, "p3": { "$pattern": { "pattern": "Part-3-Data", "size": 11534336 } } }, "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": "p1" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "p2" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "p3" } }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "PartNumber": 2 }, "expect": { "response": { "PartsCount": 3 }, "body": { "$size": 11534336, "$md5": "${data.p2.md5}" } } } } ] }, { "id": "multipart-0052", "group": "multipart", "kind": "api", "title": "GetObjectAttributes on a completed multipart object reports total size and ObjectParts count", "tags": [ "tier-3", "multipart", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_get_object_attributes.py#L352", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "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": "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}" } ] } } } }, { "$operation": { "name": "GetObjectAttributes", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "ObjectAttributes": [ "ETag", "ObjectSize", "ObjectParts" ] }, "expect": { "response": { "ETag": { "$exists": true }, "ObjectSize": 15728640, "ObjectParts": { "TotalPartsCount": 3, "PartNumberMarker": { "$absent": true }, "NextPartNumberMarker": { "$absent": true }, "MaxParts": { "$absent": true }, "IsTruncated": { "$absent": true }, "Parts": { "$absent": true } } } } } } ] }, { "id": "multipart-0053", "group": "multipart", "kind": "api", "title": "ListMultipartUploads on a bucket with no active uploads returns no uploads", "tags": [ "tier-1", "multipart", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L30", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$absent": true } } } } } ] }, { "id": "multipart-0054", "group": "multipart", "kind": "api", "title": "ListMultipartUploads accepts a MaxUploads value above the server cap", "description": "The original additionally asserted the echoed MaxUploads is >= 1000 (AWS caps at 1000, MinIO at 10000, others echo the request); a numeric lower-bound is not expressible, so only presence is asserted.", "tags": [ "tier-1", "multipart", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L131", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "MaxUploads": 1343235 }, "expect": { "response": { "MaxUploads": { "$exists": true } } } } } ] }, { "id": "multipart-0055", "group": "multipart", "kind": "api", "title": "UploadIdMarker without KeyMarker is ignored by ListMultipartUploads", "tags": [ "tier-1", "multipart", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L199", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj1" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj2" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj3" }, "capture": { "up3": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj4" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj5" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "UploadIdMarker": "${cap.up3}" }, "expect": { "response": { "Uploads": { "$length": 5 } } } } } ] }, { "id": "multipart-0056", "group": "multipart", "kind": "api", "title": "ListMultipartUploads KeyMarker past all keys yields an empty upload list", "description": "Per the source test's stated intent: a KeyMarker lexicographically after every upload key returns no uploads. The literal boto3 assertion ('Uploads' key present) contradicts AWS, which omits the element when empty.", "tags": [ "tier-1", "multipart", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L163", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj1" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj2" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj3" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj4" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj5" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "KeyMarker": "wrong_object_key" }, "expect": { "response": { "Uploads": { "$absent": true } } } } } ] }, { "id": "multipart-0057", "group": "multipart", "kind": "api", "title": "ListMultipartUploads with negative MaxUploads returns InvalidArgument", "description": "The original accepted InvalidArgument or InvalidRequest; AWS returns InvalidArgument.", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L53", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "MaxUploads": -3 }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0058", "group": "multipart", "kind": "api", "title": "ListMultipartUploads MaxUploads truncates with continuation markers", "description": "The original tolerated implementations that do not truncate (MinIO); this vector asserts the AWS truncation behavior.", "tags": [ "tier-1", "multipart", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L79", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj1" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj2" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj3" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj4" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj5" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "MaxUploads": 2 }, "capture": { "nextKeyMarker": "NextKeyMarker" }, "expect": { "response": { "MaxUploads": 2, "IsTruncated": true, "Uploads": { "$length": 2 }, "NextKeyMarker": { "$exists": true }, "NextUploadIdMarker": { "$exists": true } } } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "KeyMarker": "${cap.nextKeyMarker}" }, "expect": { "response": { "Uploads": { "$length": 3 } } } } } ] }, { "id": "multipart-0059", "group": "multipart", "kind": "api", "title": "ListMultipartUploads lists active uploads with key, upload id and storage class", "description": "StorageClass is asserted as STANDARD, REDUCED_REDUNDANCY or empty, matching the original's accepted set.", "tags": [ "tier-1", "multipart", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L286", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj-1" }, "capture": { "up1": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj-2" }, "capture": { "up2": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "my-obj-1", "UploadId": "${cap.up1}", "StorageClass": { "$matches": "^(STANDARD|REDUCED_REDUNDANCY|)$" } }, { "Key": "my-obj-2", "UploadId": "${cap.up2}", "StorageClass": { "$matches": "^(STANDARD|REDUCED_REDUNDANCY|)$" } } ] } } } } ] }, { "id": "multipart-0060", "group": "multipart", "kind": "api", "title": "ListMultipartUploads reports ChecksumAlgorithm CRC32", "tags": [ "tier-1", "multipart", "checksums", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L231", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-1", "ChecksumAlgorithm": "CRC32" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "obj-1", "ChecksumAlgorithm": "CRC32" } ] } } } } ] }, { "id": "multipart-0061", "group": "multipart", "kind": "api", "title": "ListMultipartUploads reports ChecksumAlgorithm CRC32C", "tags": [ "tier-1", "multipart", "checksums", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L231", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-2", "ChecksumAlgorithm": "CRC32C" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "obj-2", "ChecksumAlgorithm": "CRC32C" } ] } } } } ] }, { "id": "multipart-0062", "group": "multipart", "kind": "api", "title": "ListMultipartUploads reports ChecksumAlgorithm SHA1", "tags": [ "tier-1", "multipart", "checksums", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L231", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-3", "ChecksumAlgorithm": "SHA1" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "obj-3", "ChecksumAlgorithm": "SHA1" } ] } } } } ] }, { "id": "multipart-0063", "group": "multipart", "kind": "api", "title": "ListMultipartUploads reports ChecksumAlgorithm SHA256", "tags": [ "tier-1", "multipart", "checksums", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L231", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-4", "ChecksumAlgorithm": "SHA256" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "obj-4", "ChecksumAlgorithm": "SHA256" } ] } } } } ] }, { "id": "multipart-0064", "group": "multipart", "kind": "api", "title": "ListMultipartUploads reports ChecksumAlgorithm CRC64NVME", "tags": [ "tier-1", "multipart", "checksums", "listing", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_multipart_uploads_advanced.py#L231", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-5", "ChecksumAlgorithm": "CRC64NVME" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "obj-5", "ChecksumAlgorithm": "CRC64NVME" } ] } } } } ] }, { "id": "multipart-0065", "group": "multipart", "kind": "api", "title": "ListParts after AbortMultipartUpload returns NoSuchUpload", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_parts.py#L280", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "px": { "$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": "px" } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0066", "group": "multipart", "kind": "api", "title": "ListParts default MaxParts is 1000", "description": "Original test also accepted 10000 (MinIO); AWS S3 defaults MaxParts to 1000.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_parts.py#L109", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "MaxParts": 1000 } } } } ] }, { "id": "multipart-0067", "group": "multipart", "kind": "api", "title": "ListParts on an upload with no parts returns an empty, non-truncated listing", "description": "Original test accepted Parts absent or an empty list; AWS returns no Part elements so the parsed response has no Parts member.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_parts.py#L253", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "IsTruncated": false, "Parts": { "$absent": true } } } } } ] }, { "id": "multipart-0068", "group": "multipart", "kind": "api", "title": "ListParts with a valid upload id but wrong object key returns NoSuchUpload", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_parts.py#L52", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "incorrect-object-key", "UploadId": "${cap.uploadId}" }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0069", "group": "multipart", "kind": "api", "title": "ListParts with a nonexistent upload id returns NoSuchUpload", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_parts.py#L28", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "invalid-upload-id" }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0070", "group": "multipart", "kind": "api", "title": "ListParts with negative MaxParts returns InvalidArgument", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_parts.py#L80", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MaxParts": -3 }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0071", "group": "multipart", "kind": "api", "title": "ListParts returns all uploaded parts with number, ETag, size and storage class", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_parts.py#L202", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "px": { "$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": "px" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "px" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "px" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "px" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "px" } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "StorageClass": "STANDARD", "Parts": [ { "PartNumber": 1, "ETag": "${data.px.etag}", "Size": 5242880 }, { "PartNumber": 2, "ETag": "${data.px.etag}", "Size": 5242880 }, { "PartNumber": 3, "ETag": "${data.px.etag}", "Size": 5242880 }, { "PartNumber": 4, "ETag": "${data.px.etag}", "Size": 5242880 }, { "PartNumber": 5, "ETag": "${data.px.etag}", "Size": 5242880 } ] } } } } ] }, { "id": "multipart-0072", "group": "multipart", "kind": "api", "title": "ListParts pagination: MaxParts truncation and NextPartNumberMarker resume", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_list_parts.py#L136", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "px": { "$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": "px" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "px" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "px" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "px" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "px" } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MaxParts": 3 }, "expect": { "response": { "IsTruncated": true, "MaxParts": 3, "NextPartNumberMarker": 3, "Parts": [ { "PartNumber": 1, "ETag": "${data.px.etag}" }, { "PartNumber": 2, "ETag": "${data.px.etag}" }, { "PartNumber": 3, "ETag": "${data.px.etag}" } ] } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumberMarker": 3 }, "expect": { "response": { "PartNumberMarker": 3, "Parts": [ { "PartNumber": 4, "ETag": "${data.px.etag}" }, { "PartNumber": 5, "ETag": "${data.px.etag}" } ] } } } } ] }, { "id": "multipart-0073", "group": "multipart", "kind": "api", "title": "AbortMultipartUpload with a valid upload id but wrong key returns NoSuchUpload", "description": "Original test also tolerated an idempotent success (MinIO); AWS S3 scopes the upload id to the key and returns NoSuchUpload.", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L110", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "correct-key" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "wrong-key", "UploadId": "${cap.uploadId}" }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0074", "group": "multipart", "kind": "api", "title": "AbortMultipartUpload with a nonexistent upload id returns NoSuchUpload", "description": "Original test also tolerated an idempotent success (MinIO); AWS S3 returns NoSuchUpload.", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L79", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-key", "UploadId": "non-existing-upload-id" }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0075", "group": "multipart", "kind": "api", "title": "AbortMultipartUpload on a nonexistent bucket returns NoSuchBucket", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L56", "steps": [ { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "non-existing-bucket-12345", "Key": "test-key", "UploadId": "fake-upload-id" }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "multipart-0076", "group": "multipart", "kind": "api", "title": "AbortMultipartUpload returns HTTP 204 No Content", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L142", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-multipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-multipart", "UploadId": "${cap.uploadId}" }, "expect": { "status": 204 } } } ] }, { "id": "multipart-0077", "group": "multipart", "kind": "api", "title": "AbortMultipartUpload removes the upload from ListMultipartUploads", "description": "Original test asserted zero uploads remain; AWS returns no Upload elements so the parsed response has no Uploads member.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L28", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-multipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-multipart", "UploadId": "${cap.uploadId}" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$absent": true } } } } } ] }, { "id": "multipart-0078", "group": "multipart", "kind": "api", "title": "Aborted upload disappears from ListMultipartUploads", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L319", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload1" }, "capture": { "id1": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload2" }, "capture": { "id2": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$length": 2 } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload1", "UploadId": "${cap.id1}" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "upload2" } ] } } } } ] }, { "id": "multipart-0079", "group": "multipart", "kind": "api", "title": "ListMultipartUploads lists all in-progress uploads", "description": "Original test compared the key set; AWS returns uploads sorted by key so an ordered match is equivalent.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L216", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload1" }, "capture": { "id1": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload2" }, "capture": { "id2": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload3" }, "capture": { "id3": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "upload1" }, { "Key": "upload2" }, { "Key": "upload3" } ] } } } } ] }, { "id": "multipart-0080", "group": "multipart", "kind": "api", "title": "ListMultipartUploads on a nonexistent bucket returns NoSuchBucket", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L355", "steps": [ { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "non-existing-bucket-12345" }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "multipart-0081", "group": "multipart", "kind": "api", "title": "ListMultipartUploads honors MaxUploads and sets IsTruncated", "description": "Original test tolerated MinIO ignoring MaxUploads but asserted IsTruncated when the page was short; AWS returns exactly 2 uploads with IsTruncated true.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L284", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload-0" }, "capture": { "id0": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload-1" }, "capture": { "id1": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload-2" }, "capture": { "id2": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload-3" }, "capture": { "id3": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "upload-4" }, "capture": { "id4": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "MaxUploads": 2 }, "expect": { "response": { "Uploads": { "$length": 2 }, "IsTruncated": true } } } } ] }, { "id": "multipart-0082", "group": "multipart", "kind": "api", "title": "ListMultipartUploads lists a single in-progress upload with key and upload id", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L190", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-multipart" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "test-multipart", "UploadId": "${cap.uploadId}" } ] } } } } ] }, { "id": "multipart-0083", "group": "multipart", "kind": "api", "title": "ListMultipartUploads with a Delimiter parameter succeeds", "description": "Original test only asserted a non-empty combined result (uploads plus common prefixes), which is not directly expressible; this vector requires the delimited listing call to succeed.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L407", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "dir1/file1" }, "capture": { "id1": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "dir1/file2" }, "capture": { "id2": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "dir2/file3" }, "capture": { "id3": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "root-file" }, "capture": { "id4": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "Delimiter": "/" } } } ] }, { "id": "multipart-0084", "group": "multipart", "kind": "api", "title": "ListMultipartUploads with a Prefix parameter succeeds", "description": "Original test made no effective assertion on the filtering result (its check was vacuous), so this vector only requires the prefixed listing call to succeed.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_multipart_abort_list.py#L248", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "logs/file1" }, "capture": { "id1": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "logs/file2" }, "capture": { "id2": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "data/file3" }, "capture": { "id3": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}", "Prefix": "logs/" } } } ] }, { "id": "multipart-0085", "group": "multipart", "kind": "api", "title": "Three-part multipart upload of 5 MiB parts reports total ContentLength", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_object_size_limits.py#L15", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part": { "$pattern": { "pattern": "P", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large-multipart-sim" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-multipart-sim", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-multipart-sim", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-multipart-sim", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "part" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large-multipart-sim", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" }, { "PartNumber": 3, "ETag": "${cap.etag3}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "large-multipart-sim" }, "expect": { "response": { "ContentLength": 15728640 } } } } ] }, { "id": "multipart-0086", "group": "multipart", "kind": "api", "title": "UploadPart after AbortMultipartUpload returns NoSuchUpload", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part.py#L352", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "parta": { "$pattern": { "pattern": "a", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "aborted-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "aborted-obj", "UploadId": "${cap.uploadId}" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "aborted-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "parta" } }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0087", "group": "multipart", "kind": "api", "title": "UploadPart with part numbers outside 1-10000 returns InvalidArgument", "description": "The source test accepted InvalidArgument, InvalidPartNumber or InvalidPart; AWS returns InvalidArgument for out-of-range part numbers.", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part.py#L53", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "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": 0, "Body": "test data" }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": -1, "Body": "test data" }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 10001, "Body": "test data" }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2300000, "Body": "test data" }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0088", "group": "multipart", "kind": "api", "title": "Parts uploaded out of order (3, 1, 2) are listed in ascending part-number order", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part.py#L185", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "partx": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multi-part-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multi-part-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "partx" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multi-part-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "partx" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multi-part-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "partx" } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "multi-part-obj", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "Parts": [ { "PartNumber": 1 }, { "PartNumber": 2 }, { "PartNumber": 3 } ] } } } } ] }, { "id": "multipart-0089", "group": "multipart", "kind": "api", "title": "UploadPart to a non-existent bucket returns NoSuchBucket", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part.py#L28", "steps": [ { "$operation": { "name": "UploadPart", "params": { "Bucket": "non-existing-bucket-12345", "Key": "my-obj", "UploadId": "fake-upload-id", "PartNumber": 1, "Body": "test data" }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "multipart-0090", "group": "multipart", "kind": "api", "title": "UploadPart with a valid upload ID but a different key returns NoSuchUpload", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part.py#L120", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "non-existing-object-key", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": "test data" }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0091", "group": "multipart", "kind": "api", "title": "UploadPart with a non-existent upload ID returns NoSuchUpload", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part.py#L92", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "non-existing-upload-id", "PartNumber": 1, "Body": "test data" }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0092", "group": "multipart", "kind": "api", "title": "Re-uploading the same part number overwrites the part; ListParts shows only the latest ETag", "description": "The source asserts the two upload ETags differ; this is expressed by asserting each equals the MD5 ETag of its distinct part data.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part.py#L230", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "da": { "$pattern": { "pattern": "a", "size": 5242880 } }, "db": { "$pattern": { "pattern": "b", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "overwrite-part-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "overwrite-part-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "da" } }, "capture": { "etag1": "ETag" }, "expect": { "response": { "ETag": "${data.da.etag}" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "overwrite-part-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "db" } }, "capture": { "etag2": "ETag" }, "expect": { "response": { "ETag": "${data.db.etag}" } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "overwrite-part-obj", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag2}" } ] } } } } ] }, { "id": "multipart-0093", "group": "multipart", "kind": "api", "title": "UploadPart responds with HTTP 200 and an ETag", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part.py#L319", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "partz": { "$pattern": { "pattern": "z", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "metadata-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "partz" } }, "expect": { "status": 200, "response": { "ETag": { "$exists": true } } } } } ] }, { "id": "multipart-0094", "group": "multipart", "kind": "api", "title": "UploadPartCopy with malformed CopySourceRange values is rejected", "description": "AWS returns 400 InvalidArgument for a CopySourceRange that is not of the form bytes=first-last (including a start greater than the end). The source test also accepted InvalidRange.", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L330", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": { "$data": "src" } } } ], "data": { "src": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceRange": "invalid", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceRange": "bytes=invalid", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceRange": "bytes=-", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceRange": "bytes=100-50", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0095", "group": "multipart", "kind": "api", "title": "UploadPartCopy with CopySourceRange copies exactly the requested bytes", "description": "bytes=100-200 is inclusive, so the resulting part is 101 bytes.", "tags": [ "tier-1", "multipart", "copy", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L461", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$bucket": { "handle": "b2" } }, { "$object": { "handle": "o1", "bucket": "b2", "key": "source-obj", "body": { "$data": "src" } } } ], "data": { "src": { "$pattern": { "pattern": "z", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b2.name}/source-obj", "CopySourceRange": "bytes=100-200", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "capture": { "copyEtag": "CopyPartResult.ETag" }, "expect": { "response": { "CopyPartResult": { "$exists": true } } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "Parts": [ { "PartNumber": 1, "Size": 101, "ETag": "${cap.copyEtag}" } ] } } } } ] }, { "id": "multipart-0096", "group": "multipart", "kind": "api", "title": "UploadPartCopy CopySourceIfMatch: matching ETag succeeds, wrong ETag returns PreconditionFailed", "tags": [ "tier-1", "multipart", "copy", "conditional", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L513", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId1": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceIfMatch": "${res.o1.etag}", "UploadId": "${cap.uploadId1}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "response": { "CopyPartResult": { "$exists": true } } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj-2" }, "capture": { "uploadId2": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceIfMatch": "\"invalid-etag\"", "UploadId": "${cap.uploadId2}", "Key": "my-obj-2", "PartNumber": 1 }, "expect": { "status": 412, "error": "PreconditionFailed" } } } ] }, { "id": "multipart-0097", "group": "multipart", "kind": "api", "title": "UploadPartCopy CopySourceIfModifiedSince: past date succeeds, future date returns PreconditionFailed", "description": "The source test used now-1day and now+1day; fixed far-past and far-future dates preserve the semantics. AWS returns 412 PreconditionFailed for the unmet condition; the source test also accepted NotModified from other implementations.", "tags": [ "tier-1", "multipart", "copy", "conditional", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L619", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId1": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceIfModifiedSince": "2000-01-01T00:00:00Z", "UploadId": "${cap.uploadId1}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "response": { "CopyPartResult": { "$exists": true } } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj-2" }, "capture": { "uploadId2": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceIfModifiedSince": "2099-01-01T00:00:00Z", "UploadId": "${cap.uploadId2}", "Key": "my-obj-2", "PartNumber": 1 }, "expect": { "response": { "CopyPartResult": { "ETag": { "$exists": true } } } } } } ] }, { "id": "multipart-0098", "group": "multipart", "kind": "api", "title": "UploadPartCopy CopySourceIfNoneMatch: non-matching ETag succeeds, matching ETag returns PreconditionFailed", "description": "AWS returns 412 PreconditionFailed when x-amz-copy-source-if-none-match matches the source ETag. The source test also accepted NotModified from other implementations.", "tags": [ "tier-1", "multipart", "copy", "conditional", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L565", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId1": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceIfNoneMatch": "\"invalid-etag\"", "UploadId": "${cap.uploadId1}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "response": { "CopyPartResult": { "$exists": true } } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj-2" }, "capture": { "uploadId2": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceIfNoneMatch": "${res.o1.etag}", "UploadId": "${cap.uploadId2}", "Key": "my-obj-2", "PartNumber": 1 }, "expect": { "status": 412, "error": "PreconditionFailed" } } } ] }, { "id": "multipart-0099", "group": "multipart", "kind": "api", "title": "UploadPartCopy CopySourceIfUnmodifiedSince: future date succeeds, past date returns PreconditionFailed", "description": "The source test used now+1day and now-1day; fixed far-future and far-past dates preserve the semantics.", "tags": [ "tier-1", "multipart", "copy", "conditional", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L673", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId1": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceIfUnmodifiedSince": "2099-01-01T00:00:00Z", "UploadId": "${cap.uploadId1}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "response": { "CopyPartResult": { "$exists": true } } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj-2" }, "capture": { "uploadId2": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceIfUnmodifiedSince": "2000-01-01T00:00:00Z", "UploadId": "${cap.uploadId2}", "Key": "my-obj-2", "PartNumber": 1 }, "expect": { "status": 412, "error": "PreconditionFailed" } } } ] }, { "id": "multipart-0100", "group": "multipart", "kind": "api", "title": "UploadPartCopy with a range extending past the source object end is rejected", "description": "Unlike a ranged GET, UploadPartCopy strictly validates CopySourceRange against the source size: bytes=0-2000 on a 1024-byte object is 400 InvalidArgument on AWS. The source test also accepted InvalidRange.", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L379", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": { "$data": "src" } } } ], "data": { "src": { "$pattern": { "pattern": "a", "size": 1024 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceRange": "bytes=0-2000", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0101", "group": "multipart", "kind": "api", "title": "UploadPartCopy with a range starting beyond the source object end is rejected", "description": "bytes=2000-3000 on a 1024-byte source object is 400 InvalidArgument on AWS. The source test also accepted InvalidRange.", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L420", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": { "$data": "src" } } } ], "data": { "src": { "$pattern": { "pattern": "b", "size": 1024 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "CopySourceRange": "bytes=2000-3000", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidRequest" } } } ] }, { "id": "multipart-0102", "group": "multipart", "kind": "api", "title": "UploadPartCopy with a key different from the multipart upload's returns NoSuchUpload", "description": "An upload id is tied to the key it was created for; using it with another key must fail.", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L88", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "UploadId": "${cap.uploadId}", "Key": "different-key", "PartNumber": 1 }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0103", "group": "multipart", "kind": "api", "title": "UploadPartCopy with an unknown upload id returns NoSuchUpload", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L56", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": "test data" } } ], "steps": [ { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "UploadId": "invalid-upload-id", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0104", "group": "multipart", "kind": "api", "title": "UploadPartCopy with a malformed CopySource is rejected", "description": "CopySource must be of the form bucket/key. AWS returns 400 InvalidArgument for each malformed value; the source test also accepted NoSuchBucket, NoSuchKey and InvalidRequest from implementations that parse the source before validating it.", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L168", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "invalid-format", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "/invalid", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "bucket", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "bucket/", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0105", "group": "multipart", "kind": "api", "title": "UploadPartCopy with part numbers outside 1-10000 is rejected", "description": "AWS returns 400 InvalidArgument for part numbers 0, -1 and 10001. The source test also accepted InvalidPartNumber and InvalidPart from other implementations.", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L125", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$object": { "handle": "o1", "bucket": "b1", "key": "source-obj", "body": { "$data": "src" } } } ], "data": { "src": { "$pattern": { "pattern": "test data", "size": 900 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 0 }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": -1 }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/source-obj", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 10001 }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0106", "group": "multipart", "kind": "api", "title": "UploadPartCopy to a non-existent destination bucket returns NoSuchBucket", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L31", "steps": [ { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "non-existing-bucket-12345", "CopySource": "source-bucket/source-key", "UploadId": "fake-upload-id", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "multipart-0107", "group": "multipart", "kind": "api", "title": "UploadPartCopy from a non-existent source bucket returns NoSuchBucket", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L214", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "non-existing-source-bucket/source-key", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "multipart-0108", "group": "multipart", "kind": "api", "title": "UploadPartCopy from a non-existent source key returns NoSuchKey", "tags": [ "tier-1", "multipart", "copy", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L245", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b1.name}/non-existing-key", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "multipart-0109", "group": "multipart", "kind": "api", "title": "UploadPartCopy copies a whole 5 MiB object into a part; ListParts shows its size and ETag", "tags": [ "tier-1", "multipart", "copy", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_upload_part_copy.py#L276", "prerequisites": [ { "$bucket": { "handle": "b1" } }, { "$bucket": { "handle": "b2" } }, { "$object": { "handle": "o1", "bucket": "b2", "key": "source-obj", "body": { "$data": "src" } } } ], "data": { "src": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPartCopy", "params": { "Bucket": "${res.b1.name}", "CopySource": "${res.b2.name}/source-obj", "UploadId": "${cap.uploadId}", "Key": "my-obj", "PartNumber": 1 }, "capture": { "copyEtag": "CopyPartResult.ETag" }, "expect": { "response": { "CopyPartResult": { "ETag": { "$exists": true } } } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "Parts": [ { "PartNumber": 1, "Size": 5242880, "ETag": "${cap.copyEtag}" } ] } } } } ] }, { "id": "multipart-0110", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload after AbortMultipartUpload returns NoSuchUpload", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart.py#L396", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "a", "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": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0111", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with an empty Parts list returns MalformedXML", "description": "AWS returns MalformedXML for an empty CompleteMultipartUpload Parts list. The source test also accepted InvalidRequest from other implementations.", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart.py#L186", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "a", "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": "part1" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [] } }, "expect": { "status": 400, "error": "MalformedXML" } } } ] }, { "id": "multipart-0112", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with parts out of ascending order returns InvalidPartOrder", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart.py#L230", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "patternBase64": "AQ==", "size": 15728640 } }, "part2": { "$pattern": { "patternBase64": "Ag==", "size": 15728640 } }, "part3": { "$pattern": { "patternBase64": "Aw==", "size": 15728640 } } }, "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": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "part3" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 2, "ETag": "${cap.etag2}" }, { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 3, "ETag": "${cap.etag3}" } ] } }, "expect": { "status": 400, "error": "InvalidPartOrder" } } } ] }, { "id": "multipart-0113", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with an invalid ETag returns InvalidPart", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart.py#L99", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "a", "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": "part1" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "invalidETag" } ] } }, "expect": { "status": 400, "error": "InvalidPart" } } } ] }, { "id": "multipart-0114", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with a negative part number is rejected", "description": "AWS returns 400 InvalidArgument for a part number outside 1-10000. The source test also accepted InvalidPart from other implementations.", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart.py#L271", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "a", "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": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": -4, "ETag": "${cap.etag1}" } ] } }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0115", "group": "multipart", "kind": "api", "title": "Single-part multipart upload completes and has the correct size", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart.py#L442", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "z", "size": 10485760 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "single-part-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "single-part-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "single-part-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } }, "expect": { "response": { "Key": "single-part-obj" } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "single-part-obj" }, "expect": { "response": { "ContentLength": 10485760 } } } } ] }, { "id": "multipart-0116", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with non-final parts under 5 MiB returns EntityTooSmall", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart.py#L140", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part": { "$pattern": { "pattern": "x", "size": 1024 } } }, "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": "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}" } ] } }, "expect": { "status": 400, "error": "EntityTooSmall" } } } ] }, { "id": "multipart-0117", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload succeeds when MpuObjectSize matches the actual object size", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_advanced_features.py#L149", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "x5m": { "$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": "x5m" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MpuObjectSize": 5242880, "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "ContentLength": 5242880 } } } } ] }, { "id": "multipart-0118", "group": "multipart", "kind": "api", "title": "Multipart ETag has hash-partcount format and HeadObject returns the same ETag", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_advanced.py#L328", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "p1": { "$pattern": { "pattern": "part1", "size": 5242880 } }, "p2": { "$pattern": { "pattern": "part2", "size": 5242880 } }, "p3": { "$pattern": { "pattern": "part3", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "etag-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "etag-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "p1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "etag-object", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "p2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "etag-object", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "p3" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "etag-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" }, { "PartNumber": 3, "ETag": "${cap.etag3}" } ] } }, "capture": { "completeEtag": "ETag" }, "expect": { "response": { "ETag": { "$matches": "-3\"?$" } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "etag-object" }, "expect": { "response": { "ETag": "${cap.completeEtag}" } } } } ] }, { "id": "multipart-0119", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload replaces an existing object at the same key", "tags": [ "tier-1", "multipart", "object-crud", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_advanced.py#L152", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "newdata": { "$pattern": { "pattern": "new content from multipart", "size": 5048680 } } }, "steps": [ { "$operation": { "name": "PutObject", "params": { "Bucket": "${res.b1.name}", "Key": "replace-object", "Body": "initial content" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "replace-object" }, "expect": { "body": "initial content" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "replace-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "replace-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "newdata" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "replace-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "replace-object" }, "expect": { "body": { "$data": "newdata" } } } } ] }, { "id": "multipart-0120", "group": "multipart", "kind": "api", "title": "Multipart upload initiated with a private canned ACL yields grants on the completed object", "tags": [ "tier-3", "multipart", "acl", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_advanced.py#L91", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "x5m": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "acl-object", "ACL": "private" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "acl-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "x5m" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "acl-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "GetObjectAcl", "params": { "Bucket": "${res.b1.name}", "Key": "acl-object" }, "expect": { "response": { "Grants": { "$exists": true } } } } } ] }, { "id": "multipart-0121", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload accepts an Expires header and the upload completes", "description": "The original test treats preservation of Expires as implementation-specific and only asserts the operations succeed, so no Expires response assertion is made.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_advanced.py#L272", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "x5m": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "expires-object", "Expires": "2030-01-01T00:00:00Z" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "expires-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "x5m" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "expires-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "expires-object" } } } ] }, { "id": "multipart-0122", "group": "multipart", "kind": "api", "title": "Multipart upload initiated with SSE-S3 preserves AES256 encryption on the completed object", "tags": [ "tier-1", "multipart", "sse", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_advanced.py#L31", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "p1": { "$pattern": { "pattern": "part1", "size": 5242880 } }, "p2": { "$pattern": { "pattern": "part2", "size": 5242880 } }, "p3": { "$pattern": { "pattern": "part3", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "sse-s3-object", "ServerSideEncryption": "AES256" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "sse-s3-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "p1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "sse-s3-object", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "p2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "sse-s3-object", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "p3" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "sse-s3-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" }, { "PartNumber": 3, "ETag": "${cap.etag3}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "sse-s3-object" }, "expect": { "response": { "ServerSideEncryption": "AES256" } } } } ] }, { "id": "multipart-0123", "group": "multipart", "kind": "api", "title": "WebsiteRedirectLocation set at CreateMultipartUpload is preserved on the completed object", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_advanced.py#L213", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "x5m": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "redirect-object", "WebsiteRedirectLocation": "https://example.com/redirect" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "redirect-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "x5m" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "redirect-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "redirect-object" }, "expect": { "response": { "WebsiteRedirectLocation": "https://example.com/redirect" } } } } ] }, { "id": "multipart-0124", "group": "multipart", "kind": "api", "title": "Assembled multipart object content equals the concatenation of its parts", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_checksums.py#L447", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "p1": { "$pattern": { "pattern": "Part-1-", "size": 7340032 } }, "p2": { "$pattern": { "pattern": "Part-2-", "size": 7340032 } }, "p3": { "$pattern": { "pattern": "Part-3-", "size": 7340032 } } }, "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": "p1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "p2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "p3" } }, "capture": { "etag3": "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}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "body": { "$size": 22020096, "$md5": "15f236d1364c758911d7493f254e55dc", "$sha256": "b9bcd6e9a592643e848ce1568884aaefbaa77e12413465ee7a40dacddf84a6d7" } } } } ] }, { "id": "multipart-0125", "group": "multipart", "kind": "api", "title": "50 MiB multipart upload of ten 5 MiB parts completes with correct ContentLength", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_checksums.py#L161", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "z5m": { "$pattern": { "pattern": "z", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "z5m" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "z5m" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "z5m" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "z5m" } }, "capture": { "etag4": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "z5m" } }, "capture": { "etag5": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 6, "Body": { "$data": "z5m" } }, "capture": { "etag6": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 7, "Body": { "$data": "z5m" } }, "capture": { "etag7": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 8, "Body": { "$data": "z5m" } }, "capture": { "etag8": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 9, "Body": { "$data": "z5m" } }, "capture": { "etag9": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj", "UploadId": "${cap.uploadId}", "PartNumber": 10, "Body": { "$data": "z5m" } }, "capture": { "etag10": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large-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}" }, { "PartNumber": 6, "ETag": "${cap.etag6}" }, { "PartNumber": 7, "ETag": "${cap.etag7}" }, { "PartNumber": 8, "ETag": "${cap.etag8}" }, { "PartNumber": 9, "ETag": "${cap.etag9}" }, { "PartNumber": 10, "ETag": "${cap.etag10}" } ] } }, "expect": { "response": { "ETag": { "$exists": true }, "Location": { "$exists": true } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "large-obj" }, "expect": { "response": { "ContentLength": 52428800 } } } } ] }, { "id": "multipart-0126", "group": "multipart", "kind": "api", "title": "Parts uploaded in reverse order assemble in part-number order on complete", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_checksums.py#L328", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "p1": { "$pattern": { "pattern": "part1", "size": 5242880 } }, "p2": { "$pattern": { "pattern": "part2", "size": 5242880 } }, "p3": { "$pattern": { "pattern": "part3", "size": 5242880 } }, "p4": { "$pattern": { "pattern": "part4", "size": 5242880 } }, "p5": { "$pattern": { "pattern": "part5", "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": 5, "Body": { "$data": "p5" } }, "capture": { "etag5": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "p4" } }, "capture": { "etag4": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "p3" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "p2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "p1" } }, "capture": { "etag1": "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}" } ] } }, "expect": { "response": { "ETag": { "$exists": true } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "body": { "$size": 26214400, "$md5": "acbeffb6bb28bc6d8b1ef67fbe7c383b" } } } } ] }, { "id": "multipart-0127", "group": "multipart", "kind": "api", "title": "Metadata, tags and content type from CreateMultipartUpload are preserved on the completed object", "tags": [ "tier-3", "multipart", "tagging", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_checksums.py#L213", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "a5m": { "$pattern": { "pattern": "a", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Metadata": { "key1": "value1", "key2": "value2" }, "Tagging": "tag1=value1&tag2=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": "a5m" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "a5m" } }, "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}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "Metadata": { "key1": "value1", "key2": "value2" }, "ContentType": "application/octet-stream" } } } }, { "$operation": { "name": "GetObjectTagging", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "TagSet": { "$length": 2, "$contains": { "Key": "tag1", "Value": "value1" } } } } } }, { "$operation": { "name": "GetObjectTagging", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "TagSet": { "$contains": { "Key": "tag2", "Value": "value2" } } } } } } ] }, { "id": "multipart-0128", "group": "multipart", "kind": "api", "title": "Multipart upload initiated with StorageClass STANDARD completes and the object is readable", "description": "The original test's StorageClass assertion is vacuous (always true); the converted assertion is that all operations succeed.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_checksums.py#L274", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "b5m": { "$pattern": { "pattern": "b", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "StorageClass": "STANDARD" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "b5m" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "b5m" } }, "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}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" } } } ] }, { "id": "multipart-0129", "group": "multipart", "kind": "api", "title": "Last multipart part may be smaller than the 5 MiB minimum", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_special.py#L128", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "a", "size": 5242880 } }, "part2": { "$pattern": { "pattern": "b", "size": 5242880 } }, "part3": { "$pattern": { "pattern": "c", "size": 1024 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "last-small-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "last-small-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "last-small-object", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "last-small-object", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "part3" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "last-small-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" }, { "PartNumber": 3, "ETag": "${cap.etag3}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "last-small-object" }, "expect": { "response": { "ContentLength": 10486784 } } } } ] }, { "id": "multipart-0130", "group": "multipart", "kind": "api", "title": "Multipart upload with 50 parts assembles correctly", "description": "Each part is 5 MiB of its decimal part number repeated; the read-back digest covers the 250 MB concatenation.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_special.py#L464", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "p1": { "$pattern": { "pattern": "1", "size": 5242880 } }, "p2": { "$pattern": { "pattern": "2", "size": 5242880 } }, "p3": { "$pattern": { "pattern": "3", "size": 5242880 } }, "p4": { "$pattern": { "pattern": "4", "size": 5242880 } }, "p5": { "$pattern": { "pattern": "5", "size": 5242880 } }, "p6": { "$pattern": { "pattern": "6", "size": 5242880 } }, "p7": { "$pattern": { "pattern": "7", "size": 5242880 } }, "p8": { "$pattern": { "pattern": "8", "size": 5242880 } }, "p9": { "$pattern": { "pattern": "9", "size": 5242880 } }, "p10": { "$pattern": { "pattern": "10", "size": 5242880 } }, "p11": { "$pattern": { "pattern": "11", "size": 5242880 } }, "p12": { "$pattern": { "pattern": "12", "size": 5242880 } }, "p13": { "$pattern": { "pattern": "13", "size": 5242880 } }, "p14": { "$pattern": { "pattern": "14", "size": 5242880 } }, "p15": { "$pattern": { "pattern": "15", "size": 5242880 } }, "p16": { "$pattern": { "pattern": "16", "size": 5242880 } }, "p17": { "$pattern": { "pattern": "17", "size": 5242880 } }, "p18": { "$pattern": { "pattern": "18", "size": 5242880 } }, "p19": { "$pattern": { "pattern": "19", "size": 5242880 } }, "p20": { "$pattern": { "pattern": "20", "size": 5242880 } }, "p21": { "$pattern": { "pattern": "21", "size": 5242880 } }, "p22": { "$pattern": { "pattern": "22", "size": 5242880 } }, "p23": { "$pattern": { "pattern": "23", "size": 5242880 } }, "p24": { "$pattern": { "pattern": "24", "size": 5242880 } }, "p25": { "$pattern": { "pattern": "25", "size": 5242880 } }, "p26": { "$pattern": { "pattern": "26", "size": 5242880 } }, "p27": { "$pattern": { "pattern": "27", "size": 5242880 } }, "p28": { "$pattern": { "pattern": "28", "size": 5242880 } }, "p29": { "$pattern": { "pattern": "29", "size": 5242880 } }, "p30": { "$pattern": { "pattern": "30", "size": 5242880 } }, "p31": { "$pattern": { "pattern": "31", "size": 5242880 } }, "p32": { "$pattern": { "pattern": "32", "size": 5242880 } }, "p33": { "$pattern": { "pattern": "33", "size": 5242880 } }, "p34": { "$pattern": { "pattern": "34", "size": 5242880 } }, "p35": { "$pattern": { "pattern": "35", "size": 5242880 } }, "p36": { "$pattern": { "pattern": "36", "size": 5242880 } }, "p37": { "$pattern": { "pattern": "37", "size": 5242880 } }, "p38": { "$pattern": { "pattern": "38", "size": 5242880 } }, "p39": { "$pattern": { "pattern": "39", "size": 5242880 } }, "p40": { "$pattern": { "pattern": "40", "size": 5242880 } }, "p41": { "$pattern": { "pattern": "41", "size": 5242880 } }, "p42": { "$pattern": { "pattern": "42", "size": 5242880 } }, "p43": { "$pattern": { "pattern": "43", "size": 5242880 } }, "p44": { "$pattern": { "pattern": "44", "size": 5242880 } }, "p45": { "$pattern": { "pattern": "45", "size": 5242880 } }, "p46": { "$pattern": { "pattern": "46", "size": 5242880 } }, "p47": { "$pattern": { "pattern": "47", "size": 5242880 } }, "p48": { "$pattern": { "pattern": "48", "size": 5242880 } }, "p49": { "$pattern": { "pattern": "49", "size": 5242880 } }, "p50": { "$pattern": { "pattern": "50", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "p1" } }, "capture": { "e1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "p2" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "p3" } }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "p4" } }, "capture": { "e4": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "p5" } }, "capture": { "e5": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 6, "Body": { "$data": "p6" } }, "capture": { "e6": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 7, "Body": { "$data": "p7" } }, "capture": { "e7": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 8, "Body": { "$data": "p8" } }, "capture": { "e8": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 9, "Body": { "$data": "p9" } }, "capture": { "e9": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 10, "Body": { "$data": "p10" } }, "capture": { "e10": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 11, "Body": { "$data": "p11" } }, "capture": { "e11": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 12, "Body": { "$data": "p12" } }, "capture": { "e12": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 13, "Body": { "$data": "p13" } }, "capture": { "e13": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 14, "Body": { "$data": "p14" } }, "capture": { "e14": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 15, "Body": { "$data": "p15" } }, "capture": { "e15": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 16, "Body": { "$data": "p16" } }, "capture": { "e16": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 17, "Body": { "$data": "p17" } }, "capture": { "e17": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 18, "Body": { "$data": "p18" } }, "capture": { "e18": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 19, "Body": { "$data": "p19" } }, "capture": { "e19": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 20, "Body": { "$data": "p20" } }, "capture": { "e20": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 21, "Body": { "$data": "p21" } }, "capture": { "e21": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 22, "Body": { "$data": "p22" } }, "capture": { "e22": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 23, "Body": { "$data": "p23" } }, "capture": { "e23": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 24, "Body": { "$data": "p24" } }, "capture": { "e24": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 25, "Body": { "$data": "p25" } }, "capture": { "e25": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 26, "Body": { "$data": "p26" } }, "capture": { "e26": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 27, "Body": { "$data": "p27" } }, "capture": { "e27": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 28, "Body": { "$data": "p28" } }, "capture": { "e28": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 29, "Body": { "$data": "p29" } }, "capture": { "e29": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 30, "Body": { "$data": "p30" } }, "capture": { "e30": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 31, "Body": { "$data": "p31" } }, "capture": { "e31": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 32, "Body": { "$data": "p32" } }, "capture": { "e32": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 33, "Body": { "$data": "p33" } }, "capture": { "e33": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 34, "Body": { "$data": "p34" } }, "capture": { "e34": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 35, "Body": { "$data": "p35" } }, "capture": { "e35": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 36, "Body": { "$data": "p36" } }, "capture": { "e36": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 37, "Body": { "$data": "p37" } }, "capture": { "e37": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 38, "Body": { "$data": "p38" } }, "capture": { "e38": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 39, "Body": { "$data": "p39" } }, "capture": { "e39": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 40, "Body": { "$data": "p40" } }, "capture": { "e40": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 41, "Body": { "$data": "p41" } }, "capture": { "e41": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 42, "Body": { "$data": "p42" } }, "capture": { "e42": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 43, "Body": { "$data": "p43" } }, "capture": { "e43": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 44, "Body": { "$data": "p44" } }, "capture": { "e44": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 45, "Body": { "$data": "p45" } }, "capture": { "e45": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 46, "Body": { "$data": "p46" } }, "capture": { "e46": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 47, "Body": { "$data": "p47" } }, "capture": { "e47": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 48, "Body": { "$data": "p48" } }, "capture": { "e48": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 49, "Body": { "$data": "p49" } }, "capture": { "e49": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 50, "Body": { "$data": "p50" } }, "capture": { "e50": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" }, { "PartNumber": 4, "ETag": "${cap.e4}" }, { "PartNumber": 5, "ETag": "${cap.e5}" }, { "PartNumber": 6, "ETag": "${cap.e6}" }, { "PartNumber": 7, "ETag": "${cap.e7}" }, { "PartNumber": 8, "ETag": "${cap.e8}" }, { "PartNumber": 9, "ETag": "${cap.e9}" }, { "PartNumber": 10, "ETag": "${cap.e10}" }, { "PartNumber": 11, "ETag": "${cap.e11}" }, { "PartNumber": 12, "ETag": "${cap.e12}" }, { "PartNumber": 13, "ETag": "${cap.e13}" }, { "PartNumber": 14, "ETag": "${cap.e14}" }, { "PartNumber": 15, "ETag": "${cap.e15}" }, { "PartNumber": 16, "ETag": "${cap.e16}" }, { "PartNumber": 17, "ETag": "${cap.e17}" }, { "PartNumber": 18, "ETag": "${cap.e18}" }, { "PartNumber": 19, "ETag": "${cap.e19}" }, { "PartNumber": 20, "ETag": "${cap.e20}" }, { "PartNumber": 21, "ETag": "${cap.e21}" }, { "PartNumber": 22, "ETag": "${cap.e22}" }, { "PartNumber": 23, "ETag": "${cap.e23}" }, { "PartNumber": 24, "ETag": "${cap.e24}" }, { "PartNumber": 25, "ETag": "${cap.e25}" }, { "PartNumber": 26, "ETag": "${cap.e26}" }, { "PartNumber": 27, "ETag": "${cap.e27}" }, { "PartNumber": 28, "ETag": "${cap.e28}" }, { "PartNumber": 29, "ETag": "${cap.e29}" }, { "PartNumber": 30, "ETag": "${cap.e30}" }, { "PartNumber": 31, "ETag": "${cap.e31}" }, { "PartNumber": 32, "ETag": "${cap.e32}" }, { "PartNumber": 33, "ETag": "${cap.e33}" }, { "PartNumber": 34, "ETag": "${cap.e34}" }, { "PartNumber": 35, "ETag": "${cap.e35}" }, { "PartNumber": 36, "ETag": "${cap.e36}" }, { "PartNumber": 37, "ETag": "${cap.e37}" }, { "PartNumber": 38, "ETag": "${cap.e38}" }, { "PartNumber": 39, "ETag": "${cap.e39}" }, { "PartNumber": 40, "ETag": "${cap.e40}" }, { "PartNumber": 41, "ETag": "${cap.e41}" }, { "PartNumber": 42, "ETag": "${cap.e42}" }, { "PartNumber": 43, "ETag": "${cap.e43}" }, { "PartNumber": 44, "ETag": "${cap.e44}" }, { "PartNumber": 45, "ETag": "${cap.e45}" }, { "PartNumber": 46, "ETag": "${cap.e46}" }, { "PartNumber": 47, "ETag": "${cap.e47}" }, { "PartNumber": 48, "ETag": "${cap.e48}" }, { "PartNumber": 49, "ETag": "${cap.e49}" }, { "PartNumber": 50, "ETag": "${cap.e50}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object" }, "expect": { "response": { "ContentLength": 262144000 } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "many-parts-object" }, "expect": { "body": { "$size": 262144000, "$sha256": "0917f396e5fced333a4be8eef60701ef30216a58bcb4bb219d6a8b8cfc3d228e" } } } } ] }, { "id": "multipart-0131", "group": "multipart", "kind": "api", "title": "Multipart upload with the maximum part number 10000 succeeds", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_special.py#L79", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "x", "size": 1024 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "max-part-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "max-part-object", "UploadId": "${cap.uploadId}", "PartNumber": 10000, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "max-part-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 10000, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "max-part-object" }, "expect": { "response": { "ContentLength": 1024 } } } } ] }, { "id": "multipart-0132", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload with a non-last part under 5 MiB returns EntityTooSmall", "description": "The source accepted EntityTooSmall or InvalidPart; the canonical S3 code EntityTooSmall is asserted here.", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_special.py#L200", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "a", "size": 5242880 } }, "part2": { "$pattern": { "pattern": "b", "size": 1024 } }, "part3": { "$pattern": { "pattern": "c", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "middle-small-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "middle-small-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "middle-small-object", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "middle-small-object", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "part3" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "middle-small-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" }, { "PartNumber": 3, "ETag": "${cap.etag3}" } ] } }, "expect": { "status": 400, "error": "EntityTooSmall" } } } ] }, { "id": "multipart-0133", "group": "multipart", "kind": "api", "title": "CompleteMultipartUpload naming parts that were never uploaded returns InvalidPart", "description": "The source accepted InvalidPart or NoSuchKey; the canonical S3 code InvalidPart is asserted here.", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_special.py#L525", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "missing-parts-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "missing-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "missing-parts-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "fake-etag-1" }, { "PartNumber": 3, "ETag": "fake-etag-2" } ] } }, "expect": { "status": 400, "error": "InvalidPart" } } } ] }, { "id": "multipart-0134", "group": "multipart", "kind": "api", "title": "Multipart part numbers need not be consecutive", "description": "Parts 1, 5 and 10 are uploaded; the assembled object must be their concatenation (digest of 5 MiB 'a' + 5 MiB 'b' + 5 MiB 'c').", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_special.py#L332", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "a", "size": 5242880 } }, "part5": { "$pattern": { "pattern": "b", "size": 5242880 } }, "part10": { "$pattern": { "pattern": "c", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "sparse-parts-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "sparse-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "sparse-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "part5" } }, "capture": { "etag5": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "sparse-parts-object", "UploadId": "${cap.uploadId}", "PartNumber": 10, "Body": { "$data": "part10" } }, "capture": { "etag10": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "sparse-parts-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 5, "ETag": "${cap.etag5}" }, { "PartNumber": 10, "ETag": "${cap.etag10}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "sparse-parts-object" }, "expect": { "body": { "$size": 15728640, "$md5": "c99aa92b06e912ad508ec2a91b16a5e9" } } } } ] }, { "id": "multipart-0135", "group": "multipart", "kind": "api", "title": "Multipart upload of a single empty part creates a zero-length object", "description": "The source skipped when the server rejected empty parts with EntityTooSmall/InvalidPart; AWS accepts a single empty part, asserted here.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_complete_multipart_special.py#L406", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": "" }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "empty-object" }, "expect": { "response": { "ContentLength": 0 } } } } ] }, { "id": "multipart-0136", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload rejects duplicate tag keys", "description": "Original test accepted InvalidTag or InvalidRequest; alternatives are not expressible, so the common HTTP 400 status is asserted.", "tags": [ "tier-1", "multipart", "tagging", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L321", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-obj", "Tagging": "key=val&key=val" }, "expect": { "status": 400 } } } ] }, { "id": "multipart-0137", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload accepts degenerate empty tagging strings", "tags": [ "tier-1", "multipart", "tagging", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L201", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-amp", "Tagging": "&" }, "capture": { "uid1": "UploadId" }, "expect": { "response": { "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-amp", "UploadId": "${cap.uid1}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-ampampamp", "Tagging": "&&&" }, "capture": { "uid2": "UploadId" }, "expect": { "response": { "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-ampampamp", "UploadId": "${cap.uid2}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-key", "Tagging": "key" }, "capture": { "uid3": "UploadId" }, "expect": { "response": { "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-key", "UploadId": "${cap.uid3}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-keyamp", "Tagging": "key&" }, "capture": { "uid4": "UploadId" }, "expect": { "response": { "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-keyamp", "UploadId": "${cap.uid4}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-key=amp", "Tagging": "key=&" }, "capture": { "uid5": "UploadId" }, "expect": { "response": { "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "obj-key=amp", "UploadId": "${cap.uid5}" } } } ] }, { "id": "multipart-0138", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload rejects tag keys and values with invalid characters", "description": "Original test accepted InvalidTag, InvalidTagKey or InvalidTagValue; alternatives are not expressible, so the common HTTP 400 status is asserted.", "tags": [ "tier-1", "multipart", "tagging", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L231", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-obj", "Tagging": "key?=val" }, "expect": { "status": 400 } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-obj", "Tagging": "key=val?" }, "expect": { "status": 400 } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-obj", "Tagging": "key*=val" }, "expect": { "status": 400 } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-obj", "Tagging": "key=val*" }, "expect": { "status": 400 } } } ] }, { "id": "multipart-0139", "group": "multipart", "kind": "api", "title": "Multiple concurrent multipart uploads are allowed for the same key", "description": "Original test also asserted the three upload IDs differ; value inequality is not expressible, but three listed uploads for the key implies three distinct uploads.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L351", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "my-obj" }, { "Key": "my-obj" }, { "Key": "my-obj" } ] } } } } ] }, { "id": "multipart-0140", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload on a non-existing bucket returns NoSuchBucket", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L30", "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "non-existing-bucket-12345", "Key": "my-obj" }, "expect": { "status": 404, "error": "NoSuchBucket" } } } ] }, { "id": "multipart-0141", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload accepts - _ . / in tag keys and values", "tags": [ "tier-3", "multipart", "tagging", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L269", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Tagging": "key-key_key.key/key=value-value_value.value/value" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "GetObjectTagging", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "TagSet": { "$contains": { "Key": "key-key_key.key/key", "Value": "value-value_value.value/value" } } } } } } ] }, { "id": "multipart-0142", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload returns a non-empty upload ID with bucket and key", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L174", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "UploadId": { "$matches": "." }, "Bucket": "${res.b1.name}", "Key": "my-obj" } } } } ] }, { "id": "multipart-0143", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload metadata and content headers are preserved on the completed object", "tags": [ "tier-1", "multipart", "metadata", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L51", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "x", "size": 100 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Metadata": { "prop1": "val1", "prop2": "val2" }, "ContentType": "application/text", "ContentEncoding": "testenc", "ContentDisposition": "testdesp", "ContentLanguage": "sp", "CacheControl": "no-cache", "Expires": "2035-01-01T00:00:00Z" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "Metadata": { "prop1": "val1", "prop2": "val2" }, "ContentType": "application/text", "ContentEncoding": "testenc", "ContentDisposition": "testdesp", "ContentLanguage": "sp", "CacheControl": "no-cache", "Expires": { "$exists": true } } } } } ] }, { "id": "multipart-0144", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload with StorageClass STANDARD completes successfully", "description": "Original test only verified the object exists after completion (ETag present); it did not assert the storage class on HeadObject.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L389", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "StorageClass": "STANDARD" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "ETag": { "$exists": true } } } } } ] }, { "id": "multipart-0145", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload with Tagging applies tags to the completed object", "tags": [ "tier-3", "multipart", "tagging", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart.py#L122", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "Tagging": "key1=val1&key2=val2" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "GetObjectTagging", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "TagSet": { "$length": 2, "$contains": { "Key": "key1", "Value": "val1" } } } } } }, { "$operation": { "name": "GetObjectTagging", "params": { "Bucket": "${res.b1.name}", "Key": "my-obj" }, "expect": { "response": { "TagSet": { "$contains": { "Key": "key2", "Value": "val2" } } } } } } ] }, { "id": "multipart-0146", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload response contains Bucket, Key and UploadId", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart_additional.py#L366", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "response-object" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "Bucket": "${res.b1.name}", "Key": "response-object", "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "response-object", "UploadId": "${cap.uploadId}" } } } ] }, { "id": "multipart-0147", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload returns a non-empty UploadId for each new upload", "description": "The source test also asserts the two UploadIds differ; inequality between captured values is not expressible, so only the non-empty-string assertion is carried over.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart_additional.py#L321", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "uploadid-object" }, "capture": { "uploadId1": "UploadId" }, "expect": { "response": { "UploadId": { "$matches": "." } } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "uploadid-object" }, "capture": { "uploadId2": "UploadId" }, "expect": { "response": { "UploadId": { "$matches": "." } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "uploadid-object", "UploadId": "${cap.uploadId1}" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "uploadid-object", "UploadId": "${cap.uploadId2}" } } } ] }, { "id": "multipart-0148", "group": "multipart", "kind": "api", "title": "ContentDisposition set at CreateMultipartUpload is preserved on the completed object", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart_additional.py#L122", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "disposition-object", "ContentDisposition": "attachment; filename=\"download.txt\"" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "disposition-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "disposition-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "disposition-object" }, "expect": { "response": { "ContentDisposition": "attachment; filename=\"download.txt\"" } } } } ] }, { "id": "multipart-0149", "group": "multipart", "kind": "api", "title": "ContentEncoding set at CreateMultipartUpload is preserved on the completed object", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart_additional.py#L403", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "encoding-object", "ContentEncoding": "gzip" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "encoding-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "encoding-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "encoding-object" }, "expect": { "response": { "ContentEncoding": "gzip" } } } } ] }, { "id": "multipart-0150", "group": "multipart", "kind": "api", "title": "ContentLanguage set at CreateMultipartUpload is preserved on the completed object", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart_additional.py#L173", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "x", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "language-object", "ContentLanguage": "en-US" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "language-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "language-object", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "language-object" }, "expect": { "response": { "ContentLanguage": "en-US" } } } } ] }, { "id": "multipart-0151", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload preserves keys with special ASCII characters", "tags": [ "tier-1", "multipart", "encoding", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart_special.py#L190", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key with spaces.txt" }, "capture": { "u1": "UploadId" }, "expect": { "response": { "Key": "key with spaces.txt", "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key with spaces.txt", "UploadId": "${cap.u1}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key-with-dashes.txt" }, "capture": { "u2": "UploadId" }, "expect": { "response": { "Key": "key-with-dashes.txt", "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key-with-dashes.txt", "UploadId": "${cap.u2}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key_with_underscores.txt" }, "capture": { "u3": "UploadId" }, "expect": { "response": { "Key": "key_with_underscores.txt", "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key_with_underscores.txt", "UploadId": "${cap.u3}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key.with.dots.txt" }, "capture": { "u4": "UploadId" }, "expect": { "response": { "Key": "key.with.dots.txt", "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key.with.dots.txt", "UploadId": "${cap.u4}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key!with@special#chars$.txt" }, "capture": { "u5": "UploadId" }, "expect": { "response": { "Key": "key!with@special#chars$.txt", "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "key!with@special#chars$.txt", "UploadId": "${cap.u5}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "path/to/nested/object.txt" }, "capture": { "u6": "UploadId" }, "expect": { "response": { "Key": "path/to/nested/object.txt", "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "path/to/nested/object.txt", "UploadId": "${cap.u6}" } } } ] }, { "id": "multipart-0152", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload accepts a 1024-byte key (maximum allowed)", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart_special.py#L117", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }, "capture": { "uploadId": "UploadId" }, "expect": { "response": { "UploadId": { "$exists": true } } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "UploadId": "${cap.uploadId}" } } } ] }, { "id": "multipart-0153", "group": "multipart", "kind": "api", "title": "Basic two-part multipart upload completes", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/multipart/100.py#L13", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "A", "size": 5242880 } }, "part2": { "$pattern": { "pattern": "B", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-2parts.bin" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-2parts.bin", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" }, "expect": { "response": { "ETag": "${data.part1.etag}" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-2parts.bin", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part2" } }, "capture": { "etag2": "ETag" }, "expect": { "response": { "ETag": "${data.part2.etag}" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-2parts.bin", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" } ] } }, "expect": { "response": { "Key": "multipart-2parts.bin", "ETag": { "$matches": "-2\"$" } } } } } ] }, { "id": "multipart-0154", "group": "multipart", "kind": "api", "title": "Aborted multipart upload leaves no object and invalidates the UploadId", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/multipart/102.py#L14", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$prng": { "seed": "multipart-0154/part1", "size": 5242880 } }, "part2": { "$prng": { "seed": "multipart-0154/part2", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "abort-test.bin" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "abort-test.bin", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "abort-test.bin", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part2" } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "abort-test.bin", "UploadId": "${cap.uploadId}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "abort-test.bin" }, "expect": { "status": 404, "error": "NoSuchKey" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "abort-test.bin", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": "test data" }, "expect": { "status": 404, "error": "NoSuchUpload" } } } ] }, { "id": "multipart-0155", "group": "multipart", "kind": "api", "title": "Complete one multipart upload and abort another in the same bucket", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/multipart/102.py#L14", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part": { "$prng": { "seed": "multipart-0155/part", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "complete-this.bin" }, "capture": { "uploadId1": "UploadId" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "abort-this.bin" }, "capture": { "uploadId2": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "complete-this.bin", "UploadId": "${cap.uploadId1}", "PartNumber": 1, "Body": { "$data": "part" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "abort-this.bin", "UploadId": "${cap.uploadId2}", "PartNumber": 1, "Body": { "$data": "part" } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "complete-this.bin", "UploadId": "${cap.uploadId1}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" } ] } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "abort-this.bin", "UploadId": "${cap.uploadId2}" } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "complete-this.bin" }, "expect": { "status": 200, "response": { "ContentLength": 5242880 } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "abort-this.bin" }, "expect": { "status": 404, "error": "NoSuchKey" } } } ] }, { "id": "multipart-0156", "group": "multipart", "kind": "api", "title": "ListParts returns an uploaded part", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/multipart/142.py#L14", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part1": { "$pattern": { "pattern": "X", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-list_parts.bin" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-list_parts.bin", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-list_parts.bin", "UploadId": "${cap.uploadId}" }, "expect": { "response": { "Parts": [ { "PartNumber": 1 } ] } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "multipart-list_parts.bin", "UploadId": "${cap.uploadId}" } } } ] }, { "id": "multipart-0157", "group": "multipart", "kind": "api", "title": "Parts uploaded out of order are assembled in part-number order", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/multipart/test_multipart_edge_cases.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "p1": { "$pattern": { "pattern": "1", "size": 5242880 } }, "p2": { "$pattern": { "pattern": "2", "size": 5242880 } }, "p3": { "$pattern": { "pattern": "3", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "out-of-order-upload" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "out-of-order-upload", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "p3" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "out-of-order-upload", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "p1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "out-of-order-upload", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "p2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "out-of-order-upload", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etag1}" }, { "PartNumber": 2, "ETag": "${cap.etag2}" }, { "PartNumber": 3, "ETag": "${cap.etag3}" } ] } }, "expect": { "response": { "Key": "out-of-order-upload", "ETag": { "$matches": "-3\"$" } } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "out-of-order-upload" }, "expect": { "status": 200, "response": { "ContentLength": 15728640 } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "out-of-order-upload", "Range": "bytes=0-5242879" }, "expect": { "status": 206, "body": { "$data": "p1" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "out-of-order-upload", "Range": "bytes=5242880-10485759" }, "expect": { "status": 206, "body": { "$data": "p2" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "out-of-order-upload", "Range": "bytes=10485760-15728639" }, "expect": { "status": 206, "body": { "$data": "p3" } } } } ] }, { "id": "multipart-0158", "group": "multipart", "kind": "api", "title": "Re-uploading the same part number overwrites with the later part", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/multipart/test_multipart_edge_cases.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "pa": { "$pattern": { "pattern": "A", "size": 5242880 } }, "pb": { "$pattern": { "pattern": "B", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "duplicate-parts" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "duplicate-parts", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pa" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "duplicate-parts", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "pb" } }, "capture": { "etagb": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "duplicate-parts", "UploadId": "${cap.uploadId}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etagb}" } ] } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "duplicate-parts" }, "expect": { "status": 200, "response": { "ContentLength": 5242880 }, "body": { "$data": "pb" } } } } ] }, { "id": "multipart-0159", "group": "multipart", "kind": "api", "title": "UploadPart rejects out-of-range part numbers with InvalidArgument", "tags": [ "tier-1", "multipart", "errors", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/multipart/test_multipart_edge_cases.py#L17", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part": { "$pattern": { "pattern": "X", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "part-number-limits" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "part-number-limits", "UploadId": "${cap.uploadId}", "PartNumber": 0, "Body": { "$data": "part" } }, "expect": { "status": 400, "error": "InvalidArgument" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "part-number-limits", "UploadId": "${cap.uploadId}", "PartNumber": 10001, "Body": { "$data": "part" } }, "expect": { "status": 400, "error": "InvalidArgument" } } } ] }, { "id": "multipart-0160", "group": "multipart", "kind": "api", "title": "Complete a 5-part multipart upload and read back with matching checksum", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/multipart/test_multipart_upload.py#L120", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "big": { "$prng": { "seed": "multipart-0160/big", "size": 26214400 } }, "part1": { "$slice": { "of": "big", "offset": 0, "length": 5242880 } }, "part2": { "$slice": { "of": "big", "offset": 5242880, "length": 5242880 } }, "part3": { "$slice": { "of": "big", "offset": 10485760, "length": 5242880 } }, "part4": { "$slice": { "of": "big", "offset": 15728640, "length": 5242880 } }, "part5": { "$slice": { "of": "big", "offset": 20971520, "length": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-complete-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "test-complete-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part1" } }, "capture": { "etag1": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "test-complete-object", "UploadId": "${cap.uploadId}", "PartNumber": 2, "Body": { "$data": "part2" } }, "capture": { "etag2": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "test-complete-object", "UploadId": "${cap.uploadId}", "PartNumber": 3, "Body": { "$data": "part3" } }, "capture": { "etag3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "test-complete-object", "UploadId": "${cap.uploadId}", "PartNumber": 4, "Body": { "$data": "part4" } }, "capture": { "etag4": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "test-complete-object", "UploadId": "${cap.uploadId}", "PartNumber": 5, "Body": { "$data": "part5" } }, "capture": { "etag5": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-complete-object", "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": { "objEtag": "ETag" }, "expect": { "response": { "Key": "test-complete-object", "ETag": { "$matches": "-5\"$" } } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-complete-object" }, "expect": { "response": { "ContentLength": 26214400, "ETag": "${cap.objEtag}" } } } }, { "$operation": { "name": "GetObject", "params": { "Bucket": "${res.b1.name}", "Key": "test-complete-object" }, "expect": { "status": 200, "response": { "ContentLength": 26214400 }, "body": { "$size": 26214400, "$sha256": "${data.big.sha256}" } } } } ] }, { "id": "multipart-0161", "group": "multipart", "kind": "api", "title": "UploadPart returns the part ETag", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/multipart/test_multipart_upload.py#L74", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part": { "$prng": { "seed": "multipart-0161/part", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-part-object" }, "capture": { "uploadId": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "test-part-object", "UploadId": "${cap.uploadId}", "PartNumber": 1, "Body": { "$data": "part" } }, "expect": { "response": { "ETag": "${data.part.etag}" } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "test-part-object", "UploadId": "${cap.uploadId}" } } } ] }, { "id": "multipart-0162", "group": "multipart", "kind": "api", "title": "ListParts reports the size of each uploaded multipart part", "description": "After uploading three 10 MiB parts to an in-progress upload, ListParts returns all three parts with correct Size, and the upload can be aborted.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3002.py#L185", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "part": { "$pattern": { "pattern": "X", "size": 10485760 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large-orphan/file.dat" }, "capture": { "uid": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-orphan/file.dat", "UploadId": "${cap.uid}", "PartNumber": 1, "Body": { "$data": "part" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-orphan/file.dat", "UploadId": "${cap.uid}", "PartNumber": 2, "Body": { "$data": "part" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large-orphan/file.dat", "UploadId": "${cap.uid}", "PartNumber": 3, "Body": { "$data": "part" } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "large-orphan/file.dat", "UploadId": "${cap.uid}" }, "expect": { "response": { "Parts": [ { "PartNumber": 1, "Size": 10485760 }, { "PartNumber": 2, "Size": 10485760 }, { "PartNumber": 3, "Size": 10485760 } ] } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large-orphan/file.dat", "UploadId": "${cap.uid}" } } } ] }, { "id": "multipart-0163", "group": "multipart", "kind": "api", "title": "ListMultipartUploads lists only in-progress uploads, not completed or aborted", "description": "Completed and aborted multipart uploads do not appear in ListMultipartUploads; abandoned (in-progress) uploads do, and can be aborted to clear the list.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3002.py#L31", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "orphan": { "$pattern": { "pattern": "orphaned data", "size": 13000 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "completed/file.dat" }, "capture": { "uidC": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "completed/file.dat", "UploadId": "${cap.uidC}", "PartNumber": 1, "Body": "test data for completed upload" }, "capture": { "etagC": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "completed/file.dat", "UploadId": "${cap.uidC}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.etagC}" } ] } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "aborted/file.dat" }, "capture": { "uidA": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "aborted/file.dat", "UploadId": "${cap.uidA}", "PartNumber": 1, "Body": "test data for aborted upload" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "aborted/file.dat", "UploadId": "${cap.uidA}" } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "abandoned/a-with-part.dat" }, "capture": { "uidO1": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "abandoned/a-with-part.dat", "UploadId": "${cap.uidO1}", "PartNumber": 1, "Body": { "$data": "orphan" } } } }, { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "abandoned/b-no-part.dat" }, "capture": { "uidO2": "UploadId" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": [ { "Key": "abandoned/a-with-part.dat" }, { "Key": "abandoned/b-no-part.dat" } ] } } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "abandoned/a-with-part.dat", "UploadId": "${cap.uidO1}" } } }, { "$operation": { "name": "AbortMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "abandoned/b-no-part.dat", "UploadId": "${cap.uidO2}" } } }, { "$operation": { "name": "ListMultipartUploads", "params": { "Bucket": "${res.b1.name}" }, "expect": { "response": { "Uploads": { "$absent": true } } } } } ] }, { "id": "multipart-0164", "group": "multipart", "kind": "api", "title": "Re-uploading the same part number with the same data is idempotent", "description": "Uploading part 1 three times with identical bytes returns the same ETag each time and ListParts shows a single part.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3011.py#L307", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "dataX": { "$pattern": { "pattern": "X", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "data/idempotent-test.dat" }, "capture": { "uid": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "data/idempotent-test.dat", "UploadId": "${cap.uid}", "PartNumber": 1, "Body": { "$data": "dataX" } }, "expect": { "response": { "ETag": "${data.dataX.etag}" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "data/idempotent-test.dat", "UploadId": "${cap.uid}", "PartNumber": 1, "Body": { "$data": "dataX" } }, "expect": { "response": { "ETag": "${data.dataX.etag}" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "data/idempotent-test.dat", "UploadId": "${cap.uid}", "PartNumber": 1, "Body": { "$data": "dataX" } }, "capture": { "e": "ETag" }, "expect": { "response": { "ETag": "${data.dataX.etag}" } } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "data/idempotent-test.dat", "UploadId": "${cap.uid}" }, "expect": { "response": { "Parts": [ { "PartNumber": 1, "ETag": "${data.dataX.etag}" } ] } } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "data/idempotent-test.dat", "UploadId": "${cap.uid}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e}" } ] } } } } ] }, { "id": "multipart-0165", "group": "multipart", "kind": "api", "title": "Resume a multipart upload using ListParts as a checkpoint", "description": "After uploading some parts, ListParts reports the uploaded parts; remaining parts are uploaded and the object completes with the full combined size.", "tags": [ "tier-1", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/production/3011.py#L33", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "data": { "dataX": { "$pattern": { "pattern": "X", "size": 5242880 } }, "dataY": { "$pattern": { "pattern": "Y", "size": 5242880 } } }, "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large/resumable-file.bin" }, "capture": { "uid": "UploadId" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large/resumable-file.bin", "UploadId": "${cap.uid}", "PartNumber": 1, "Body": { "$data": "dataX" } }, "capture": { "e1": "ETag" }, "expect": { "response": { "ETag": "${data.dataX.etag}" } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large/resumable-file.bin", "UploadId": "${cap.uid}", "PartNumber": 2, "Body": { "$data": "dataX" } }, "capture": { "e2": "ETag" } } }, { "$operation": { "name": "ListParts", "params": { "Bucket": "${res.b1.name}", "Key": "large/resumable-file.bin", "UploadId": "${cap.uid}" }, "expect": { "response": { "Parts": [ { "PartNumber": 1 }, { "PartNumber": 2 } ] } } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large/resumable-file.bin", "UploadId": "${cap.uid}", "PartNumber": 3, "Body": { "$data": "dataY" } }, "capture": { "e3": "ETag" } } }, { "$operation": { "name": "UploadPart", "params": { "Bucket": "${res.b1.name}", "Key": "large/resumable-file.bin", "UploadId": "${cap.uid}", "PartNumber": 4, "Body": { "$data": "dataY" } }, "capture": { "e4": "ETag" } } }, { "$operation": { "name": "CompleteMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "large/resumable-file.bin", "UploadId": "${cap.uid}", "MultipartUpload": { "Parts": [ { "PartNumber": 1, "ETag": "${cap.e1}" }, { "PartNumber": 2, "ETag": "${cap.e2}" }, { "PartNumber": 3, "ETag": "${cap.e3}" }, { "PartNumber": 4, "ETag": "${cap.e4}" } ] } } } }, { "$operation": { "name": "HeadObject", "params": { "Bucket": "${res.b1.name}", "Key": "large/resumable-file.bin" }, "expect": { "response": { "ContentLength": 20971520 } } } } ] }, { "id": "multipart-0166", "group": "multipart", "kind": "api", "title": "CreateMultipartUpload with a 1025-byte key returns KeyTooLongError", "description": "The source test accepts KeyTooLongError or InvalidArgument; KeyTooLongError is the AWS S3 error code.", "tags": [ "tier-1", "errors", "multipart", "source:msst-s3" ], "source": "https://github.com/linux-kdevops/msst-s3/blob/b84a323cca5ee862e87677043f672f156c46b448/tests/edge/test_create_multipart_special.py#L149", "prerequisites": [ { "$bucket": { "handle": "b1" } } ], "steps": [ { "$operation": { "name": "CreateMultipartUpload", "params": { "Bucket": "${res.b1.name}", "Key": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }, "expect": { "status": 400, "error": "KeyTooLongError" } } } ] } ] }