skip polls if service is not registered
currently, when any pollster runs against a service that is not registered in Keystone, it will throw an exception. we should catch and skip these polls Change-Id: I2b582b22a44182ab31d44ce459cc6d642cc3719d Closes-Bug: #1337293
This commit is contained in:
parent
1bd4a3fb41
commit
6298be5044
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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(
|
||||
|
@ -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)
|
||||
|
@ -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."""
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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]
|
||||
|
@ -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):
|
||||
|
@ -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):
|
||||
|
@ -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):
|
||||
|
@ -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):
|
||||
|
@ -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.'
|
||||
|
Loading…
Reference in New Issue
Block a user