1
+ import logging
2
+ import boto3
3
+ from io import BytesIO
4
+ import botocore
5
+ from botocore .client import Config as BotocoreConfig
6
+
7
+ from spaceone .core .error import *
8
+ from spaceone .file_manager .connector .file_base_connector import FileBaseConnector
9
+
10
+ __all__ = ["MinIOS3Connector" ]
11
+ _LOGGER = logging .getLogger (__name__ )
12
+
13
+ class MinIOS3Connector (FileBaseConnector ):
14
+ def __init__ (self , * args , ** kwargs ):
15
+ super ().__init__ (* args , ** kwargs )
16
+
17
+ self .client = None
18
+ self .bucket_name = None
19
+ self ._create_session ()
20
+ self ._set_bucket ()
21
+
22
+ def _create_session (self ):
23
+ endpoint = self .config .get ("minio_endpoint" )
24
+ access_key_id = self .config .get ("minio_access_key_id" )
25
+ secret_access_key = self .config .get ("minio_secret_access_key" )
26
+ region_name = self .config .get ("region_name" )
27
+
28
+ if endpoint is None :
29
+ raise ERROR_CONNECTOR_CONFIGURATION (backend = "MinIOS3Connector" )
30
+
31
+ if region_name is None :
32
+ raise ERROR_CONNECTOR_CONFIGURATION (backend = "MinIOS3Connector" )
33
+
34
+
35
+ if access_key_id and secret_access_key :
36
+ self .client = boto3 .client (
37
+ "s3" ,
38
+ endpoint_url = endpoint ,
39
+ aws_access_key_id = access_key_id ,
40
+ aws_secret_access_key = secret_access_key ,
41
+ region_name = region_name ,
42
+ config = BotocoreConfig (signature_version = 's3v4' ),
43
+ )
44
+ else :
45
+ self .client = boto3 .client ("s3" , region_name = region_name )
46
+
47
+ def _set_bucket (self ):
48
+ bucket_name = self .config .get ("bucket_name" )
49
+
50
+ if bucket_name is None :
51
+ raise ERROR_CONNECTOR_CONFIGURATION (backend = "MinIOS3Connector" )
52
+
53
+ self .bucket_name = bucket_name
54
+
55
+ def get_upload_url (self , file_id , file_name ):
56
+ object_name = self ._generate_object_name (file_id , file_name )
57
+ response = self .client .generate_presigned_post (self .bucket_name , object_name )
58
+ return response ["url" ], response ["fields" ]
59
+
60
+ def get_download_url (self , file_id : str , file_name : str ) -> str :
61
+ object_name = self ._generate_object_name (file_id , file_name )
62
+ response = self .client .generate_presigned_url (
63
+ "get_object" , Params = {"Bucket" : self .bucket_name , "Key" : object_name }, ExpiresIn = 86400
64
+ )
65
+ return response
66
+
67
+ def check_file (self , file_id , file_name ):
68
+ object_name = self ._generate_object_name (file_id , file_name )
69
+ try :
70
+ self .client .get_object (Bucket = self .bucket_name , Key = object_name )
71
+ return True
72
+ except botocore .exceptions .ClientError as e :
73
+ _LOGGER .debug (f"[check_file] get_object error: { e } " )
74
+ return False
75
+
76
+ def delete_file (self , file_id , file_name ):
77
+ object_name = self ._generate_object_name (file_id , file_name )
78
+ self .client .delete_object (Bucket = self .bucket_name , Key = object_name )
79
+
80
+ @staticmethod
81
+ def _generate_object_name (file_id , file_name ):
82
+ return f"{ file_id } /{ file_name } "
83
+
84
+ def upload_file (self , remote_file_path :str , data : bytes ) -> None :
85
+ file_obj = BytesIO (data )
86
+ if self .client is None :
87
+ raise ERROR_CONNECTOR_CONFIGURATION (backend = "MinIOS3Connector" )
88
+ self .client .upload_fileobj (file_obj , self .bucket_name , remote_file_path )
89
+
90
+ def download_file (self , remote_file_path :str ) :
91
+
92
+ if self .client is None :
93
+ raise ERROR_CONNECTOR_CONFIGURATION (backend = "MinIOS3Connector" )
94
+
95
+ obj = self .client .get_object (Bucket = self .bucket_name , Key = remote_file_path )
96
+ return obj ["Body" ]
0 commit comments