From 86586188c026b0af78a4d95c02d438ef03333df0 Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Mon, 21 Jan 2013 17:37:16 +0100 Subject: [PATCH] Use the same Keystone client instance for pollster This provides a Keystone client instance for all pollsters running on the central agent. Blueprint: pollster-global-keystone-auth Change-Id: I83d8157683410d2eaa093c35d4071f7ed0e22ebd Signed-off-by: Julien Danjou --- ceilometer/central/manager.py | 8 ++++++++ ceilometer/energy/kwapi.py | 18 ++++++------------ ceilometer/image/glance.py | 24 +++++++++--------------- ceilometer/objectstore/swift.py | 20 ++++++++------------ tests/central/test_manager.py | 2 ++ tests/energy/test_kwapi.py | 11 +++++++++-- tests/image/test_glance.py | 11 +++++++++-- tests/network/test_floatingip.py | 1 + tests/objectstore/test_swift.py | 13 ++++++++++--- 9 files changed, 62 insertions(+), 46 deletions(-) diff --git a/ceilometer/central/manager.py b/ceilometer/central/manager.py index de70b370a..a0a17dcf8 100644 --- a/ceilometer/central/manager.py +++ b/ceilometer/central/manager.py @@ -16,6 +16,8 @@ # License for the specific language governing permissions and limitations # under the License. +from keystoneclient.v2_0 import client as ksclient + from ceilometer import agent from ceilometer import extension_manager from ceilometer.openstack.common import cfg @@ -42,6 +44,12 @@ class AgentManager(agent.AgentManager): def periodic_tasks(self, context, raise_on_error=False): """Tasks to be run at a periodic interval.""" + self.keystone = ksclient.Client(username=cfg.CONF.os_username, + password=cfg.CONF.os_password, + tenant_id=cfg.CONF.os_tenant_id, + tenant_name=cfg.CONF.os_tenant_name, + auth_url=cfg.CONF.os_auth_url) + self.ext_manager.map(self.publish_counters_from_one_pollster, manager=self, context=context, diff --git a/ceilometer/energy/kwapi.py b/ceilometer/energy/kwapi.py index aa96fb5ee..95c4da151 100644 --- a/ceilometer/energy/kwapi.py +++ b/ceilometer/energy/kwapi.py @@ -16,7 +16,6 @@ import datetime -from keystoneclient.v2_0 import client as ksclient import requests from ceilometer import counter @@ -51,21 +50,16 @@ class _Base(plugin.CentralPollster): """Base class for the Kwapi pollster, derived from CentralPollster.""" @staticmethod - def get_kwapi_client(): + def get_kwapi_client(ksclient): """Returns a KwapiClient configured with the proper url and token.""" - keystone = ksclient.Client(username=cfg.CONF.os_username, - password=cfg.CONF.os_password, - tenant_id=cfg.CONF.os_tenant_id, - tenant_name=cfg.CONF.os_tenant_name, - auth_url=cfg.CONF.os_auth_url) - endpoint = keystone.service_catalog.url_for(service_type='energy', + endpoint = ksclient.service_catalog.url_for(service_type='energy', endpoint_type='internalURL' ) - return KwapiClient(endpoint, keystone.auth_token) + return KwapiClient(endpoint, ksclient.auth_token) - def iter_probes(self): + def iter_probes(self, ksclient): """Iterate over all probes.""" - client = self.get_kwapi_client() + client = self.get_kwapi_client(ksclient) return client.iter_probes() @@ -78,7 +72,7 @@ class KwapiPollster(_Base): def get_counters(self, manager): """Returns all counters.""" - for probe in self.iter_probes(): + for probe in self.iter_probes(manager.keystone): yield counter.Counter( name='energy', type=counter.TYPE_CUMULATIVE, diff --git a/ceilometer/image/glance.py b/ceilometer/image/glance.py index 0d8801dd2..d09a193f6 100644 --- a/ceilometer/image/glance.py +++ b/ceilometer/image/glance.py @@ -23,33 +23,27 @@ from __future__ import absolute_import import itertools import glanceclient -from keystoneclient.v2_0 import client as ksclient from ceilometer import plugin from ceilometer import counter -from ceilometer.openstack.common import cfg from ceilometer.openstack.common import timeutils class _Base(plugin.PollsterBase): @staticmethod - def get_glance_client(): - k = ksclient.Client(username=cfg.CONF.os_username, - password=cfg.CONF.os_password, - tenant_id=cfg.CONF.os_tenant_id, - tenant_name=cfg.CONF.os_tenant_name, - auth_url=cfg.CONF.os_auth_url) - - endpoint = k.service_catalog.url_for(service_type='image', - endpoint_type='internalURL') + def get_glance_client(ksclient): + endpoint = ksclient.service_catalog.url_for( + service_type='image', + endpoint_type='internalURL') # hard-code v1 glance API version selection while v2 API matures - return glanceclient.Client('1', endpoint, token=k.auth_token) + return glanceclient.Client('1', endpoint, + token=ksclient.auth_token) - def iter_images(self): + def iter_images(self, ksclient): """Iterate over all images.""" - client = self.get_glance_client() + client = self.get_glance_client(ksclient) #TODO(eglynn): use pagination to protect against unbounded # memory usage return itertools.chain( @@ -88,7 +82,7 @@ class ImagePollster(_Base): return ['image', 'image.size'] def get_counters(self, manager): - for image in self.iter_images(): + for image in self.iter_images(manager.keystone): yield counter.Counter( name='image', type=counter.TYPE_GAUGE, diff --git a/ceilometer/objectstore/swift.py b/ceilometer/objectstore/swift.py index aa9882913..ff483bcc7 100644 --- a/ceilometer/objectstore/swift.py +++ b/ceilometer/objectstore/swift.py @@ -22,7 +22,6 @@ from __future__ import absolute_import import abc -from keystoneclient.v2_0 import client as ksclient from swiftclient import client as swift from ceilometer import plugin @@ -49,11 +48,11 @@ class _Base(plugin.PollsterBase): @staticmethod @abc.abstractmethod - def iter_accounts(): + def iter_accounts(ksclient): """Iterate over all accounts, yielding (tenant_id, stats) tuples.""" def get_counters(self, manager): - for tenant, account in self.iter_accounts(): + for tenant, account in self.iter_accounts(manager.keystone): yield counter.Counter( name='storage.objects', type=counter.TYPE_GAUGE, @@ -100,14 +99,11 @@ class SwiftPollster(_Base): 'storage.objects.containers'] @staticmethod - def iter_accounts(): - ks = ksclient.Client(username=cfg.CONF.os_username, - password=cfg.CONF.os_password, - tenant_name=cfg.CONF.os_tenant_name, - auth_url=cfg.CONF.os_auth_url) - endpoint = ks.service_catalog.url_for(service_type='object-store', - endpoint_type='adminURL') + def iter_accounts(ksclient): + endpoint = ksclient.service_catalog.url_for( + service_type='object-store', + endpoint_type='adminURL') base_url = '%s/v1/%s' % (endpoint, cfg.CONF.reseller_prefix) - for t in ks.tenants.list(): + for t in ksclient.tenants.list(): yield (t.id, swift.head_account('%s%s' % (base_url, t.id), - ks.auth_token)) + ksclient.auth_token)) diff --git a/tests/central/test_manager.py b/tests/central/test_manager.py index 4558de218..a8b7d0aca 100644 --- a/tests/central/test_manager.py +++ b/tests/central/test_manager.py @@ -27,6 +27,7 @@ from ceilometer import publish from ceilometer.tests import base from ceilometer.openstack.common import cfg +from keystoneclient.v2_0 import client as ksclient def test_load_plugins(): @@ -62,6 +63,7 @@ class TestRunTasks(base.TestCase): super(TestRunTasks, self).setUp() self.notifications = [] self.stubs.Set(publish, 'publish_counter', self.faux_notify) + self.stubs.Set(ksclient, 'Client', lambda *args, **kwargs: None) self.mgr = manager.AgentManager() self.mgr.ext_manager = extension.ExtensionManager('fake', invoke_on_load=False, diff --git a/tests/energy/test_kwapi.py b/tests/energy/test_kwapi.py index 4ae86d572..dfbceb493 100644 --- a/tests/energy/test_kwapi.py +++ b/tests/energy/test_kwapi.py @@ -43,10 +43,17 @@ PROBE_DICT = { } +class TestManager(manager.AgentManager): + + def __init__(self): + super(TestManager, self).__init__() + self.keystone = None + + class TestKwapiPollster(base.TestCase): @staticmethod - def fake_kwapi_iter_probes(foobar): + def fake_kwapi_iter_probes(self, ksclient): probes = PROBE_DICT['probes'] for key, value in probes.iteritems(): probe_dict = value @@ -56,7 +63,7 @@ class TestKwapiPollster(base.TestCase): def setUp(self): super(TestKwapiPollster, self).setUp() self.context = context.get_admin_context() - self.manager = manager.AgentManager() + self.manager = TestManager() self.stubs.Set(kwapi._Base, 'iter_probes', self.fake_kwapi_iter_probes) def test_kwapi_counter(self): diff --git a/tests/image/test_glance.py b/tests/image/test_glance.py index 1987338ed..b813091bd 100644 --- a/tests/image/test_glance.py +++ b/tests/image/test_glance.py @@ -83,16 +83,23 @@ IMAGE_LIST = [ ] +class TestManager(manager.AgentManager): + + def __init__(self): + super(TestManager, self).__init__() + self.keystone = None + + class TestImagePollster(base.TestCase): @staticmethod - def fake_glance_iter_images(foobar): + def fake_glance_iter_images(self, ksclient): return iter(IMAGE_LIST) def setUp(self): super(TestImagePollster, self).setUp() self.context = context.get_admin_context() - self.manager = manager.AgentManager() + self.manager = TestManager() self.stubs.Set(glance._Base, 'iter_images', self.fake_glance_iter_images) diff --git a/tests/network/test_floatingip.py b/tests/network/test_floatingip.py index e462b03c3..36e29a938 100644 --- a/tests/network/test_floatingip.py +++ b/tests/network/test_floatingip.py @@ -36,6 +36,7 @@ class TestFloatingIPPollster(base.TestCase): self.stubs.Set(nova_client.Client, 'floating_ip_get_all', self.faux_get_ips) + @staticmethod def faux_get_ips(self): ips = [] for i in range(1, 4): diff --git a/tests/objectstore/test_swift.py b/tests/objectstore/test_swift.py index e3bedc9e4..4282afb61 100644 --- a/tests/objectstore/test_swift.py +++ b/tests/objectstore/test_swift.py @@ -31,17 +31,24 @@ ACCOUNTS = [('tenant-000', {'x-account-object-count': 12, })] +class TestManager(manager.AgentManager): + + def __init__(self): + super(TestManager, self).__init__() + self.keystone = None + + class TestSwiftPollster(base.TestCase): @staticmethod - def fake_iter_accounts(_dummy): + def fake_iter_accounts(self, ksclient): for i in ACCOUNTS: yield i def setUp(self): super(TestSwiftPollster, self).setUp() self.pollster = swift.SwiftPollster() - self.manager = manager.AgentManager() + self.manager = TestManager() self.stubs.Set(swift.SwiftPollster, 'iter_accounts', self.fake_iter_accounts) @@ -50,6 +57,6 @@ class TestSwiftPollster(base.TestCase): self.assertEqual(len(counters), 6) def test_objectstore_get_counter_names(self): - counters = list(self.pollster.get_counters(None)) + counters = list(self.pollster.get_counters(self.manager)) self.assertEqual(set([c.name for c in counters]), set(self.pollster.get_counter_names()))