diff options
author | Tim Burke <tim.burke@gmail.com> | 2017-07-06 12:43:11 -0700 |
---|---|---|
committer | Tim Burke <tim.burke@gmail.com> | 2017-07-06 12:43:11 -0700 |
commit | 484d7ee9b21396d066604e8e876ffb3d6ed6d359 (patch) | |
tree | 0d495235245cc7e05f3ba6bd54218fc7fa1d5438 | |
parent | 1d57403668815ab8cef9d6598c06bf1c7e5355c0 (diff) | |
download | python-swiftclient-484d7ee9b21396d066604e8e876ffb3d6ed6d359.tar.gz |
Allow --meta on upload
Previously, the --meta option was only allowed on post or copy subcommands.
Change-Id: I87bf0338c34b5e89aa946505bee68dbeb37d784c
Closes-Bug: #1616238
-rw-r--r-- | swiftclient/service.py | 2 | ||||
-rwxr-xr-x | swiftclient/shell.py | 11 | ||||
-rw-r--r-- | tests/unit/test_service.py | 35 | ||||
-rw-r--r-- | tests/unit/test_shell.py | 6 |
4 files changed, 24 insertions, 30 deletions
diff --git a/swiftclient/service.py b/swiftclient/service.py index b9b843e..8301ae9 100644 --- a/swiftclient/service.py +++ b/swiftclient/service.py @@ -1912,6 +1912,8 @@ class SwiftService(object): return res # Merge the command line header options to the put_headers + put_headers.update(split_headers( + options['meta'], 'X-Object-Meta-')) put_headers.update(split_headers(options['header'], '')) # Don't do segment job if object is not big enough, and never do diff --git a/swiftclient/shell.py b/swiftclient/shell.py index 841ed6e..58b9f54 100755 --- a/swiftclient/shell.py +++ b/swiftclient/shell.py @@ -881,8 +881,8 @@ def st_copy(parser, args, output_manager): st_upload_options = '''[--changed] [--skip-identical] [--segment-size <size>] [--segment-container <container>] [--leave-segments] [--object-threads <thread>] [--segment-threads <threads>] - [--header <header>] [--use-slo] [--ignore-checksum] - [--object-name <object-name>] + [--meta <name:value>] [--header <header>] [--use-slo] + [--ignore-checksum] [--object-name <object-name>] <container> <file_or_directory> [<file_or_directory>] [...] ''' @@ -916,6 +916,9 @@ Optional arguments: --segment-threads <threads> Number of threads to use for uploading object segments. Default is 10. + -m, --meta <name:value> + Sets a meta data item. This option may be repeated. + Example: -m Color:Blue -m Size:Large -H, --header <header:value> Adds a customized request header. This option may be repeated. Example: -H "content-type:text/plain" @@ -967,6 +970,10 @@ def st_upload(parser, args, output_manager): help='Number of threads to use for uploading object segments. ' 'Its value must be a positive integer. Default is 10.') parser.add_argument( + '-m', '--meta', action='append', dest='meta', default=[], + help='Sets a meta data item. This option may be repeated. ' + 'Example: -m Color:Blue -m Size:Large') + parser.add_argument( '-H', '--header', action='append', dest='header', default=[], help='Set request headers with the syntax header:value. ' ' This option may be repeated. Example: -H "content-type:text/plain" ' diff --git a/tests/unit/test_service.py b/tests/unit/test_service.py index b759e6b..2a477fe 100644 --- a/tests/unit/test_service.py +++ b/tests/unit/test_service.py @@ -1146,14 +1146,9 @@ class TestServiceUpload(_TestServiceBase): container='test_c', source=f.name, obj='ใในใ/dummy.dat', - options={'changed': False, - 'skip_identical': False, - 'leave_segments': True, - 'header': '', - 'segment_size': 10, - 'segment_container': None, - 'use_slo': False, - 'checksum': True}) + options=dict(s._options, + segment_size=10, + leave_segments=True)) mtime = r['headers']['x-object-meta-mtime'] self.assertEqual(expected_mtime, mtime) @@ -1350,12 +1345,8 @@ class TestServiceUpload(_TestServiceBase): container='test_c', source=f.name, obj='test_o', - options={'changed': False, - 'skip_identical': False, - 'leave_segments': True, - 'header': '', - 'segment_size': 0, - 'checksum': True}) + options=dict(s._options, + leave_segments=True)) mtime = r['headers']['x-object-meta-mtime'] self.assertEqual(expected_mtime, mtime) @@ -1405,12 +1396,8 @@ class TestServiceUpload(_TestServiceBase): container='test_c', source=f, obj='test_o', - options={'changed': False, - 'skip_identical': False, - 'leave_segments': True, - 'header': '', - 'segment_size': 0, - 'checksum': True}) + options=dict(s._options, + leave_segments=True)) mtime = float(r['headers']['x-object-meta-mtime']) self.assertEqual(mtime, expected_mtime) @@ -1452,12 +1439,8 @@ class TestServiceUpload(_TestServiceBase): container='test_c', source=f.name, obj='test_o', - options={'changed': False, - 'skip_identical': False, - 'leave_segments': True, - 'header': '', - 'segment_size': 0, - 'checksum': True}) + options=dict(s._options, + leave_segments=True)) self.assertIs(r['success'], False) self.assertIn('md5 mismatch', str(r.get('error'))) diff --git a/tests/unit/test_shell.py b/tests/unit/test_shell.py index db96df7..3f87c6d 100644 --- a/tests/unit/test_shell.py +++ b/tests/unit/test_shell.py @@ -623,7 +623,8 @@ class TestShell(unittest.TestCase): connection.return_value.put_object.return_value = EMPTY_ETAG connection.return_value.attempts = 0 argv = ["", "upload", "container", self.tmpfile, - "-H", "X-Storage-Policy:one"] + "-H", "X-Storage-Policy:one", + "--meta", "Color:Blue"] swiftclient.shell.main(argv) connection.return_value.put_container.assert_called_once_with( 'container', @@ -636,7 +637,8 @@ class TestShell(unittest.TestCase): mock.ANY, content_length=0, headers={'x-object-meta-mtime': mock.ANY, - 'X-Storage-Policy': 'one'}, + 'X-Storage-Policy': 'one', + 'X-Object-Meta-Color': 'Blue'}, response_dict={}) # upload to pseudo-folder (via <container> param) |