72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
![]() |
import logging
|
||
|
|
||
|
from os.path import join, walk
|
||
|
from swiftclient.multithreading import OutputManager
|
||
|
from swiftclient.service import SwiftError, SwiftService, SwiftUploadObject
|
||
|
from sys import argv
|
||
|
|
||
|
logging.basicConfig(level=logging.ERROR)
|
||
|
logging.getLogger("requests").setLevel(logging.CRITICAL)
|
||
|
logging.getLogger("swiftclient").setLevel(logging.CRITICAL)
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
_opts = {'object_uu_threads': 20}
|
||
|
dir = argv[1]
|
||
|
container = argv[2]
|
||
|
with SwiftService(options=_opts) as swift, OutputManager() as out_manager:
|
||
|
try:
|
||
|
# Collect all the files and folders in the given directory
|
||
|
objs = []
|
||
|
dir_markers = []
|
||
|
for (_dir, _ds, _fs) in walk(dir):
|
||
|
if not (_ds + _fs):
|
||
|
dir_markers.append(_dir)
|
||
|
else:
|
||
|
objs.extend([join(_dir, _f) for _f in _fs])
|
||
|
|
||
|
# Now that we've collected all the required files and dir markers
|
||
|
# build the ``SwiftUploadObject``s for the call to upload
|
||
|
objs = [
|
||
|
SwiftUploadObject(
|
||
|
o, object_name=o.replace(
|
||
|
dir, 'my-%s-objects' % dir, 1
|
||
|
)
|
||
|
) for o in objs
|
||
|
]
|
||
|
dir_markers = [
|
||
|
SwiftUploadObject(
|
||
|
None, object_name=d.replace(
|
||
|
dir, 'my-%s-objects' % dir, 1
|
||
|
), options={'dir_marker': True}
|
||
|
) for d in dir_markers
|
||
|
]
|
||
|
|
||
|
# Schedule uploads on the SwiftService thread pool and iterate
|
||
|
# over the results
|
||
|
for r in swift.upload(container, objs + dir_markers):
|
||
|
if r['success']:
|
||
|
if 'object' in r:
|
||
|
print(r['object'])
|
||
|
elif 'for_object' in r:
|
||
|
print(
|
||
|
'%s segment %s' % (r['for_object'],
|
||
|
r['segment_index'])
|
||
|
)
|
||
|
else:
|
||
|
error = r['error']
|
||
|
if r['action'] == "create_container":
|
||
|
logger.warning(
|
||
|
'Warning: failed to create container '
|
||
|
"'%s'%s", container, error
|
||
|
)
|
||
|
elif r['action'] == "upload_object":
|
||
|
logger.error(
|
||
|
"Failed to upload object %s to container %s: %s" %
|
||
|
(container, r['object'], error)
|
||
|
)
|
||
|
else:
|
||
|
logger.error("%s" % error)
|
||
|
|
||
|
except SwiftError as e:
|
||
|
logger.error(e.value)
|