initial commit
This commit is contained in:
commit
7761debc5b
|
|
@ -0,0 +1,23 @@
|
||||||
|
venv/
|
||||||
|
test-venv/
|
||||||
|
|
||||||
|
*.pyc
|
||||||
|
__pycache__/
|
||||||
|
|
||||||
|
instance/
|
||||||
|
|
||||||
|
.pytest_cache/
|
||||||
|
.coverage
|
||||||
|
htmlcov/
|
||||||
|
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
*.egg-info/
|
||||||
|
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
.envs
|
||||||
|
session_files/
|
||||||
|
mongo_data/
|
||||||
|
test_data/
|
||||||
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
"""
|
||||||
|
lib_afc_s3storage
|
||||||
|
---------------------------------------------
|
||||||
|
A Python library for managing S3 object storage
|
||||||
|
"""
|
||||||
|
|
||||||
|
from lib_afc_s3storage.s3storage import S3Storage
|
||||||
|
from lib_afc_s3storage.afs3exception import AFS3Error
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
"""
|
||||||
|
AF S3 Custom exceptions
|
||||||
|
"""
|
||||||
|
|
||||||
|
class AFS3Error(Exception):
|
||||||
|
"""AFS3Error class. Custom Exception object."""
|
||||||
|
|
@ -0,0 +1,147 @@
|
||||||
|
"""
|
||||||
|
S3Storage Class object
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import boto3
|
||||||
|
|
||||||
|
from lib_afc_s3storage.afs3exception import AFS3Error
|
||||||
|
|
||||||
|
|
||||||
|
class S3Storage:
|
||||||
|
"""
|
||||||
|
S3Storage class
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__( self, access_key=None, secret_access_key=None, data_center="us-lax-1" ):
|
||||||
|
"""
|
||||||
|
__init__ Init S3 Storage class.
|
||||||
|
|
||||||
|
:param access_key: S3 Bucket access key
|
||||||
|
:param secret_access_key: S3 Bucket secret key
|
||||||
|
:param data_center: S3 Bucket data center. Default us-lax-1
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.access_key = access_key
|
||||||
|
self.secret_access_key = secret_access_key
|
||||||
|
self.data_center = data_center
|
||||||
|
|
||||||
|
self.client = None
|
||||||
|
|
||||||
|
if self.access_key is not None and self.secret_access_key is not None:
|
||||||
|
self.connect()
|
||||||
|
|
||||||
|
|
||||||
|
def connect( self ):
|
||||||
|
"""
|
||||||
|
connect
|
||||||
|
"""
|
||||||
|
|
||||||
|
# generate an error if keys are empty
|
||||||
|
|
||||||
|
linode_obj_config = {
|
||||||
|
"aws_access_key_id": self.access_key,
|
||||||
|
"aws_secret_access_key": self.secret_access_key,
|
||||||
|
"endpoint_url": f"https://{self.data_center}.linodeobjects.com",
|
||||||
|
}
|
||||||
|
self.client = boto3.client("s3", **linode_obj_config)
|
||||||
|
|
||||||
|
|
||||||
|
def connect_data_center( self, data_center ):
|
||||||
|
"""
|
||||||
|
connect_data_center
|
||||||
|
"""
|
||||||
|
|
||||||
|
# "us-southeast-1" = Atlanta, GA
|
||||||
|
# "us-ord-1" = Chicago, IL
|
||||||
|
# "us-lax-1" = Los Angeles, CA
|
||||||
|
# "us-mia-1" = Miami, FL
|
||||||
|
# "us-east-1" = Newark, NJ
|
||||||
|
# "us-sea-1" = Seattle, WA
|
||||||
|
# "us-iad-1" = Washington, DC
|
||||||
|
|
||||||
|
self.data_center = data_center
|
||||||
|
if self.access_key is not None and self.secret_access_key is not None:
|
||||||
|
self.connect()
|
||||||
|
|
||||||
|
|
||||||
|
def list_buckets( self ):
|
||||||
|
"""
|
||||||
|
list_buckets
|
||||||
|
"""
|
||||||
|
|
||||||
|
if self.client is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
r = self.client.list_buckets()
|
||||||
|
logging.debug("response keys = %s", str(r.keys()))
|
||||||
|
|
||||||
|
return r['Buckets']
|
||||||
|
|
||||||
|
|
||||||
|
def list_objects( self, bucket=None ):
|
||||||
|
"""
|
||||||
|
list_objects
|
||||||
|
"""
|
||||||
|
|
||||||
|
if self.client is None or bucket is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
r = self.client.list_objects(Bucket=bucket)
|
||||||
|
|
||||||
|
return r['Contents']
|
||||||
|
|
||||||
|
|
||||||
|
def upload_file( self, filepathname=None, bucket=None, key=None ):
|
||||||
|
"""
|
||||||
|
upload_file
|
||||||
|
"""
|
||||||
|
|
||||||
|
if filepathname is None:
|
||||||
|
raise AFS3Error("S3Storage.upload_file(): missing required filepathname")
|
||||||
|
elif not os.path.exists(filepathname):
|
||||||
|
raise AFS3Error("S3Storage.upload_file(): invalid filepathname '%s'", filepathname)
|
||||||
|
|
||||||
|
if bucket is None:
|
||||||
|
raise AFS3Error("S3Storage.upload_file(): missing required bucket name")
|
||||||
|
|
||||||
|
if key is None:
|
||||||
|
raise AFS3Error("S3Storage.upload_file(): missing required key name")
|
||||||
|
|
||||||
|
self.client.upload_file(Filename=filepathname,
|
||||||
|
Bucket=bucket,
|
||||||
|
Key=key,
|
||||||
|
ExtraArgs={'ACL': 'public-read'})
|
||||||
|
|
||||||
|
|
||||||
|
def upload_folder( self ):
|
||||||
|
"""
|
||||||
|
upload_folder
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def get_object( self, bucket=None, filename=None ):
|
||||||
|
"""
|
||||||
|
get_object
|
||||||
|
"""
|
||||||
|
|
||||||
|
if bucket is None:
|
||||||
|
raise AFS3Error("S3Storage.get_object(): missing required bucket name")
|
||||||
|
|
||||||
|
if filename is None:
|
||||||
|
raise AFS3Error("S3Storage.get_object(): missing required filename")
|
||||||
|
|
||||||
|
this_object = self.client.get_object(Bucket=bucket, Key=filename)
|
||||||
|
|
||||||
|
return this_object['Body']
|
||||||
|
|
||||||
|
|
||||||
|
def delete_objects( self ):
|
||||||
|
"""
|
||||||
|
delete_objects
|
||||||
|
"""
|
||||||
|
|
||||||
|
return
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
[metadata]
|
||||||
|
name = lib_afc_s3storage
|
||||||
|
version = 0.1.0
|
||||||
|
author = ''
|
||||||
|
author_email = ''
|
||||||
|
description = ''
|
||||||
|
long_description = file: README.md
|
||||||
|
|
||||||
|
[options]
|
||||||
|
zip_safe = False
|
||||||
|
include_package_data = False
|
||||||
|
packages = find:
|
||||||
|
python_requires = >=3.7
|
||||||
|
install_requires =
|
||||||
|
boto3==1.33.6
|
||||||
Loading…
Reference in New Issue