From 64c9abb02c52f75f60269dea9817ee61c7f6fecf Mon Sep 17 00:00:00 2001 From: Hagen Wierstorf Date: Mon, 30 Sep 2024 15:35:51 +0200 Subject: [PATCH 1/2] Add support for owner() --- audbackend/core/backend/minio.py | 21 ++++++++++++++++++--- tests/conftest.py | 5 ----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/audbackend/core/backend/minio.py b/audbackend/core/backend/minio.py index 24a2f6f7..8c87376a 100644 --- a/audbackend/core/backend/minio.py +++ b/audbackend/core/backend/minio.py @@ -1,4 +1,5 @@ import configparser +import getpass import mimetypes import os import tempfile @@ -213,6 +214,7 @@ def _copy_file( self.repository, dst_path, minio.commonconfig.CopySource(self.repository, src_path), + metadata=_metadata(), ) def _create( @@ -330,9 +332,11 @@ def _owner( ) -> str: r"""Get owner of file on backend.""" path = self.path(path) - # TODO: owner seems to be empty, - # need to check if we have to manage this ourselves? - owner = self._client.stat_object(self.repository, path).owner_name + # NOTE: + # we use a custom metadata entry to track the owner + # as stats.owner_name is always empty. + stats = self._client.stat_object(self.repository, path) + owner = stats.metadata["x-amz-meta-owner"] return owner def path( @@ -376,6 +380,7 @@ def _put_file( dst_path, src_path, content_type=content_type, + metadata=_metadata(), ) if verbose: # pragma: no cover @@ -398,3 +403,13 @@ def _size( path = self.path(path) size = self._client.stat_object(self.repository, path).size return size + + +def _metadata(): + """Dictionary with owner entry. + + When uploaded as metadata to MinIO, + it can be accessed under ``stat_object(...).metadata["x-amz-meta-owner"]``. + + """ + return {"owner": getpass.getuser()} diff --git a/tests/conftest.py b/tests/conftest.py index 3395d5e2..9598f5c4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -77,11 +77,6 @@ def owner(request): ): host_wo_https = pytest.HOSTS["artifactory"][8:] owner = backend_cls.get_authentication(host_wo_https)[0] - elif ( - hasattr(audbackend.backend, "Minio") and backend_cls == audbackend.backend.Minio - ): - # There seems to be a MinIO bug here - owner = None else: if os.name == "nt": owner = "Administrators" From 616da64a9527dc9f9097d40499476f21770c6942 Mon Sep 17 00:00:00 2001 From: Hagen Wierstorf Date: Tue, 1 Oct 2024 16:41:05 +0200 Subject: [PATCH 2/2] Be more conservative regarding owner --- audbackend/core/backend/minio.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/audbackend/core/backend/minio.py b/audbackend/core/backend/minio.py index 8c87376a..01a39ec6 100644 --- a/audbackend/core/backend/minio.py +++ b/audbackend/core/backend/minio.py @@ -335,8 +335,10 @@ def _owner( # NOTE: # we use a custom metadata entry to track the owner # as stats.owner_name is always empty. + owner = "" stats = self._client.stat_object(self.repository, path) - owner = stats.metadata["x-amz-meta-owner"] + if "x-amz-meta-owner" in stats.metadata: + owner = stats.metadata["x-amz-meta-owner"] return owner def path(