From d1d3e2e71231d45b5ff880c3153a035fd05bd7ed Mon Sep 17 00:00:00 2001 From: Anis Eleuch Date: Thu, 9 Jan 2025 17:12:12 +0100 Subject: [PATCH] Fix ExcludedPrefixes in set/get bucket versioning config Fix parsing of ExlucdedPrefix in set/get bucket versioning API. ExcludedPrefixes includes Prefix tag and not ExcludedPrefix as stated in the S3 spec. --- minio/versioningconfig.py | 6 ++--- tests/functional/tests.py | 49 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/minio/versioningconfig.py b/minio/versioningconfig.py index 13613595e..362407493 100644 --- a/minio/versioningconfig.py +++ b/minio/versioningconfig.py @@ -75,10 +75,10 @@ def fromxml(cls: Type[A], element: ET.Element) -> A: status = findtext(element, "Status") mfa_delete = findtext(element, "MFADelete") excluded_prefixes = [ - prefix.text + findtext(prefix, "Prefix") for prefix in findall( element, - "ExcludedPrefixes/ExcludedPrefix", + "ExcludedPrefixes", ) ] exclude_folders = findtext(element, "ExcludeFolders") == "true" @@ -99,7 +99,7 @@ def toxml(self, element: ET.Element | None) -> ET.Element: for prefix in self._excluded_prefixes or []: SubElement( SubElement(element, "ExcludedPrefixes"), - "ExcludedPrefix", + "Prefix", prefix, ) if self._exclude_folders: diff --git a/tests/functional/tests.py b/tests/functional/tests.py index 324478fde..6323591c7 100644 --- a/tests/functional/tests.py +++ b/tests/functional/tests.py @@ -49,7 +49,7 @@ SelectRequest) from minio.sse import SseCustomerKey from minio.time import to_http_header -from minio.versioningconfig import VersioningConfig +from minio.versioningconfig import VersioningConfig, SUSPENDED _CLIENT = None # initialized in main(). _TEST_FILE = None # initialized in main(). @@ -1934,6 +1934,52 @@ def test_upload_snowball_objects_with_staging( # pylint: disable=invalid-name staging_filename = f"{uuid4()}.tar" _test_upload_snowball_objects(log_entry, staging_filename) +def test_set_get_bucket_versioning(log_entry): + """Test set/get bucket_versining""" + + # Get a unique bucket_name and object_name + bucket_name = _gen_bucket_name() + + log_entry["args"] = { + "bucket_name": bucket_name, + } + + excl_prefixes = ['prefix1', 'prefix2'] + + _CLIENT.make_bucket(bucket_name) + + try: + # Test all fields of versioning configuration + _CLIENT.set_bucket_versioning( + bucket_name, + VersioningConfig(status=ENABLED, exclude_folders=True, excluded_prefixes=excl_prefixes), + ) + + vcfg = _CLIENT.get_bucket_versioning(bucket_name) + if vcfg.status != ENABLED: + raise ValueError('get_bucket_versioning(1) api returned unexpected status') + if vcfg.exclude_folders != True: + raise ValueError('get_bucket_versioning(1) api returned unexpected excluded_folders bool') + if set(vcfg.excluded_prefixes) != set(excl_prefixes): + raise ValueError('get_bucket_versioning(1) api returned unexpected excluded_prefixes list') + + # Disable all fields of versioning configuration + _CLIENT.set_bucket_versioning( + bucket_name, + VersioningConfig(status=SUSPENDED), + ) + + vcfg = _CLIENT.get_bucket_versioning(bucket_name) + if vcfg.status != SUSPENDED: + raise ValueError('get_bucket_versioning(2) api returned unexpected status') + if vcfg.exclude_folders != False: + raise ValueError('get_bucket_versioning(2) api returned unexpected excluded_folders') + if len(vcfg.excluded_prefixes) != 0: + raise ValueError('get_bucket_versioning(2) api returned unexpected excluded_prefixes list') + + finally: + _CLIENT.remove_bucket(bucket_name) + def main(): """ @@ -2026,6 +2072,7 @@ def main(): test_presigned_put_object_expiry: None, test_presigned_post_policy: None, test_thread_safe: None, + test_set_get_bucket_versioning: None, test_get_bucket_policy: None, test_set_bucket_policy_readonly: None, test_set_bucket_policy_readwrite: None,