From f46457f010793bb60726388eb6e7117117f112b4 Mon Sep 17 00:00:00 2001 From: Benjamin Simon Date: Thu, 31 Oct 2024 13:30:58 +0100 Subject: [PATCH] fix enabling versioning with a locked bucket --- localstack-core/localstack/services/s3/provider.py | 8 ++++---- tests/aws/services/s3/test_s3_api.py | 12 ++++++++++-- tests/aws/services/s3/test_s3_api.snapshot.json | 8 +++++++- tests/aws/services/s3/test_s3_api.validation.json | 2 +- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/localstack-core/localstack/services/s3/provider.py b/localstack-core/localstack/services/s3/provider.py index 6b2cd28b796b5..367dcfd042bf8 100644 --- a/localstack-core/localstack/services/s3/provider.py +++ b/localstack-core/localstack/services/s3/provider.py @@ -2680,14 +2680,14 @@ def put_bucket_versioning( message="The Versioning element must be specified", ) - if s3_bucket.object_lock_enabled: + if versioning_status not in ("Enabled", "Suspended"): + raise MalformedXML() + + if s3_bucket.object_lock_enabled and versioning_status == "Suspended": raise InvalidBucketState( "An Object Lock configuration is present on this bucket, so the versioning state cannot be changed." ) - if versioning_status not in ("Enabled", "Suspended"): - raise MalformedXML() - if not s3_bucket.versioning_status: s3_bucket.objects = VersionedKeyStore.from_key_store(s3_bucket.objects) diff --git a/tests/aws/services/s3/test_s3_api.py b/tests/aws/services/s3/test_s3_api.py index 1436427151506..ae9a51fdcc029 100644 --- a/tests/aws/services/s3/test_s3_api.py +++ b/tests/aws/services/s3/test_s3_api.py @@ -1572,16 +1572,24 @@ def test_get_object_lock_configuration_exc(self, s3_bucket, aws_client, snapshot reason="Moto implementation does not raise exceptions", ) def test_disable_versioning_on_locked_bucket(self, s3_create_bucket, aws_client, snapshot): - s3_bucket = s3_create_bucket(ObjectLockEnabledForBucket=True) + bucket_name = s3_create_bucket(ObjectLockEnabledForBucket=True) with pytest.raises(ClientError) as e: aws_client.s3.put_bucket_versioning( - Bucket=s3_bucket, + Bucket=bucket_name, VersioningConfiguration={ "Status": "Suspended", }, ) snapshot.match("disable-versioning-on-locked-bucket", e.value.response) + put_bucket_versioning_again = aws_client.s3.put_bucket_versioning( + Bucket=bucket_name, + VersioningConfiguration={ + "Status": "Enabled", + }, + ) + snapshot.match("enable-versioning-again-on-locked-bucket", put_bucket_versioning_again) + @markers.aws.validated def test_delete_object_with_no_locking(self, s3_bucket, aws_client, snapshot): key = "test-delete-no-lock" diff --git a/tests/aws/services/s3/test_s3_api.snapshot.json b/tests/aws/services/s3/test_s3_api.snapshot.json index a57cd8d61cfd2..f46efc33e6944 100644 --- a/tests/aws/services/s3/test_s3_api.snapshot.json +++ b/tests/aws/services/s3/test_s3_api.snapshot.json @@ -2407,7 +2407,7 @@ } }, "tests/aws/services/s3/test_s3_api.py::TestS3ObjectLock::test_disable_versioning_on_locked_bucket": { - "recorded-date": "09-08-2023, 03:49:49", + "recorded-date": "31-10-2024, 12:29:03", "recorded-content": { "disable-versioning-on-locked-bucket": { "Error": { @@ -2418,6 +2418,12 @@ "HTTPHeaders": {}, "HTTPStatusCode": 409 } + }, + "enable-versioning-again-on-locked-bucket": { + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } } } }, diff --git a/tests/aws/services/s3/test_s3_api.validation.json b/tests/aws/services/s3/test_s3_api.validation.json index 88df84dc525ae..065b5a046f397 100644 --- a/tests/aws/services/s3/test_s3_api.validation.json +++ b/tests/aws/services/s3/test_s3_api.validation.json @@ -105,7 +105,7 @@ "last_validated_date": "2023-09-08T16:29:03+00:00" }, "tests/aws/services/s3/test_s3_api.py::TestS3ObjectLock::test_disable_versioning_on_locked_bucket": { - "last_validated_date": "2023-08-09T01:49:49+00:00" + "last_validated_date": "2024-10-31T12:29:03+00:00" }, "tests/aws/services/s3/test_s3_api.py::TestS3ObjectLock::test_get_object_lock_configuration_exc": { "last_validated_date": "2023-08-08T23:41:42+00:00"