Merge "Allow to specify storage policy when uploading objects"
This commit is contained in:
commit
f9ea672322
@ -45,6 +45,7 @@ from swiftclient import __version__ as client_version
|
|||||||
|
|
||||||
|
|
||||||
BASENAME = 'swift'
|
BASENAME = 'swift'
|
||||||
|
POLICY = 'X-Storage-Policy'
|
||||||
|
|
||||||
|
|
||||||
def get_conn(options):
|
def get_conn(options):
|
||||||
@ -1158,13 +1159,48 @@ def st_upload(parser, args, thread_manager):
|
|||||||
# fails, it might just be because the user doesn't have container PUT
|
# fails, it might just be because the user doesn't have container PUT
|
||||||
# permissions, so we'll ignore any error. If there's really a problem,
|
# permissions, so we'll ignore any error. If there's really a problem,
|
||||||
# it'll surface on the first object PUT.
|
# it'll surface on the first object PUT.
|
||||||
|
container_name = args[0]
|
||||||
try:
|
try:
|
||||||
conn.put_container(args[0])
|
policy_header = {}
|
||||||
|
_header = split_headers(options.header)
|
||||||
|
if POLICY in _header:
|
||||||
|
policy_header[POLICY] = \
|
||||||
|
_header[POLICY]
|
||||||
|
try:
|
||||||
|
conn.put_container(args[0], policy_header)
|
||||||
|
except ClientException as err:
|
||||||
|
if err.http_status != 409:
|
||||||
|
raise
|
||||||
|
if POLICY in _header:
|
||||||
|
thread_manager.error('Error trying to create %s with '
|
||||||
|
'Storage Policy %s', args[0],
|
||||||
|
_header[POLICY].strip())
|
||||||
if options.segment_size is not None:
|
if options.segment_size is not None:
|
||||||
seg_container = args[0] + '_segments'
|
container_name = seg_container = args[0] + '_segments'
|
||||||
if options.segment_container:
|
if options.segment_container:
|
||||||
seg_container = options.segment_container
|
container_name = seg_container = options.segment_container
|
||||||
conn.put_container(seg_container)
|
seg_headers = {}
|
||||||
|
if POLICY in _header:
|
||||||
|
seg_headers[POLICY] = \
|
||||||
|
_header[POLICY]
|
||||||
|
else:
|
||||||
|
# Since no storage policy was specified on the command line,
|
||||||
|
# rather than just letting swift pick the default storage
|
||||||
|
# policy, we'll try to create the segments container with the
|
||||||
|
# same as the upload container
|
||||||
|
_meta = conn.head_container(args[0])
|
||||||
|
if 'x-storage-policy' in _meta:
|
||||||
|
seg_headers[POLICY] = \
|
||||||
|
_meta.get('x-storage-policy')
|
||||||
|
try:
|
||||||
|
conn.put_container(seg_container, seg_headers)
|
||||||
|
except ClientException as err:
|
||||||
|
if err.http_status != 409:
|
||||||
|
raise
|
||||||
|
if POLICY in seg_headers:
|
||||||
|
thread_manager.error('Error trying to create %s with '
|
||||||
|
'Storage Policy %s', seg_container,
|
||||||
|
seg_headers[POLICY].strip())
|
||||||
except ClientException as err:
|
except ClientException as err:
|
||||||
msg = ' '.join(str(x) for x in (err.http_status, err.http_reason))
|
msg = ' '.join(str(x) for x in (err.http_status, err.http_reason))
|
||||||
if err.http_response_content:
|
if err.http_response_content:
|
||||||
@ -1172,11 +1208,11 @@ def st_upload(parser, args, thread_manager):
|
|||||||
msg += ': '
|
msg += ': '
|
||||||
msg += err.http_response_content[:60]
|
msg += err.http_response_content[:60]
|
||||||
thread_manager.error(
|
thread_manager.error(
|
||||||
'Error trying to create container %r: %s', args[0],
|
'Error trying to create container %r: %s', container_name,
|
||||||
msg)
|
msg)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
thread_manager.error(
|
thread_manager.error(
|
||||||
'Error trying to create container %r: %s', args[0],
|
'Error trying to create container %r: %s', container_name,
|
||||||
err)
|
err)
|
||||||
|
|
||||||
if options.object_name is not None:
|
if options.object_name is not None:
|
||||||
|
@ -209,14 +209,20 @@ class TestShell(unittest.TestCase):
|
|||||||
connection.return_value.head_object.return_value = {
|
connection.return_value.head_object.return_value = {
|
||||||
'content-length': '0'}
|
'content-length': '0'}
|
||||||
connection.return_value.attempts = 0
|
connection.return_value.attempts = 0
|
||||||
argv = ["", "upload", "container", self.tmpfile]
|
argv = ["", "upload", "container", self.tmpfile,
|
||||||
|
"-H", "X-Storage-Policy:one"]
|
||||||
swiftclient.shell.main(argv)
|
swiftclient.shell.main(argv)
|
||||||
|
connection.return_value.put_container.assert_called_with(
|
||||||
|
'container',
|
||||||
|
{'X-Storage-Policy': mock.ANY})
|
||||||
|
|
||||||
connection.return_value.put_object.assert_called_with(
|
connection.return_value.put_object.assert_called_with(
|
||||||
'container',
|
'container',
|
||||||
self.tmpfile.lstrip('/'),
|
self.tmpfile.lstrip('/'),
|
||||||
mock.ANY,
|
mock.ANY,
|
||||||
content_length=0,
|
content_length=0,
|
||||||
headers={'x-object-meta-mtime': mock.ANY})
|
headers={'x-object-meta-mtime': mock.ANY,
|
||||||
|
'X-Storage-Policy': 'one'})
|
||||||
|
|
||||||
# Upload whole directory
|
# Upload whole directory
|
||||||
argv = ["", "upload", "container", "/tmp"]
|
argv = ["", "upload", "container", "/tmp"]
|
||||||
@ -230,10 +236,15 @@ class TestShell(unittest.TestCase):
|
|||||||
headers={'x-object-meta-mtime': mock.ANY})
|
headers={'x-object-meta-mtime': mock.ANY})
|
||||||
|
|
||||||
# Upload in segments
|
# Upload in segments
|
||||||
|
connection.return_value.head_container.return_value = {
|
||||||
|
'x-storage-policy': 'one'}
|
||||||
argv = ["", "upload", "container", self.tmpfile, "-S", "10"]
|
argv = ["", "upload", "container", self.tmpfile, "-S", "10"]
|
||||||
with open(self.tmpfile, "wb") as fh:
|
with open(self.tmpfile, "wb") as fh:
|
||||||
fh.write(b'12345678901234567890')
|
fh.write(b'12345678901234567890')
|
||||||
swiftclient.shell.main(argv)
|
swiftclient.shell.main(argv)
|
||||||
|
connection.return_value.put_container.assert_called_with(
|
||||||
|
'container_segments',
|
||||||
|
{'X-Storage-Policy': mock.ANY})
|
||||||
connection.return_value.put_object.assert_called_with(
|
connection.return_value.put_object.assert_called_with(
|
||||||
'container',
|
'container',
|
||||||
self.tmpfile.lstrip('/'),
|
self.tmpfile.lstrip('/'),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user