diff --git a/ceilometerclient/v1/meters.py b/ceilometerclient/v1/meters.py index ad653d83..960e65d7 100644 --- a/ceilometerclient/v1/meters.py +++ b/ceilometerclient/v1/meters.py @@ -32,7 +32,12 @@ class UserManager(base.Manager): resource_class = User def list(self, **kwargs): - return self._list('/v1/users', 'users') + s = kwargs.get('source') + if s: + path = '/sources/%s/users' % (s) + else: + path = '/users' + return self._list('/v1%s' % path, 'users') class Project(base.Resource): @@ -57,7 +62,7 @@ class ProjectManager(base.Manager): else: path = '/projects' - return self._list('/v1/%s' % path, 'projects') + return self._list('/v1%s' % path, 'projects') class Resource(base.Resource): @@ -74,11 +79,14 @@ class ResourceManager(base.Manager): def list(self, **kwargs): u = kwargs.get('user_id') s = kwargs.get('source') + p = kwargs.get('project_id') opts = kwargs.get('metaquery') if u: path = '/users/%s/resources' % (u) elif s: path = '/sources/%s/resources' % (s) + elif p: + path = '/projects/%s/resources' % (p) else: path = '/resources' if opts: diff --git a/ceilometerclient/v1/shell.py b/ceilometerclient/v1/shell.py index f49e5d8f..f4ad973a 100644 --- a/ceilometerclient/v1/shell.py +++ b/ceilometerclient/v1/shell.py @@ -71,9 +71,11 @@ def do_meter_list(cc, args={}): sortby=0) +@utils.arg('-s', '--source', metavar='', + help='ID of the resource to show projects for.') def do_user_list(cc, args={}): '''List the users''' - kwargs = {} + kwargs = {'source': args.source} users = cc.users.list(**kwargs) field_labels = ['User ID'] fields = ['user_id'] @@ -85,10 +87,16 @@ def do_user_list(cc, args={}): help='ID of the resource to show for.') @utils.arg('-u', '--user_id', metavar='', help='ID of the user to show resources for.') +@utils.arg('-p', '--project_id', metavar='', + help='ID of the project to show samples for.') +@utils.arg('-m', '--metaquery', metavar='', + help='Query into the metadata metadata.key=value:..') def do_resource_list(cc, args={}): '''List the users''' kwargs = {'source': args.source, - 'user_id': args.user_id} + 'user_id': args.user_id, + 'project_id': args.project_id, + 'metaquery': args.metaquery} resources = cc.resources.list(**kwargs) field_labels = ['Resource ID', 'Source', 'User ID', 'Project ID'] diff --git a/tests/v1/test_projects.py b/tests/v1/test_projects.py new file mode 100644 index 00000000..1e1c0e87 --- /dev/null +++ b/tests/v1/test_projects.py @@ -0,0 +1,66 @@ +# 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.v1.meters +from tests import utils + + +fixtures = { + '/v1/projects': { + 'GET': ( + {}, + {'projects': [ + 'a', + 'b', + ]}, + ), + }, + '/v1/sources/source_b/projects': { + 'GET': ( + {}, + {'projects': [ + 'b', + ]}, + ), + }, +} + + +class ProjectManagerTest(unittest.TestCase): + + def setUp(self): + self.api = utils.FakeAPI(fixtures) + self.mgr = ceilometerclient.v1.meters.ProjectManager(self.api) + + def test_list_all(self): + projects = list(self.mgr.list()) + expect = [ + ('GET', '/v1/projects', {}, None), + ] + self.assertEqual(self.api.calls, expect) + self.assertEqual(len(projects), 2) + self.assertEqual(projects[0].project_id, 'a') + self.assertEqual(projects[1].project_id, 'b') + + def test_list_by_source(self): + projects = list(self.mgr.list(source='source_b')) + expect = [ + ('GET', '/v1/sources/source_b/projects', {}, None), + ] + self.assertEqual(self.api.calls, expect) + self.assertEqual(len(projects), 1) + self.assertEqual(projects[0].project_id, 'b') diff --git a/tests/v1/test_resources.py b/tests/v1/test_resources.py index 4a1dc8d4..0a505532 100644 --- a/tests/v1/test_resources.py +++ b/tests/v1/test_resources.py @@ -26,7 +26,7 @@ fixtures = { {'resources': [ { 'resource_id': 'a', - 'project_id': 'dig_the_ditch', + 'project_id': 'project_bla', 'user_id': 'freddy', 'timestamp': 'now', 'meter': ['this', 'that'], @@ -73,6 +73,21 @@ fixtures = { ]}, ), }, + '/v1/projects/project_bla/resources': { + 'GET': ( + {}, + {'resources': [ + { + 'resource_id': 'a', + 'project_id': 'project_bla', + 'user_id': 'freddy', + 'timestamp': 'now', + 'meter': ['this', 'that'], + 'metadata': {'zxc_id': 'bla'}, + }, + ]}, + ), + }, } @@ -109,3 +124,12 @@ class ResourceManagerTest(unittest.TestCase): self.assertEqual(self.api.calls, expect) self.assertEqual(len(resources), 1) self.assertEqual(resources[0].resource_id, 'b') + + def test_list_by_project(self): + resources = list(self.mgr.list(project_id='project_bla')) + expect = [ + ('GET', '/v1/projects/project_bla/resources', {}, None), + ] + self.assertEqual(self.api.calls, expect) + self.assertEqual(len(resources), 1) + self.assertEqual(resources[0].resource_id, 'a') diff --git a/tests/v1/test_users.py b/tests/v1/test_users.py new file mode 100644 index 00000000..423f9087 --- /dev/null +++ b/tests/v1/test_users.py @@ -0,0 +1,66 @@ +# 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.v1.meters +from tests import utils + + +fixtures = { + '/v1/users': { + 'GET': ( + {}, + {'users': [ + 'a', + 'b', + ]}, + ), + }, + '/v1/sources/source_b/users': { + 'GET': ( + {}, + {'users': [ + 'b', + ]}, + ), + }, +} + + +class UserManagerTest(unittest.TestCase): + + def setUp(self): + self.api = utils.FakeAPI(fixtures) + self.mgr = ceilometerclient.v1.meters.UserManager(self.api) + + def test_list_all(self): + users = list(self.mgr.list()) + expect = [ + ('GET', '/v1/users', {}, None), + ] + self.assertEqual(self.api.calls, expect) + self.assertEqual(len(users), 2) + self.assertEqual(users[0].user_id, 'a') + self.assertEqual(users[1].user_id, 'b') + + def test_list_by_source(self): + users = list(self.mgr.list(source='source_b')) + expect = [ + ('GET', '/v1/sources/source_b/users', {}, None), + ] + self.assertEqual(self.api.calls, expect) + self.assertEqual(len(users), 1) + self.assertEqual(users[0].user_id, 'b')