diff options
Diffstat (limited to 'ceilometerclient')
| -rw-r--r-- | ceilometerclient/common/base.py | 5 | ||||
| -rw-r--r-- | ceilometerclient/common/utils.py | 29 | ||||
| -rw-r--r-- | ceilometerclient/v2/resources.py | 7 | ||||
| -rw-r--r-- | ceilometerclient/v2/shell.py | 17 |
4 files changed, 48 insertions, 10 deletions
diff --git a/ceilometerclient/common/base.py b/ceilometerclient/common/base.py index 02ecdae..ae1ecfc 100644 --- a/ceilometerclient/common/base.py +++ b/ceilometerclient/common/base.py @@ -49,7 +49,8 @@ class Manager(object): def __init__(self, api): self.api = api - def _list(self, url, response_key=None, obj_class=None, body=None): + def _list(self, url, response_key=None, obj_class=None, body=None, + expect_single=False): resp, body = self.api.json_request('GET', url) if obj_class is None: @@ -62,6 +63,8 @@ class Manager(object): return [] else: data = body + if expect_single: + data = [data] return [obj_class(self, res, loaded=True) for res in data if res] def _delete(self, url): diff --git a/ceilometerclient/common/utils.py b/ceilometerclient/common/utils.py index 2703b7a..658cdf4 100644 --- a/ceilometerclient/common/utils.py +++ b/ceilometerclient/common/utils.py @@ -17,6 +17,7 @@ import errno import hashlib import os import sys +import textwrap import uuid import prettytable @@ -49,22 +50,32 @@ def print_list(objs, fields, field_labels, formatters={}, sortby=0): if field in formatters: row.append(formatters[field](o)) else: - data = getattr(o, field, None) or '' + data = getattr(o, field, '') row.append(data) pt.add_row(row) print pt.get_string(sortby=field_labels[sortby]) -def print_dict(d, formatters={}): - pt = prettytable.PrettyTable(['Property', 'Value'], caching=False) +def print_dict(d, dict_property="Property", wrap=0): + pt = prettytable.PrettyTable([dict_property, 'Value'], caching=False) pt.align = 'l' - - for field in d.keys(): - if field in formatters: - pt.add_row([field, formatters[field](d[field])]) + for k, v in d.iteritems(): + # convert dict to str to check length + if isinstance(v, dict): + v = str(v) + if wrap > 0: + v = textwrap.fill(str(v), wrap) + # if value has a newline, add in multiple rows + # e.g. fault with stacktrace + if v and isinstance(v, basestring) and r'\n' in v: + lines = v.strip().split(r'\n') + col1 = k + for line in lines: + pt.add_row([col1, line]) + col1 = '' else: - pt.add_row([field, d[field]]) - print pt.get_string(sortby='Property') + pt.add_row([k, v]) + print pt.get_string() def find_resource(manager, name_or_id): diff --git a/ceilometerclient/v2/resources.py b/ceilometerclient/v2/resources.py index 9b80671..59adb95 100644 --- a/ceilometerclient/v2/resources.py +++ b/ceilometerclient/v2/resources.py @@ -29,3 +29,10 @@ class ResourceManager(base.Manager): def list(self, q=None): path = '/v2/resources' return self._list(options.build_url(path, q)) + + def get(self, resource_id): + path = '/v2/resources/%s' % resource_id + try: + return self._list(path, expect_single=True)[0] + except IndexError: + return None diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py index 1f11dc5..f577229 100644 --- a/ceilometerclient/v2/shell.py +++ b/ceilometerclient/v2/shell.py @@ -91,3 +91,20 @@ def do_resource_list(cc, args={}): fields = ['resource_id', 'source', 'user_id', 'project_id'] utils.print_list(resources, fields, field_labels, sortby=1) + + +@utils.arg('-r', '--resource_id', metavar='<RESOURCE_ID>', + help='ID of the resource to show.') +def do_resource_show(cc, args={}): + '''Show the resource''' + if args.resource_id is None: + raise exc.CommandError('Resource id not provided (-r <resource id>)') + try: + resource = cc.resources.get(args.resource_id) + except exc.HTTPNotFound: + raise exc.CommandError('Resource not found: %s' % args.resource_id) + else: + fields = ['resource_id', 'source', 'user_id', + 'project_id', 'metadata'] + data = dict([(f, getattr(resource, f, '')) for f in fields]) + utils.print_dict(data, wrap=72) |
