diff --git a/ceilometer/central/plugin.py b/ceilometer/central/plugin.py index 17fcdc43..60e9b7f8 100644 --- a/ceilometer/central/plugin.py +++ b/ceilometer/central/plugin.py @@ -28,16 +28,33 @@ class CentralPollster(plugin.PollsterBase): """Base class for plugins that support the polling API.""" -def check_keystone(f): - """Decorator function to check if manager has valid keystone client.""" - def func(self, *args, **kwargs): - manager = kwargs.get('manager') - if not manager and len(args) > 0: - manager = args[0] - keystone = getattr(manager, 'keystone', None) - if not keystone or isinstance(keystone, Exception): - LOG.error(_('Skip due to keystone error %s'), - str(keystone) if keystone else '') - return iter([]) - return f(self, *args, **kwargs) - return func +def check_keystone(service_type=None, client=None): + """Decorator function to check if manager has valid keystone client. + + Also checks if the service is registered/enabled in Keystone. + + :param service_type: name of service in Keystone + :param client: client name if not passed in as function param + """ + def wrapped(f): + def func(self, *args, **kwargs): + if client: + manager = getattr(self, client, None) + else: + manager = kwargs.get('manager') + if not manager and len(args) > 0: + manager = args[0] + keystone = getattr(manager, 'keystone', None) + if not keystone or isinstance(keystone, Exception): + LOG.error(_('Skip due to keystone error %s'), + str(keystone) if keystone else '') + return iter([]) + elif service_type: + endpoints = keystone.service_catalog.get_endpoints() + if not endpoints.get(service_type): + LOG.warning(_('Skipping because service is not' + 'registered in keystone')) + return iter([]) + return f(self, *args, **kwargs) + return func + return wrapped diff --git a/ceilometer/energy/kwapi.py b/ceilometer/energy/kwapi.py index 59ff3c48..21156b07 100644 --- a/ceilometer/energy/kwapi.py +++ b/ceilometer/energy/kwapi.py @@ -82,7 +82,7 @@ class _Base(plugin.CentralPollster): class EnergyPollster(_Base): """Measures energy consumption.""" - @plugin.check_keystone + @plugin.check_keystone('energy') def get_samples(self, manager, cache, resources=None): """Returns all samples.""" for probe in self._iter_probes(manager.keystone, cache): @@ -102,7 +102,7 @@ class EnergyPollster(_Base): class PowerPollster(_Base): """Measures power consumption.""" - @plugin.check_keystone + @plugin.check_keystone('energy') def get_samples(self, manager, cache, resources=None): """Returns all samples.""" for probe in self._iter_probes(manager.keystone, cache): diff --git a/ceilometer/image/glance.py b/ceilometer/image/glance.py index 85bf6851..561ebf9e 100644 --- a/ceilometer/image/glance.py +++ b/ceilometer/image/glance.py @@ -117,7 +117,7 @@ class _Base(plugin.CentralPollster): class ImagePollster(_Base): - @plugin.check_keystone + @plugin.check_keystone('image') def get_samples(self, manager, cache, resources=None): for image in self._iter_images(manager.keystone, cache): yield sample.Sample( @@ -134,7 +134,7 @@ class ImagePollster(_Base): class ImageSizePollster(_Base): - @plugin.check_keystone + @plugin.check_keystone('image') def get_samples(self, manager, cache, resources=None): for image in self._iter_images(manager.keystone, cache): yield sample.Sample( diff --git a/ceilometer/network/floatingip.py b/ceilometer/network/floatingip.py index 5228fa80..26c17cbe 100644 --- a/ceilometer/network/floatingip.py +++ b/ceilometer/network/floatingip.py @@ -39,6 +39,7 @@ class FloatingIPPollster(plugin.CentralPollster): cache['floating_ips'] = list(self._get_floating_ips()) return iter(cache['floating_ips']) + @plugin.check_keystone('network') def get_samples(self, manager, cache, resources=None): for ip in self._iter_floating_ips(cache): LOG.info(_("FLOATING IP USAGE: %s") % ip.ip) diff --git a/ceilometer/network/services/discovery.py b/ceilometer/network/services/discovery.py index 87693cff..d16dc6b9 100644 --- a/ceilometer/network/services/discovery.py +++ b/ceilometer/network/services/discovery.py @@ -15,11 +15,12 @@ # License for the specific language governing permissions and limitations # under the License. +from ceilometer.central import plugin from ceilometer import neutron_client -from ceilometer import plugin +from ceilometer import plugin as base_plugin -class _BaseServicesDiscovery(plugin.DiscoveryBase): +class _BaseServicesDiscovery(base_plugin.DiscoveryBase): def __init__(self): super(_BaseServicesDiscovery, self).__init__() @@ -27,7 +28,7 @@ class _BaseServicesDiscovery(plugin.DiscoveryBase): class LBPoolsDiscovery(_BaseServicesDiscovery): - + @plugin.check_keystone('network', 'neutron_cli') def discover(self, param=None): """Discover resources to monitor.""" @@ -37,7 +38,7 @@ class LBPoolsDiscovery(_BaseServicesDiscovery): class LBVipsDiscovery(_BaseServicesDiscovery): - + @plugin.check_keystone('network', 'neutron_cli') def discover(self, param=None): """Discover resources to monitor.""" @@ -47,7 +48,7 @@ class LBVipsDiscovery(_BaseServicesDiscovery): class LBMembersDiscovery(_BaseServicesDiscovery): - + @plugin.check_keystone('network', 'neutron_cli') def discover(self, param=None): """Discover resources to monitor.""" @@ -57,7 +58,7 @@ class LBMembersDiscovery(_BaseServicesDiscovery): class LBHealthMonitorsDiscovery(_BaseServicesDiscovery): - + @plugin.check_keystone('network', 'neutron_cli') def discover(self, param=None): """Discover resources to monitor.""" @@ -66,7 +67,7 @@ class LBHealthMonitorsDiscovery(_BaseServicesDiscovery): class VPNServicesDiscovery(_BaseServicesDiscovery): - + @plugin.check_keystone('network', 'neutron_cli') def discover(self, param=None): """Discover resources to monitor.""" @@ -76,7 +77,7 @@ class VPNServicesDiscovery(_BaseServicesDiscovery): class IPSecConnectionsDiscovery(_BaseServicesDiscovery): - + @plugin.check_keystone('network', 'neutron_cli') def discover(self, param=None): """Discover resources to monitor.""" @@ -85,7 +86,7 @@ class IPSecConnectionsDiscovery(_BaseServicesDiscovery): class FirewallDiscovery(_BaseServicesDiscovery): - + @plugin.check_keystone('network', 'neutron_cli') def discover(self, param=None): """Discover resources to monitor.""" @@ -95,7 +96,7 @@ class FirewallDiscovery(_BaseServicesDiscovery): class FirewallPolicyDiscovery(_BaseServicesDiscovery): - + @plugin.check_keystone('network', 'neutron_cli') def discover(self, param=None): """Discover resources to monitor.""" diff --git a/ceilometer/network/services/lbaas.py b/ceilometer/network/services/lbaas.py index 27826226..c30a7b39 100644 --- a/ceilometer/network/services/lbaas.py +++ b/ceilometer/network/services/lbaas.py @@ -19,6 +19,7 @@ import abc import collections import six +from ceilometer.central import plugin from ceilometer.network.services import base from ceilometer.openstack.common.gettextutils import _ from ceilometer.openstack.common import log @@ -228,6 +229,7 @@ class _LBStatsPollster(base.BaseServicesPollster): def _get_sample(pool, c_data): """Return one Sample.""" + @plugin.check_keystone('network', 'nc') def get_samples(self, manager, cache, resources=None): for pool in self._get_lb_pools(): try: diff --git a/ceilometer/objectstore/swift.py b/ceilometer/objectstore/swift.py index 972c6793..49ee2155 100644 --- a/ceilometer/objectstore/swift.py +++ b/ceilometer/objectstore/swift.py @@ -84,7 +84,7 @@ class _Base(plugin.CentralPollster): class ObjectsPollster(_Base): """Iterate over all accounts, using keystone.""" - @plugin.check_keystone + @plugin.check_keystone('object-store') def get_samples(self, manager, cache, resources=None): for tenant, account in self._iter_accounts(manager.keystone, cache): yield sample.Sample( @@ -102,7 +102,7 @@ class ObjectsPollster(_Base): class ObjectsSizePollster(_Base): """Iterate over all accounts, using keystone.""" - @plugin.check_keystone + @plugin.check_keystone('object-store') def get_samples(self, manager, cache, resources=None): for tenant, account in self._iter_accounts(manager.keystone, cache): yield sample.Sample( @@ -120,7 +120,7 @@ class ObjectsSizePollster(_Base): class ObjectsContainersPollster(_Base): """Iterate over all accounts, using keystone.""" - @plugin.check_keystone + @plugin.check_keystone('object-store') def get_samples(self, manager, cache, resources=None): for tenant, account in self._iter_accounts(manager.keystone, cache): yield sample.Sample( @@ -141,7 +141,7 @@ class ContainersObjectsPollster(_Base): METHOD = 'get' - @plugin.check_keystone + @plugin.check_keystone('object-store') def get_samples(self, manager, cache, resources=None): for project, account in self._iter_accounts(manager.keystone, cache): containers_info = account[1] @@ -164,7 +164,7 @@ class ContainersSizePollster(_Base): METHOD = 'get' - @plugin.check_keystone + @plugin.check_keystone('object-store') def get_samples(self, manager, cache, resources=None): for project, account in self._iter_accounts(manager.keystone, cache): containers_info = account[1] diff --git a/ceilometer/tests/image/test_glance.py b/ceilometer/tests/image/test_glance.py index 702fc69b..f96c4720 100644 --- a/ceilometer/tests/image/test_glance.py +++ b/ceilometer/tests/image/test_glance.py @@ -119,6 +119,8 @@ class TestManager(manager.AgentManager): def __init__(self): super(TestManager, self).__init__() self.keystone = mock.Mock() + self.keystone.service_catalog.get_endpoints = mock.Mock( + return_value={'image': mock.ANY}) class TestImagePollsterPageSize(base.BaseTestCase): diff --git a/ceilometer/tests/network/services/test_fwaas.py b/ceilometer/tests/network/services/test_fwaas.py index 904cd648..77f4e95e 100644 --- a/ceilometer/tests/network/services/test_fwaas.py +++ b/ceilometer/tests/network/services/test_fwaas.py @@ -22,6 +22,7 @@ from oslotest import mockpatch from ceilometer.central import manager from ceilometer.network.services import discovery from ceilometer.network.services import fwaas +from ceilometer import neutron_client as cli from ceilometer.openstack.common import context @@ -33,6 +34,9 @@ class _BaseTestFWPollster(base.BaseTestCase): self.addCleanup(mock.patch.stopall) self.context = context.get_admin_context() self.manager = manager.AgentManager() + cli.Client.keystone = mock.Mock() + cli.Client.keystone.service_catalog.get_endpoints = mock.Mock( + return_value={'network': mock.ANY}) class TestFirewallPollster(_BaseTestFWPollster): diff --git a/ceilometer/tests/network/services/test_lbaas.py b/ceilometer/tests/network/services/test_lbaas.py index 6d3cc7fe..3b86c797 100644 --- a/ceilometer/tests/network/services/test_lbaas.py +++ b/ceilometer/tests/network/services/test_lbaas.py @@ -22,6 +22,7 @@ from oslotest import mockpatch from ceilometer.central import manager from ceilometer.network.services import discovery from ceilometer.network.services import lbaas +from ceilometer import neutron_client as cli from ceilometer.openstack.common import context @@ -33,6 +34,9 @@ class _BaseTestLBPollster(base.BaseTestCase): self.addCleanup(mock.patch.stopall) self.context = context.get_admin_context() self.manager = manager.AgentManager() + cli.Client.keystone = mock.Mock() + cli.Client.keystone.service_catalog.get_endpoints = mock.Mock( + return_value={'network': mock.ANY}) class TestLBPoolPollster(_BaseTestLBPollster): diff --git a/ceilometer/tests/network/services/test_vpnaas.py b/ceilometer/tests/network/services/test_vpnaas.py index 32d11186..bce2f35f 100644 --- a/ceilometer/tests/network/services/test_vpnaas.py +++ b/ceilometer/tests/network/services/test_vpnaas.py @@ -22,6 +22,7 @@ from oslotest import mockpatch from ceilometer.central import manager from ceilometer.network.services import discovery from ceilometer.network.services import vpnaas +from ceilometer import neutron_client as cli from ceilometer.openstack.common import context @@ -33,6 +34,9 @@ class _BaseTestVPNPollster(base.BaseTestCase): self.addCleanup(mock.patch.stopall) self.context = context.get_admin_context() self.manager = manager.AgentManager() + cli.Client.keystone = mock.Mock() + cli.Client.keystone.service_catalog.get_endpoints = mock.Mock( + return_value={'network': mock.ANY}) class TestVPNServicesPollster(_BaseTestVPNPollster): diff --git a/ceilometer/tests/network/test_floatingip.py b/ceilometer/tests/network/test_floatingip.py index 471c68ff..022c9a23 100644 --- a/ceilometer/tests/network/test_floatingip.py +++ b/ceilometer/tests/network/test_floatingip.py @@ -35,6 +35,9 @@ class TestFloatingIPPollster(base.BaseTestCase): self.addCleanup(mock.patch.stopall) self.context = context.get_admin_context() self.manager = manager.AgentManager() + self.manager.keystone = mock.Mock() + self.manager.keystone.service_catalog.get_endpoints = mock.Mock( + return_value={'network': mock.ANY}) self.pollster = floatingip.FloatingIPPollster() fake_ips = self.fake_get_ips() patch_virt = mock.patch('ceilometer.nova_client.Client.'