You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
# Copyright (C) 2022 CVAT.ai Corporation
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
from io import BytesIO
|
|
|
|
import boto3
|
|
from botocore.exceptions import ClientError
|
|
|
|
from shared.utils.config import MINIO_ENDPOINT_URL, MINIO_KEY, MINIO_SECRET_KEY
|
|
|
|
|
|
class S3Client:
|
|
def __init__(self, endpoint_url: str, *, access_key: str, secret_key: str) -> None:
|
|
self.client = self._make_boto_client(
|
|
endpoint_url=endpoint_url, access_key=access_key, secret_key=secret_key
|
|
)
|
|
|
|
@staticmethod
|
|
def _make_boto_client(endpoint_url: str, *, access_key: str, secret_key: str):
|
|
s3 = boto3.resource(
|
|
"s3",
|
|
aws_access_key_id=access_key,
|
|
aws_secret_access_key=secret_key,
|
|
endpoint_url=endpoint_url,
|
|
)
|
|
return s3.meta.client
|
|
|
|
def create_file(self, bucket: str, filename: str, data: bytes = b""):
|
|
self.client.put_object(Body=data, Bucket=bucket, Key=filename)
|
|
|
|
def remove_file(self, bucket: str, filename: str):
|
|
self.client.delete_object(Bucket=bucket, Key=filename)
|
|
|
|
def file_exists(self, bucket: str, filename: str) -> bool:
|
|
try:
|
|
self.client.head_object(Bucket=bucket, Key=filename)
|
|
return True
|
|
except ClientError as e:
|
|
if e.response["Error"]["Code"] == "404":
|
|
return False
|
|
else:
|
|
raise
|
|
|
|
def download_fileobj(self, bucket: str, key: str) -> bytes:
|
|
with BytesIO() as data:
|
|
self.client.download_fileobj(Bucket=bucket, Key=key, Fileobj=data)
|
|
return data.getvalue()
|
|
|
|
|
|
def make_client() -> S3Client:
|
|
return S3Client(
|
|
endpoint_url=MINIO_ENDPOINT_URL, access_key=MINIO_KEY, secret_key=MINIO_SECRET_KEY
|
|
)
|