diff --git a/ceilometer/central/plugin.py b/ceilometer/central/plugin.py index 60e9b7f8..3ca83370 100644 --- a/ceilometer/central/plugin.py +++ b/ceilometer/central/plugin.py @@ -16,11 +16,15 @@ # under the License. """Base class for plugins used by the central agent. """ +from keystoneclient.v2_0 import client as ksclient +from oslo.config import cfg from ceilometer.openstack.common.gettextutils import _ from ceilometer.openstack.common import log from ceilometer import plugin +cfg.CONF.import_group('service_credentials', 'ceilometer.service') + LOG = log.getLogger(__name__) @@ -28,32 +32,46 @@ class CentralPollster(plugin.PollsterBase): """Base class for plugins that support the polling API.""" -def check_keystone(service_type=None, client=None): +def _get_keystone(): + try: + return ksclient.Client( + username=cfg.CONF.service_credentials.os_username, + password=cfg.CONF.service_credentials.os_password, + tenant_id=cfg.CONF.service_credentials.os_tenant_id, + tenant_name=cfg.CONF.service_credentials.os_tenant_name, + cacert=cfg.CONF.service_credentials.os_cacert, + auth_url=cfg.CONF.service_credentials.os_auth_url, + region_name=cfg.CONF.service_credentials.os_region_name, + insecure=cfg.CONF.service_credentials.insecure) + except Exception as e: + return e + + +def check_keystone(service_type=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') + 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): + if not keystone: + keystone = _get_keystone() + if 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')) + endpoints = keystone.service_catalog.get_endpoints( + service_type=service_type) + if not endpoints: + LOG.warning(_('Skipping because %s service is not ' + 'registered in keystone') % service_type) return iter([]) return f(self, *args, **kwargs) return func diff --git a/ceilometer/network/services/discovery.py b/ceilometer/network/services/discovery.py index d16dc6b9..710a9f04 100644 --- a/ceilometer/network/services/discovery.py +++ b/ceilometer/network/services/discovery.py @@ -28,7 +28,7 @@ class _BaseServicesDiscovery(base_plugin.DiscoveryBase): class LBPoolsDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network', 'neutron_cli') + @plugin.check_keystone('network') def discover(self, param=None): """Discover resources to monitor.""" @@ -38,7 +38,7 @@ class LBPoolsDiscovery(_BaseServicesDiscovery): class LBVipsDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network', 'neutron_cli') + @plugin.check_keystone('network') def discover(self, param=None): """Discover resources to monitor.""" @@ -48,7 +48,7 @@ class LBVipsDiscovery(_BaseServicesDiscovery): class LBMembersDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network', 'neutron_cli') + @plugin.check_keystone('network') def discover(self, param=None): """Discover resources to monitor.""" @@ -58,7 +58,7 @@ class LBMembersDiscovery(_BaseServicesDiscovery): class LBHealthMonitorsDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network', 'neutron_cli') + @plugin.check_keystone('network') def discover(self, param=None): """Discover resources to monitor.""" @@ -67,7 +67,7 @@ class LBHealthMonitorsDiscovery(_BaseServicesDiscovery): class VPNServicesDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network', 'neutron_cli') + @plugin.check_keystone('network') def discover(self, param=None): """Discover resources to monitor.""" @@ -77,7 +77,7 @@ class VPNServicesDiscovery(_BaseServicesDiscovery): class IPSecConnectionsDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network', 'neutron_cli') + @plugin.check_keystone('network') def discover(self, param=None): """Discover resources to monitor.""" @@ -86,7 +86,7 @@ class IPSecConnectionsDiscovery(_BaseServicesDiscovery): class FirewallDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network', 'neutron_cli') + @plugin.check_keystone('network') def discover(self, param=None): """Discover resources to monitor.""" @@ -96,7 +96,7 @@ class FirewallDiscovery(_BaseServicesDiscovery): class FirewallPolicyDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network', 'neutron_cli') + @plugin.check_keystone('network') def discover(self, param=None): """Discover resources to monitor.""" diff --git a/ceilometer/tests/network/services/test_fwaas.py b/ceilometer/tests/network/services/test_fwaas.py index 77f4e95e..ee2ad86f 100644 --- a/ceilometer/tests/network/services/test_fwaas.py +++ b/ceilometer/tests/network/services/test_fwaas.py @@ -20,9 +20,9 @@ from oslotest import base from oslotest import mockpatch from ceilometer.central import manager +from ceilometer.central import plugin 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 @@ -34,8 +34,8 @@ 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( + plugin._get_keystone = mock.Mock() + plugin._get_keystone.service_catalog.get_endpoints = mock.MagicMock( return_value={'network': mock.ANY}) diff --git a/ceilometer/tests/network/services/test_lbaas.py b/ceilometer/tests/network/services/test_lbaas.py index 7e1def53..60322e56 100644 --- a/ceilometer/tests/network/services/test_lbaas.py +++ b/ceilometer/tests/network/services/test_lbaas.py @@ -20,9 +20,9 @@ from oslotest import base from oslotest import mockpatch from ceilometer.central import manager +from ceilometer.central import plugin 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 @@ -34,8 +34,8 @@ 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( + plugin._get_keystone = mock.Mock() + plugin._get_keystone.service_catalog.get_endpoints = mock.MagicMock( return_value={'network': mock.ANY}) diff --git a/ceilometer/tests/network/services/test_vpnaas.py b/ceilometer/tests/network/services/test_vpnaas.py index bce2f35f..228da739 100644 --- a/ceilometer/tests/network/services/test_vpnaas.py +++ b/ceilometer/tests/network/services/test_vpnaas.py @@ -20,9 +20,9 @@ from oslotest import base from oslotest import mockpatch from ceilometer.central import manager +from ceilometer.central import plugin 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 @@ -34,8 +34,8 @@ 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( + plugin._get_keystone = mock.Mock() + plugin._get_keystone.service_catalog.get_endpoints = mock.MagicMock( return_value={'network': mock.ANY})