summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2016-08-06 00:10:32 +0000
committerGerrit Code Review <review@openstack.org>2016-08-06 00:10:32 +0000
commit92178ac17c9549fcf88d39c50ecadfd2979b9c44 (patch)
treecc9a5c5af59a35c0e89706f4a82d1502637dee40
parentd460db84edb11cd57ed12b092a21224e870a4228 (diff)
parent335570e511e5c3a748969d921714a8b9e287e1ac (diff)
downloadpython-swiftclient-92178ac17c9549fcf88d39c50ecadfd2979b9c44.tar.gz
Merge "Add --json option to `swift capabilities` / `swift info`"
-rw-r--r--doc/manpages/swift.134
-rwxr-xr-xswiftclient/shell.py25
-rw-r--r--tests/unit/test_shell.py16
3 files changed, 55 insertions, 20 deletions
diff --git a/doc/manpages/swift.1 b/doc/manpages/swift.1
index beefb81..efcb8e4 100644
--- a/doc/manpages/swift.1
+++ b/doc/manpages/swift.1
@@ -61,8 +61,8 @@ of container or objects being listed. With the \-t or \-\-total option they only
.RS 4
Uploads to the given container the files and directories specified by the
remaining args. The \-c or \-\-changed is an option that will only upload files
-that have changed since the last upload. The \-\-object-name <object\-name> is
-an option that will upload file and name object to <object-name> or upload dir
+that have changed since the last upload. The \-\-object\-name <object\-name> is
+an option that will upload file and name object to <object\-name> or upload dir
and use <object\-name> as object prefix. The \-S <size> or \-\-segment\-size <size>
and \-\-leave\-segments and others are options as well (see swift upload \-\-help for more).
.RE
@@ -86,7 +86,7 @@ container, or a list of objects depending on the args given. For a single
object download, you may use the \-o [\-\-output] <filename> option to
redirect the output to a specific file or if "-" then just redirect to stdout or
with \-\-no-download actually not to write anything to disk.
-The \-\-ignore-checksum is an option that turn off checksum validation.
+The \-\-ignore-checksum is an option that turns off checksum validation.
You can specify optional headers with the repeatable cURL-like option
\-H [\-\-header]. For more details and options see swift download \-\-help.
.RE
@@ -100,23 +100,31 @@ will be deleted as well, unless you specify the \-\-leave\-segments option.
For more details and options see swift delete \-\-help.
.RE
-\fBcapabilities\fR [\fIproxy-url\fR]
+\fBcapabilities\fR [\fIcommand-options\fR] [\fIproxy-url\fR]
.RS 4
-Displays cluster capabilities. The output includes the list of the activated
-Swift middlewares as well as relevant options for each one. Additionally the
-command displays relevant options for the Swift core. If the proxy-url option
-is not provided the storage-url retrieved after authentication is used as
-proxy-url.
+Displays cluster capabilities. If the proxy-url option is not provided the
+storage-url retrieved after authentication is used as proxy-url.
+
+By default, the output includes the list of the activated Swift middlewares as
+well as relevant options for each one. Additionally the command displays
+relevant options for the Swift core.
+
+The \-\-json option will print a json representation of the cluster
+capabilities. This is typically more suitable for consumption by other
+programs, such as jq.
+
+\fBExample\fR: capabilities https://swift.example.com
+ capabilities \-\-json
.RE
\fBtempurl\fR [\fIcommand-option\fR] \fImethod\fR \fIseconds\fR \fIpath\fR \fIkey\fR
.RS 4
Generates a temporary URL allowing unauthenticated access to the Swift object
at the given path, using the given HTTP method, for the given number of
-seconds, using the given TempURL key. If optional --absolute argument is
+seconds, using the given TempURL key. If optional \-\-absolute argument is
provided, seconds is instead interpreted as a Unix timestamp at which the URL
-should expire. \fBExample\fR: tempurl GET $(date -d "Jan 1 2016" +%s)
-/v1/AUTH_foo/bar_container/quux.md my_secret_tempurl_key --absolute
+should expire. \fBExample\fR: tempurl GET $(date \-d "Jan 1 2016" +%s)
+/v1/AUTH_foo/bar_container/quux.md my_secret_tempurl_key \-\-absolute
.RE
\fBauth\fR
@@ -140,7 +148,7 @@ For examples see swift auth \-\-help.
.IP "--os-help Show all OpenStack authentication options"
.PD
.RS 4
-For more options see swift \-\-help and swift \-\-os-help.
+For more options see swift \-\-help and swift \-\-os\-help.
.RE
diff --git a/swiftclient/shell.py b/swiftclient/shell.py
index ef165d8..cc34b7f 100755
--- a/swiftclient/shell.py
+++ b/swiftclient/shell.py
@@ -17,6 +17,7 @@
from __future__ import print_function, unicode_literals
import argparse
+import json
import logging
import signal
import socket
@@ -248,7 +249,7 @@ Optional arguments:
-H, --header <header:value>
Adds a customized request header to the query, like
"Range" or "If-Match". This option may be repeated.
- Example --header "content-type:text/plain"
+ Example: --header "content-type:text/plain"
--skip-identical Skip downloading files that are identical on both
sides.
--ignore-checksum Turn off checksum validation for downloads.
@@ -789,7 +790,7 @@ Optional arguments:
Default is 10.
-H, --header <header:value>
Adds a customized request header. This option may be
- repeated. Example -H "content-type:text/plain"
+ repeated. Example: -H "content-type:text/plain"
-H "Content-Length: 4000".
--use-slo When used in conjunction with --segment-size it will
create a Static Large Object instead of the default
@@ -840,7 +841,7 @@ def st_upload(parser, args, output_manager):
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" '
+ ' This option may be repeated. Example: -H "content-type:text/plain" '
'-H "Content-Length: 4000"')
parser.add_argument(
'--use-slo', action='store_true', default=False,
@@ -995,13 +996,16 @@ def st_upload(parser, args, output_manager):
output_manager.error(e.value)
-st_capabilities_options = "[<proxy_url>]"
+st_capabilities_options = "[--json] [<proxy_url>]"
st_info_options = st_capabilities_options
st_capabilities_help = '''
Retrieve capability of the proxy.
Optional positional arguments:
<proxy_url> Proxy URL of the cluster to retrieve capabilities.
+
+Optional arguments:
+ --json Print the cluster capabilities in JSON format.
'''.strip('\n')
st_info_help = st_capabilities_help
@@ -1017,6 +1021,8 @@ def st_capabilities(parser, args, output_manager):
key=lambda x: x[0]):
output_manager.print_msg(" %s: %s" % (key, value))
+ parser.add_argument('--json', action='store_true',
+ help='print capability information in json')
(options, args) = parse_args(parser, args)
if args and len(args) > 2:
output_manager.error('Usage: %s capabilities %s\n%s',
@@ -1034,9 +1040,14 @@ def st_capabilities(parser, args, output_manager):
capabilities_result = swift.capabilities()
capabilities = capabilities_result['capabilities']
- _print_compo_cap('Core', {'swift': capabilities['swift']})
- del capabilities['swift']
- _print_compo_cap('Additional middleware', capabilities)
+ if options['json']:
+ output_manager.print_msg(
+ json.dumps(capabilities, sort_keys=True, indent=2))
+ else:
+ capabilities = dict(capabilities)
+ _print_compo_cap('Core', {'swift': capabilities['swift']})
+ del capabilities['swift']
+ _print_compo_cap('Additional middleware', capabilities)
except SwiftError as e:
output_manager.error(e.value)
diff --git a/tests/unit/test_shell.py b/tests/unit/test_shell.py
index 59f0d5f..b786c77 100644
--- a/tests/unit/test_shell.py
+++ b/tests/unit/test_shell.py
@@ -16,6 +16,7 @@ from __future__ import unicode_literals
from genericpath import getmtime
import hashlib
+import json
import logging
import mock
import os
@@ -1285,6 +1286,21 @@ class TestShell(unittest.TestCase):
swiftclient.shell.main(argv)
connection.return_value.get_capabilities.assert_called_with(None)
+ @mock.patch('swiftclient.service.Connection')
+ def test_capabilities_json(self, connection):
+ capabilities = {
+ 'slo': {'min_segment_size': 1000000},
+ 'some': [{'arbitrary': 'nested'}, {'crazy': 'structure'}],
+ 'swift': {'version': '2.5.0'}}
+
+ connection.return_value.get_capabilities.return_value = capabilities
+ argv = ["", "capabilities", "--json"]
+ with CaptureOutput(suppress_systemexit=True) as output:
+ swiftclient.shell.main(argv)
+ expected = json.dumps(capabilities, sort_keys=True, indent=2) + '\n'
+ self.assertEqual(expected, output.out)
+ connection.return_value.get_capabilities.assert_called_with(None)
+
def test_human_readable_upload_segment_size(self):
def _check_expected(x, expected):
actual = x.call_args_list[-1][1]["options"]["segment_size"]