diff -Nru python-ceilometerclient-1.0.0+git201303281007~raring/ChangeLog python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ChangeLog --- python-ceilometerclient-1.0.0+git201303281007~raring/ChangeLog 2013-03-28 14:09:13.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ChangeLog 2013-03-29 14:38:05.000000000 +0000 @@ -1,3 +1,22 @@ +commit f3d044291fe75c2b6ce7a4f8e9a6885d4ffd38c0 +Author: Lianhao Lu +Date: Fri Mar 29 18:40:44 2013 +0800 + + v2 API: added resource-show. + + Added resource-show command for v2 API. + + blueprint more-cli-cmd. + + Change-Id: I9e0dcff63b2ac6650094d47a947a2deaaea2ba4d + + ceilometerclient/common/base.py | 5 +- + ceilometerclient/common/utils.py | 29 +++++++---- + ceilometerclient/v2/resources.py | 7 +++ + ceilometerclient/v2/shell.py | 17 +++++++ + tests/v2/test_resources.py | 106 +++++++++++++++++++++++++++++++++++++++ + 5 files changed, 154 insertions(+), 10 deletions(-) + commit e30d70074f278f58457d9d2b278815b5ccb39a63 Author: Angus Salkeld Date: Wed Mar 27 18:00:11 2013 +1100 diff -Nru python-ceilometerclient-1.0.0+git201303281007~raring/PKG-INFO python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/PKG-INFO --- python-ceilometerclient-1.0.0+git201303281007~raring/PKG-INFO 2013-03-28 14:09:13.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/PKG-INFO 2013-03-29 14:38:05.000000000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: python-ceilometerclient -Version: 1.0.0 +Version: 1.0.0.1.gf3d0442 Summary: Client library for ceilometer Home-page: https://github.com/openstack/python-ceilometerclient Author: Ceilometer Developers diff -Nru python-ceilometerclient-1.0.0+git201303281007~raring/ceilometerclient/common/base.py python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ceilometerclient/common/base.py --- python-ceilometerclient-1.0.0+git201303281007~raring/ceilometerclient/common/base.py 2013-03-28 14:07:05.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ceilometerclient/common/base.py 2013-03-29 14:36:06.000000000 +0000 @@ -49,7 +49,8 @@ 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 @@ 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 -Nru python-ceilometerclient-1.0.0+git201303281007~raring/ceilometerclient/common/utils.py python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ceilometerclient/common/utils.py --- python-ceilometerclient-1.0.0+git201303281007~raring/ceilometerclient/common/utils.py 2013-03-28 14:07:05.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ceilometerclient/common/utils.py 2013-03-29 14:36:06.000000000 +0000 @@ -17,6 +17,7 @@ import hashlib import os import sys +import textwrap import uuid import prettytable @@ -49,22 +50,32 @@ 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 -Nru python-ceilometerclient-1.0.0+git201303281007~raring/ceilometerclient/v2/resources.py python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ceilometerclient/v2/resources.py --- python-ceilometerclient-1.0.0+git201303281007~raring/ceilometerclient/v2/resources.py 2013-03-28 14:07:05.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ceilometerclient/v2/resources.py 2013-03-29 14:36:06.000000000 +0000 @@ -29,3 +29,10 @@ 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 -Nru python-ceilometerclient-1.0.0+git201303281007~raring/ceilometerclient/v2/shell.py python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ceilometerclient/v2/shell.py --- python-ceilometerclient-1.0.0+git201303281007~raring/ceilometerclient/v2/shell.py 2013-03-28 14:07:05.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/ceilometerclient/v2/shell.py 2013-03-29 14:36:06.000000000 +0000 @@ -91,3 +91,20 @@ fields = ['resource_id', 'source', 'user_id', 'project_id'] utils.print_list(resources, fields, field_labels, sortby=1) + + +@utils.arg('-r', '--resource_id', metavar='', + 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 )') + 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) diff -Nru python-ceilometerclient-1.0.0+git201303281007~raring/debian/changelog python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/debian/changelog --- python-ceilometerclient-1.0.0+git201303281007~raring/debian/changelog 2013-03-28 14:09:19.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/debian/changelog 2013-03-29 14:38:07.000000000 +0000 @@ -1,14 +1,9 @@ -python-ceilometerclient (1.0.0+git201303281007~raring-0ubuntu1) raring; urgency=low +python-ceilometerclient (1.0.0.1.gf3d0442+git201303291036~raring-0ubuntu1) raring; urgency=low * Automated Ubuntu testing build: - * [e30d700] Make it possible to pass -q "metadata.field=value" - * [3b75a7a] Corrected help strings. - * [c813dbd] Don't log unneccessarly on each http request - * [2b5fcd6] Catch KeyError exception as early as possible when there - is no matching data on the server. - * [152f764] Properly removing start and ending slashes + * [f3d0442] v2 API: added resource-show. - -- Openstack Ubuntu Testing Bot Thu, 28 Mar 2013 10:09:17 -0400 + -- Openstack Ubuntu Testing Bot Fri, 29 Mar 2013 10:38:06 -0400 python-ceilometerclient (1.0.0-0ubuntu1) raring; urgency=low diff -Nru python-ceilometerclient-1.0.0+git201303281007~raring/python_ceilometerclient.egg-info/PKG-INFO python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/python_ceilometerclient.egg-info/PKG-INFO --- python-ceilometerclient-1.0.0+git201303281007~raring/python_ceilometerclient.egg-info/PKG-INFO 2013-03-28 14:09:13.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/python_ceilometerclient.egg-info/PKG-INFO 2013-03-29 14:38:05.000000000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: python-ceilometerclient -Version: 1.0.0 +Version: 1.0.0.1.gf3d0442 Summary: Client library for ceilometer Home-page: https://github.com/openstack/python-ceilometerclient Author: Ceilometer Developers diff -Nru python-ceilometerclient-1.0.0+git201303281007~raring/python_ceilometerclient.egg-info/SOURCES.txt python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/python_ceilometerclient.egg-info/SOURCES.txt --- python-ceilometerclient-1.0.0+git201303281007~raring/python_ceilometerclient.egg-info/SOURCES.txt 2013-03-28 14:09:13.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/python_ceilometerclient.egg-info/SOURCES.txt 2013-03-29 14:38:05.000000000 +0000 @@ -56,6 +56,7 @@ tests/v1/test_users.py tests/v2/__init__.py tests/v2/test_options.py +tests/v2/test_resources.py tests/v2/test_samples.py tests/v2/test_statistics.py tools/pip-requires diff -Nru python-ceilometerclient-1.0.0+git201303281007~raring/tests/v2/test_resources.py python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/tests/v2/test_resources.py --- python-ceilometerclient-1.0.0+git201303281007~raring/tests/v2/test_resources.py 1970-01-01 00:00:00.000000000 +0000 +++ python-ceilometerclient-1.0.0.1.gf3d0442+git201303291036~raring/tests/v2/test_resources.py 2013-03-29 14:36:06.000000000 +0000 @@ -0,0 +1,106 @@ +# Copyright 2012 OpenStack LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import unittest + +import ceilometerclient.v2.resources +from tests import utils + + +fixtures = { + '/v2/resources': { + 'GET': ( + {}, + [ + { + 'resource_id': 'a', + 'project_id': 'project_bla', + 'user_id': 'freddy', + 'metadata': {'zxc_id': 'bla'}, + }, + { + 'resource_id': 'b', + 'project_id': 'dig_the_ditch', + 'user_id': 'joey', + 'metadata': {'zxc_id': 'foo'}, + }, + ] + ), + }, + '/v2/resources?q.op=&q.value=a&q.field=resource_id': + { + 'GET': ( + {}, + [ + { + 'resource_id': 'a', + 'project_id': 'project_bla', + 'user_id': 'freddy', + 'metadata': {'zxc_id': 'bla'}, + }, + ] + ), + }, + '/v2/resources/a': + { + 'GET': ( + {}, + { + 'resource_id': 'a', + 'project_id': 'project_bla', + 'user_id': 'freddy', + 'metadata': {'zxc_id': 'bla'}, + }, + ), + }, +} + + +class ResourceManagerTest(unittest.TestCase): + + def setUp(self): + self.api = utils.FakeAPI(fixtures) + self.mgr = ceilometerclient.v2.resources.ResourceManager(self.api) + + def test_list_all(self): + resources = list(self.mgr.list()) + expect = [ + ('GET', '/v2/resources', {}, None), + ] + self.assertEqual(self.api.calls, expect) + self.assertEqual(len(resources), 2) + self.assertEqual(resources[0].resource_id, 'a') + self.assertEqual(resources[1].resource_id, 'b') + + def test_list_one(self): + resource = self.mgr.get(resource_id='a') + expect = [ + ('GET', '/v2/resources/a', {}, None), + ] + self.assertEqual(self.api.calls, expect) + self.assertTrue(resource) + self.assertEqual(resource.resource_id, 'a') + + def test_list_by_query(self): + resources = list(self.mgr.list(q=[ + {"field": "resource_id", + "value": "a"}, + ])) + expect = [ + ('GET', '/v2/resources?q.op=&q.value=a&q.field=resource_id', {}, None), + ] + self.assertEqual(self.api.calls, expect) + self.assertEqual(len(resources), 1) + self.assertEqual(resources[0].resource_id, 'a')