From d8cf627b698b855a67d8b100137a9a905d266d86 Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Fri, 15 Jul 2022 18:55:51 +0300 Subject: [PATCH] Test case for locked and "marked-deleted" object version removal. Reproduces: https://tracker.ceph.com/issues/55766 Signed-off by: Igor Fedotov --- s3tests_boto3/functional/test_s3.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/s3tests_boto3/functional/test_s3.py b/s3tests_boto3/functional/test_s3.py index 8c92372..2398d06 100644 --- a/s3tests_boto3/functional/test_s3.py +++ b/s3tests_boto3/functional/test_s3.py @@ -13741,6 +13741,35 @@ def test_object_lock_delete_object_with_retention(): response = client.delete_object(Bucket=bucket_name, Key=key, VersionId=response['VersionId'], BypassGovernanceRetention=True) eq(response['ResponseMetadata']['HTTPStatusCode'], 204) +@attr(resource='bucket') +@attr(method='delete') +@attr(operation='Test delete object with retention and delete marker') +@attr(assertion='retention period make effects') +@attr('object-lock') +@attr('fails_on_dbstore') +def test_object_lock_delete_object_with_retention_and_marker(): + bucket_name = get_new_bucket_name() + client = get_client() + client.create_bucket(Bucket=bucket_name, ObjectLockEnabledForBucket=True) + key = 'file1' + + response = client.put_object(Bucket=bucket_name, Body='abc', Key=key) + retention = {'Mode':'GOVERNANCE', 'RetainUntilDate':datetime.datetime(2030,1,1,tzinfo=pytz.UTC)} + client.put_object_retention(Bucket=bucket_name, Key=key, Retention=retention) + del_response = client.delete_object(Bucket=bucket_name, Key=key) + e = assert_raises(ClientError, client.delete_object, Bucket=bucket_name, Key=key, VersionId=response['VersionId']) + status, error_code = _get_status_and_error_code(e.response) + eq(status, 403) + eq(error_code, 'AccessDenied') + + client.delete_object(Bucket=bucket_name, Key=key, VersionId=del_response['VersionId']) + e = assert_raises(ClientError, client.delete_object, Bucket=bucket_name, Key=key, VersionId=response['VersionId']) + status, error_code = _get_status_and_error_code(e.response) + eq(status, 403) + eq(error_code, 'AccessDenied') + + response = client.delete_object(Bucket=bucket_name, Key=key, VersionId=response['VersionId'], BypassGovernanceRetention=True) + eq(response['ResponseMetadata']['HTTPStatusCode'], 204) @attr(resource='object') @attr(method='delete')