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:
parent
d33d20c372
commit
86586188c0
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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))
|
||||||
|
@ -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,
|
||||||
|
@ -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):
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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):
|
||||||
|
@ -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()))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user