Merge "skip polls if service is not registered"

This commit is contained in:
Jenkins 2014-08-26 14:14:09 +00:00 committed by Gerrit Code Review
commit 4fc82d477b
12 changed files with 70 additions and 32 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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."""

View File

@ -21,6 +21,7 @@ import collections
from oslo.utils import timeutils
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
@ -229,6 +230,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:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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.'