]> git.apps.os.sepia.ceph.com Git - s3-tests.git/commitdiff
multipart fallback to create-multipart checksum algorithm
authorMatt Benjamin <mbenjamin@redhat.com>
Sun, 13 Oct 2024 14:47:17 +0000 (10:47 -0400)
committerMatt Benjamin <mbenjamin@redhat.com>
Tue, 7 Jan 2025 20:23:41 +0000 (15:23 -0500)
there seem to be workloads which assume checksum algorithm can be
omitted from upload-part

Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
s3tests_boto3/functional/test_s3.py

index e33fcc002dae67723f56a97fba8cf5470a233298..1bb81a10e12b341ef3e31a5cb34b592dc1436010 100644 (file)
@@ -13964,6 +13964,47 @@ def test_multipart_checksum_3parts():
     response = client.head_object(Bucket=bucket, Key=key, ChecksumMode='ENABLED')
     assert composite_sha256sum == response['ChecksumSHA256']
 
+@pytest.mark.checksum
+@pytest.mark.fails_on_dbstore
+def test_multipart_checksum_upload_fallback():
+    bucket = get_new_bucket()
+    client = get_client()
+
+    key = "mpu_cksum_fallback"
+    alg = 'SHA256'
+
+    response = client.create_multipart_upload(
+        Bucket=bucket, Key=key, ChecksumAlgorithm=alg)
+    assert alg == response['ChecksumAlgorithm']
+    upload_id = response['UploadId']
+
+    nparts = 3
+    parts = []
+    size = 5 * 1024 * 1024 # each part but the last must be at least 5M
+
+    for ix in range(0,nparts):
+        body = FakeWriteFile(size, 'A')
+        part_num = ix + 1
+        res = client.upload_part(UploadId=upload_id, Bucket=bucket,
+                                 Key=key, PartNumber=part_num, Body=body)
+        etag = res['ETag']
+        part = {'ETag': etag, 'PartNumber': part_num}
+        parts.append(part)
+
+    res = client.complete_multipart_upload(
+        Bucket=bucket, Key=key, UploadId=upload_id,
+        MultipartUpload={'Parts': parts})
+
+    #pdb.set_trace()
+    assert res['ResponseMetadata']['HTTPStatusCode'] == 200
+
+    # not yet merged
+    #request_attributes = ['ETag', 'Checksum', 'ObjectParts', 'StorageClass',
+    #                      'ObjectSize']
+    #res = client.get_object_attributes(Bucket=bucket, Key=key, \
+    #                                   ObjectAttributes=request_attributes)
+    #upload_checksum = res['Checksum']['ChecksumSHA256']
+
 @pytest.mark.checksum
 def test_post_object_upload_checksum():
     megabytes = 1024 * 1024