diff --git a/audbackend/core/backend/minio.py b/audbackend/core/backend/minio.py index 24a2f6f7..01a39ec6 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,13 @@ 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. + owner = "" + stats = self._client.stat_object(self.repository, path) + if "x-amz-meta-owner" in stats.metadata: + owner = stats.metadata["x-amz-meta-owner"] return owner def path( @@ -376,6 +382,7 @@ def _put_file( dst_path, src_path, content_type=content_type, + metadata=_metadata(), ) if verbose: # pragma: no cover @@ -398,3 +405,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"