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 <julien@danjou.info>
This commit is contained in:
Julien Danjou 2013-01-21 17:37:16 +01:00
parent d33d20c372
commit 86586188c0
9 changed files with 62 additions and 46 deletions

View File

@ -16,6 +16,8 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from keystoneclient.v2_0 import client as ksclient
from ceilometer import agent from ceilometer import agent
from ceilometer import extension_manager from ceilometer import extension_manager
from ceilometer.openstack.common import cfg from ceilometer.openstack.common import cfg
@ -42,6 +44,12 @@ class AgentManager(agent.AgentManager):
def periodic_tasks(self, context, raise_on_error=False): def periodic_tasks(self, context, raise_on_error=False):
"""Tasks to be run at a periodic interval.""" """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, self.ext_manager.map(self.publish_counters_from_one_pollster,
manager=self, manager=self,
context=context, context=context,

View File

@ -16,7 +16,6 @@
import datetime import datetime
from keystoneclient.v2_0 import client as ksclient
import requests import requests
from ceilometer import counter from ceilometer import counter
@ -51,21 +50,16 @@ class _Base(plugin.CentralPollster):
"""Base class for the Kwapi pollster, derived from CentralPollster.""" """Base class for the Kwapi pollster, derived from CentralPollster."""
@staticmethod @staticmethod
def get_kwapi_client(): def get_kwapi_client(ksclient):
"""Returns a KwapiClient configured with the proper url and token.""" """Returns a KwapiClient configured with the proper url and token."""
keystone = ksclient.Client(username=cfg.CONF.os_username, endpoint = ksclient.service_catalog.url_for(service_type='energy',
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_type='internalURL' 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.""" """Iterate over all probes."""
client = self.get_kwapi_client() client = self.get_kwapi_client(ksclient)
return client.iter_probes() return client.iter_probes()
@ -78,7 +72,7 @@ class KwapiPollster(_Base):
def get_counters(self, manager): def get_counters(self, manager):
"""Returns all counters.""" """Returns all counters."""
for probe in self.iter_probes(): for probe in self.iter_probes(manager.keystone):
yield counter.Counter( yield counter.Counter(
name='energy', name='energy',
type=counter.TYPE_CUMULATIVE, type=counter.TYPE_CUMULATIVE,

View File

@ -23,33 +23,27 @@ from __future__ import absolute_import
import itertools import itertools
import glanceclient import glanceclient
from keystoneclient.v2_0 import client as ksclient
from ceilometer import plugin from ceilometer import plugin
from ceilometer import counter from ceilometer import counter
from ceilometer.openstack.common import cfg
from ceilometer.openstack.common import timeutils from ceilometer.openstack.common import timeutils
class _Base(plugin.PollsterBase): class _Base(plugin.PollsterBase):
@staticmethod @staticmethod
def get_glance_client(): def get_glance_client(ksclient):
k = ksclient.Client(username=cfg.CONF.os_username, endpoint = ksclient.service_catalog.url_for(
password=cfg.CONF.os_password, service_type='image',
tenant_id=cfg.CONF.os_tenant_id, endpoint_type='internalURL')
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')
# hard-code v1 glance API version selection while v2 API matures # 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.""" """Iterate over all images."""
client = self.get_glance_client() client = self.get_glance_client(ksclient)
#TODO(eglynn): use pagination to protect against unbounded #TODO(eglynn): use pagination to protect against unbounded
# memory usage # memory usage
return itertools.chain( return itertools.chain(
@ -88,7 +82,7 @@ class ImagePollster(_Base):
return ['image', 'image.size'] return ['image', 'image.size']
def get_counters(self, manager): def get_counters(self, manager):
for image in self.iter_images(): for image in self.iter_images(manager.keystone):
yield counter.Counter( yield counter.Counter(
name='image', name='image',
type=counter.TYPE_GAUGE, type=counter.TYPE_GAUGE,

View File

@ -22,7 +22,6 @@ from __future__ import absolute_import
import abc import abc
from keystoneclient.v2_0 import client as ksclient
from swiftclient import client as swift from swiftclient import client as swift
from ceilometer import plugin from ceilometer import plugin
@ -49,11 +48,11 @@ class _Base(plugin.PollsterBase):
@staticmethod @staticmethod
@abc.abstractmethod @abc.abstractmethod
def iter_accounts(): def iter_accounts(ksclient):
"""Iterate over all accounts, yielding (tenant_id, stats) tuples.""" """Iterate over all accounts, yielding (tenant_id, stats) tuples."""
def get_counters(self, manager): def get_counters(self, manager):
for tenant, account in self.iter_accounts(): for tenant, account in self.iter_accounts(manager.keystone):
yield counter.Counter( yield counter.Counter(
name='storage.objects', name='storage.objects',
type=counter.TYPE_GAUGE, type=counter.TYPE_GAUGE,
@ -100,14 +99,11 @@ class SwiftPollster(_Base):
'storage.objects.containers'] 'storage.objects.containers']
@staticmethod @staticmethod
def iter_accounts(): def iter_accounts(ksclient):
ks = ksclient.Client(username=cfg.CONF.os_username, endpoint = ksclient.service_catalog.url_for(
password=cfg.CONF.os_password, service_type='object-store',
tenant_name=cfg.CONF.os_tenant_name, endpoint_type='adminURL')
auth_url=cfg.CONF.os_auth_url)
endpoint = ks.service_catalog.url_for(service_type='object-store',
endpoint_type='adminURL')
base_url = '%s/v1/%s' % (endpoint, cfg.CONF.reseller_prefix) 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), yield (t.id, swift.head_account('%s%s' % (base_url, t.id),
ks.auth_token)) ksclient.auth_token))

View File

@ -27,6 +27,7 @@ from ceilometer import publish
from ceilometer.tests import base from ceilometer.tests import base
from ceilometer.openstack.common import cfg from ceilometer.openstack.common import cfg
from keystoneclient.v2_0 import client as ksclient
def test_load_plugins(): def test_load_plugins():
@ -62,6 +63,7 @@ class TestRunTasks(base.TestCase):
super(TestRunTasks, self).setUp() super(TestRunTasks, self).setUp()
self.notifications = [] self.notifications = []
self.stubs.Set(publish, 'publish_counter', self.faux_notify) self.stubs.Set(publish, 'publish_counter', self.faux_notify)
self.stubs.Set(ksclient, 'Client', lambda *args, **kwargs: None)
self.mgr = manager.AgentManager() self.mgr = manager.AgentManager()
self.mgr.ext_manager = extension.ExtensionManager('fake', self.mgr.ext_manager = extension.ExtensionManager('fake',
invoke_on_load=False, invoke_on_load=False,

View File

@ -43,10 +43,17 @@ PROBE_DICT = {
} }
class TestManager(manager.AgentManager):
def __init__(self):
super(TestManager, self).__init__()
self.keystone = None
class TestKwapiPollster(base.TestCase): class TestKwapiPollster(base.TestCase):
@staticmethod @staticmethod
def fake_kwapi_iter_probes(foobar): def fake_kwapi_iter_probes(self, ksclient):
probes = PROBE_DICT['probes'] probes = PROBE_DICT['probes']
for key, value in probes.iteritems(): for key, value in probes.iteritems():
probe_dict = value probe_dict = value
@ -56,7 +63,7 @@ class TestKwapiPollster(base.TestCase):
def setUp(self): def setUp(self):
super(TestKwapiPollster, self).setUp() super(TestKwapiPollster, self).setUp()
self.context = context.get_admin_context() 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) self.stubs.Set(kwapi._Base, 'iter_probes', self.fake_kwapi_iter_probes)
def test_kwapi_counter(self): def test_kwapi_counter(self):

View File

@ -83,16 +83,23 @@ IMAGE_LIST = [
] ]
class TestManager(manager.AgentManager):
def __init__(self):
super(TestManager, self).__init__()
self.keystone = None
class TestImagePollster(base.TestCase): class TestImagePollster(base.TestCase):
@staticmethod @staticmethod
def fake_glance_iter_images(foobar): def fake_glance_iter_images(self, ksclient):
return iter(IMAGE_LIST) return iter(IMAGE_LIST)
def setUp(self): def setUp(self):
super(TestImagePollster, self).setUp() super(TestImagePollster, self).setUp()
self.context = context.get_admin_context() self.context = context.get_admin_context()
self.manager = manager.AgentManager() self.manager = TestManager()
self.stubs.Set(glance._Base, 'iter_images', self.stubs.Set(glance._Base, 'iter_images',
self.fake_glance_iter_images) self.fake_glance_iter_images)

View File

@ -36,6 +36,7 @@ class TestFloatingIPPollster(base.TestCase):
self.stubs.Set(nova_client.Client, 'floating_ip_get_all', self.stubs.Set(nova_client.Client, 'floating_ip_get_all',
self.faux_get_ips) self.faux_get_ips)
@staticmethod
def faux_get_ips(self): def faux_get_ips(self):
ips = [] ips = []
for i in range(1, 4): for i in range(1, 4):

View File

@ -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): class TestSwiftPollster(base.TestCase):
@staticmethod @staticmethod
def fake_iter_accounts(_dummy): def fake_iter_accounts(self, ksclient):
for i in ACCOUNTS: for i in ACCOUNTS:
yield i yield i
def setUp(self): def setUp(self):
super(TestSwiftPollster, self).setUp() super(TestSwiftPollster, self).setUp()
self.pollster = swift.SwiftPollster() self.pollster = swift.SwiftPollster()
self.manager = manager.AgentManager() self.manager = TestManager()
self.stubs.Set(swift.SwiftPollster, 'iter_accounts', self.stubs.Set(swift.SwiftPollster, 'iter_accounts',
self.fake_iter_accounts) self.fake_iter_accounts)
@ -50,6 +57,6 @@ class TestSwiftPollster(base.TestCase):
self.assertEqual(len(counters), 6) self.assertEqual(len(counters), 6)
def test_objectstore_get_counter_names(self): 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]), self.assertEqual(set([c.name for c in counters]),
set(self.pollster.get_counter_names())) set(self.pollster.get_counter_names()))