diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-08-14 15:11:18 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-08-14 15:11:18 +0000 |
commit | 8664eadd19915db3c9b9fc009fc2accbac8f1b93 (patch) | |
tree | 338d1d7a5c0525f35c88205f4c0a326dc1b83317 | |
parent | 6b836ac3686d6842bf50ac24f09aca8dfac3f41b (diff) | |
parent | 776133bd299adfb644f2274143b9fba72672428d (diff) | |
download | python-swiftclient-8664eadd19915db3c9b9fc009fc2accbac8f1b93.tar.gz |
Merge "Clean up raw policy stats in account stat"
-rw-r--r-- | swiftclient/command_helpers.py | 41 | ||||
-rw-r--r-- | swiftclient/multithreading.py | 17 | ||||
-rw-r--r-- | tests/unit/test_command_helpers.py | 43 | ||||
-rw-r--r-- | tests/unit/test_shell.py | 10 |
4 files changed, 85 insertions, 26 deletions
diff --git a/swiftclient/command_helpers.py b/swiftclient/command_helpers.py index 0c81cb6..ef18636 100644 --- a/swiftclient/command_helpers.py +++ b/swiftclient/command_helpers.py @@ -15,9 +15,11 @@ from swiftclient.utils import prt_bytes def stat_account(conn, options, thread_manager): + items_to_print = [] + headers = conn.head_account() if options.verbose > 1: - thread_manager.print_items(( + items_to_print.extend(( ('StorageURL', conn.url), ('Auth Token', conn.token), )) @@ -26,19 +28,40 @@ def stat_account(conn, options, thread_manager): options.human).lstrip() bytes_used = prt_bytes(headers.get('x-account-bytes-used', 0), options.human).lstrip() - thread_manager.print_items(( + items_to_print.extend(( ('Account', conn.url.rsplit('/', 1)[-1]), ('Containers', container_count), ('Objects', object_count), ('Bytes', bytes_used), )) - thread_manager.print_headers(headers, - meta_prefix='x-account-meta-', - exclude_headers=( - 'content-length', 'date', - 'x-account-container-count', - 'x-account-object-count', - 'x-account-bytes-used')) + policies = set() + exclude_policy_headers = [] + ps_header_prefix = 'x-account-storage-policy-' + for header_key, header_value in headers.items(): + if header_key.lower().startswith(ps_header_prefix): + policy_name = header_key.rsplit('-', 2)[0].split('-', 4)[-1] + policies.add(policy_name) + exclude_policy_headers.append(header_key) + for policy in policies: + items_to_print.extend(( + ('Objects in policy "' + policy + '"', + prt_bytes(headers.get(ps_header_prefix + policy + '-object-count', + 0), options.human).lstrip()), + ('Bytes in policy "' + policy + '"', + prt_bytes(headers.get(ps_header_prefix + policy + '-bytes-used', + 0), options.human).lstrip()), + )) + + items_to_print.extend(thread_manager.headers_to_items( + headers, meta_prefix='x-account-meta-', + exclude_headers=([ + 'content-length', 'date', + 'x-account-container-count', + 'x-account-object-count', + 'x-account-bytes-used'] + exclude_policy_headers))) + # line up the items nicely + offset = max(len(item) for item, value in items_to_print) + thread_manager.print_items(items_to_print, offset=offset) def stat_container(conn, options, args, thread_manager): diff --git a/swiftclient/multithreading.py b/swiftclient/multithreading.py index 2f498c9..d187091 100644 --- a/swiftclient/multithreading.py +++ b/swiftclient/multithreading.py @@ -193,6 +193,7 @@ class MultiThreadingManager(object): The swift command-line tool uses this to exit non-zero if any error strings were printed. """ + DEFAULT_OFFSET = 14 def __init__(self, print_stream=sys.stdout, error_stream=sys.stderr): """ @@ -231,7 +232,7 @@ class MultiThreadingManager(object): msg = msg % fmt_args self.printer.queue.put(msg) - def print_items(self, items, offset=14, skip_missing=False): + def print_items(self, items, offset=DEFAULT_OFFSET, skip_missing=False): lines = [] template = '%%%ds: %%s' % offset for k, v in items: @@ -241,7 +242,7 @@ class MultiThreadingManager(object): self.print_msg('\n'.join(lines)) def print_headers(self, headers, meta_prefix='', exclude_headers=None, - offset=14): + offset=DEFAULT_OFFSET): exclude_headers = exclude_headers or [] meta_headers = [] other_headers = [] @@ -254,6 +255,18 @@ class MultiThreadingManager(object): other_headers.append(template % (key.title(), value)) self.print_msg('\n'.join(chain(meta_headers, other_headers))) + def headers_to_items(self, headers, meta_prefix='', exclude_headers=None): + exclude_headers = exclude_headers or [] + meta_items = [] + other_items = [] + for key, value in headers.items(): + if key.startswith(meta_prefix): + meta_key = 'Meta %s' % key[len(meta_prefix):].title() + meta_items.append((meta_key, value)) + elif key not in exclude_headers: + other_items.append((key.title(), value)) + return meta_items + other_items + def error(self, msg, *fmt_args): if fmt_args: msg = msg % fmt_args diff --git a/tests/unit/test_command_helpers.py b/tests/unit/test_command_helpers.py index af81601..8bb9dc1 100644 --- a/tests/unit/test_command_helpers.py +++ b/tests/unit/test_command_helpers.py @@ -69,10 +69,10 @@ class TestStatHelpers(testtools.TestCase): with self.thread_manager as thread_manager: h.stat_account(self.conn, self.options, thread_manager) expected = """ - Account: a - Containers: 42 - Objects: 976K - Bytes: 1.0G + Account: a +Containers: 42 + Objects: 976K + Bytes: 1.0G """ self.assertOut(expected) @@ -89,12 +89,35 @@ class TestStatHelpers(testtools.TestCase): with self.thread_manager as thread_manager: h.stat_account(self.conn, self.options, thread_manager) expected = """ - StorageURL: http://storage/v1/a - Auth Token: tk12345 - Account: a - Containers: 42 - Objects: 1000000 - Bytes: 1073741824 +StorageURL: http://storage/v1/a +Auth Token: tk12345 + Account: a +Containers: 42 + Objects: 1000000 + Bytes: 1073741824 +""" + self.assertOut(expected) + + def test_stat_account_policy_stat(self): + # stub head_account + stub_headers = { + 'x-account-container-count': 42, + 'x-account-object-count': 1000000, + 'x-account-bytes-used': 2 ** 30, + 'x-account-storage-policy-nada-object-count': 1000000, + 'x-account-storage-policy-nada-bytes-used': 2 ** 30, + } + self.conn.head_account.return_value = stub_headers + + with self.thread_manager as thread_manager: + h.stat_account(self.conn, self.options, thread_manager) + expected = """ + Account: a + Containers: 42 + Objects: 1000000 + Bytes: 1073741824 +Objects in policy "nada": 1000000 + Bytes in policy "nada": 1073741824 """ self.assertOut(expected) diff --git a/tests/unit/test_shell.py b/tests/unit/test_shell.py index daf4cd8..83113f0 100644 --- a/tests/unit/test_shell.py +++ b/tests/unit/test_shell.py @@ -63,11 +63,11 @@ class TestShell(unittest.TestCase): connection.return_value.head_account.return_value = return_headers connection.return_value.url = 'http://127.0.0.1/v1/AUTH_account' swiftclient.shell.main(argv) - calls = [mock.call(' Account: AUTH_account\n' + - ' Containers: 1\n' + - ' Objects: 2\n' + - ' Bytes: 3'), - mock.call('')] + calls = [mock.call(' Account: AUTH_account\n' + + 'Containers: 1\n' + + ' Objects: 2\n' + + ' Bytes: 3'), + ] mock_print.assert_has_calls(calls) @mock.patch('swiftclient.shell.MultiThreadingManager._print') |