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
# 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,

View File

@ -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,

View File

@ -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,

View File

@ -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))

View File

@ -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,

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):
@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):

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):
@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)

View File

@ -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):

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):
@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()))