From 72d65777962a2b93e80f7e17ce6602caa6a79bed Mon Sep 17 00:00:00 2001 From: Hisashi Osanai Date: Fri, 8 Aug 2014 14:30:43 +0900 Subject: [PATCH] Enable to get service types from configuration file When services are registered to keystone without using default service types, pollsters for the services don't work. This fix enables the pollsters to get service types from ceilometer.conf. If there is no entry in the file, the default service types will be used. Change-Id: Iab30b6e749f5d2af4ecb0bbf6fe1a137793f4c2c Closes-Bug: 1353356 DocImpact: Add new parameters in ceilometer.conf --- ceilometer/energy/kwapi.py | 12 +++++++++++- ceilometer/image/glance.py | 9 ++++++++- ceilometer/network/floatingip.py | 7 ++++++- ceilometer/network/services/discovery.py | 21 +++++++++++++-------- ceilometer/neutron_client.py | 11 ++++++++++- ceilometer/nova_client.py | 11 +++++++++++ ceilometer/objectstore/swift.py | 16 +++++++++++----- ceilometer/tests/energy/test_kwapi.py | 8 ++++++++ ceilometer/tests/image/test_glance.py | 4 ++++ ceilometer/tests/network/test_floatingip.py | 3 +++ doc/source/configuration.rst | 17 +++++++++++++++++ 11 files changed, 102 insertions(+), 17 deletions(-) diff --git a/ceilometer/energy/kwapi.py b/ceilometer/energy/kwapi.py index a77f3f4912..8eb9a33303 100644 --- a/ceilometer/energy/kwapi.py +++ b/ceilometer/energy/kwapi.py @@ -17,6 +17,7 @@ import datetime from keystoneclient import exceptions +from oslo.config import cfg import requests import six @@ -25,8 +26,17 @@ from ceilometer.openstack.common.gettextutils import _ from ceilometer.openstack.common import log from ceilometer import sample + LOG = log.getLogger(__name__) +service_types_opts = [ + cfg.StrOpt('kwapi', + default='energy', + help='Kwapi service type.'), +] + +cfg.CONF.register_opts(service_types_opts, group='service_types') + class KwapiClient(object): """Kwapi API client.""" @@ -56,7 +66,7 @@ class _Base(plugin.CentralPollster): @property def default_discovery(self): - return 'endpoint:energy' + return 'endpoint:%s' % cfg.CONF.service_types.kwapi @staticmethod def get_kwapi_client(ksclient, endpoint): diff --git a/ceilometer/image/glance.py b/ceilometer/image/glance.py index 4868afd813..d444f4894f 100644 --- a/ceilometer/image/glance.py +++ b/ceilometer/image/glance.py @@ -39,14 +39,21 @@ OPTS = [ "(default value in glanceclient is used)."), ] +service_types_opts = [ + cfg.StrOpt('glance', + default='image', + help='Glance service type.'), +] + cfg.CONF.register_opts(OPTS) +cfg.CONF.register_opts(service_types_opts, group='service_types') class _Base(plugin.CentralPollster): @property def default_discovery(self): - return 'endpoint:image' + return 'endpoint:%s' % cfg.CONF.service_types.glance @staticmethod def get_glance_client(ksclient, endpoint): diff --git a/ceilometer/network/floatingip.py b/ceilometer/network/floatingip.py index 4ea1c67deb..132e0fe701 100644 --- a/ceilometer/network/floatingip.py +++ b/ceilometer/network/floatingip.py @@ -17,6 +17,8 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. + +from oslo.config import cfg from oslo.utils import timeutils from ceilometer.central import plugin @@ -25,8 +27,11 @@ from ceilometer.openstack.common.gettextutils import _ from ceilometer.openstack.common import log from ceilometer import sample + LOG = log.getLogger(__name__) +cfg.CONF.import_group('service_types', 'ceilometer.nova_client') + class FloatingIPPollster(plugin.CentralPollster): @@ -43,7 +48,7 @@ class FloatingIPPollster(plugin.CentralPollster): @property def default_discovery(self): - return 'endpoint:compute' + return 'endpoint:%s' % cfg.CONF.service_types.nova def get_samples(self, manager, cache, resources): for endpoint in resources: diff --git a/ceilometer/network/services/discovery.py b/ceilometer/network/services/discovery.py index 87e646ded8..55df01f593 100644 --- a/ceilometer/network/services/discovery.py +++ b/ceilometer/network/services/discovery.py @@ -15,11 +15,16 @@ # License for the specific language governing permissions and limitations # under the License. +from oslo.config import cfg + from ceilometer.central import plugin from ceilometer import neutron_client from ceilometer import plugin as base_plugin +cfg.CONF.import_group('service_types', 'ceilometer.neutron_client') + + class _BaseServicesDiscovery(base_plugin.DiscoveryBase): def __init__(self): @@ -28,7 +33,7 @@ class _BaseServicesDiscovery(base_plugin.DiscoveryBase): class LBPoolsDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network') + @plugin.check_keystone(cfg.CONF.service_types.neutron) def discover(self, manager, param=None): """Discover resources to monitor.""" @@ -38,7 +43,7 @@ class LBPoolsDiscovery(_BaseServicesDiscovery): class LBVipsDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network') + @plugin.check_keystone(cfg.CONF.service_types.neutron) def discover(self, manager, param=None): """Discover resources to monitor.""" @@ -48,7 +53,7 @@ class LBVipsDiscovery(_BaseServicesDiscovery): class LBMembersDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network') + @plugin.check_keystone(cfg.CONF.service_types.neutron) def discover(self, manager, param=None): """Discover resources to monitor.""" @@ -58,7 +63,7 @@ class LBMembersDiscovery(_BaseServicesDiscovery): class LBHealthMonitorsDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network') + @plugin.check_keystone(cfg.CONF.service_types.neutron) def discover(self, manager, param=None): """Discover resources to monitor.""" @@ -67,7 +72,7 @@ class LBHealthMonitorsDiscovery(_BaseServicesDiscovery): class VPNServicesDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network') + @plugin.check_keystone(cfg.CONF.service_types.neutron) def discover(self, manager, param=None): """Discover resources to monitor.""" @@ -77,7 +82,7 @@ class VPNServicesDiscovery(_BaseServicesDiscovery): class IPSecConnectionsDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network') + @plugin.check_keystone(cfg.CONF.service_types.neutron) def discover(self, manager, param=None): """Discover resources to monitor.""" @@ -86,7 +91,7 @@ class IPSecConnectionsDiscovery(_BaseServicesDiscovery): class FirewallDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network') + @plugin.check_keystone(cfg.CONF.service_types.neutron) def discover(self, manager, param=None): """Discover resources to monitor.""" @@ -96,7 +101,7 @@ class FirewallDiscovery(_BaseServicesDiscovery): class FirewallPolicyDiscovery(_BaseServicesDiscovery): - @plugin.check_keystone('network') + @plugin.check_keystone(cfg.CONF.service_types.neutron) def discover(self, manager, param=None): """Discover resources to monitor.""" diff --git a/ceilometer/neutron_client.py b/ceilometer/neutron_client.py index 4c73b0e4f6..930d7eabfd 100644 --- a/ceilometer/neutron_client.py +++ b/ceilometer/neutron_client.py @@ -21,6 +21,14 @@ from oslo.config import cfg from ceilometer.openstack.common import log + +service_types_opts = [ + cfg.StrOpt('neutron', + default='network', + help='Neutron service type.'), +] + +cfg.CONF.register_opts(service_types_opts, group='service_types') cfg.CONF.import_group('service_credentials', 'ceilometer.service') LOG = log.getLogger(__name__) @@ -51,7 +59,8 @@ class Client(object): 'password': conf.os_password, 'auth_url': conf.os_auth_url, 'region_name': conf.os_region_name, - 'endpoint_type': conf.os_endpoint_type + 'endpoint_type': conf.os_endpoint_type, + 'service_type': cfg.CONF.service_types.neutron } if conf.os_tenant_id: diff --git a/ceilometer/nova_client.py b/ceilometer/nova_client.py index e6a3c84511..41d37bebeb 100644 --- a/ceilometer/nova_client.py +++ b/ceilometer/nova_client.py @@ -21,12 +21,22 @@ from oslo.config import cfg from ceilometer.openstack.common import log + nova_opts = [ cfg.BoolOpt('nova_http_log_debug', default=False, help='Allow novaclient\'s debug log output.'), ] + +service_types_opts = [ + cfg.StrOpt('nova', + default='compute', + help='Nova service type.'), +] + cfg.CONF.register_opts(nova_opts) +cfg.CONF.register_opts(service_types_opts, group='service_types') + cfg.CONF.import_group('service_credentials', 'ceilometer.service') LOG = log.getLogger(__name__) @@ -60,6 +70,7 @@ class Client(object): auth_token=auth_token, region_name=conf.os_region_name, endpoint_type=conf.os_endpoint_type, + service_type=cfg.CONF.service_types.nova, bypass_url=bypass_url, cacert=conf.os_cacert, insecure=conf.insecure, diff --git a/ceilometer/objectstore/swift.py b/ceilometer/objectstore/swift.py index d87f99547f..2708fd927c 100644 --- a/ceilometer/objectstore/swift.py +++ b/ceilometer/objectstore/swift.py @@ -40,7 +40,14 @@ OPTS = [ "reseller_prefix in proxy-server.conf."), ] +service_types_opts = [ + cfg.StrOpt('swift', + default='object-store', + help='Swift service type.'), +] + cfg.CONF.register_opts(OPTS) +cfg.CONF.register_opts(service_types_opts, group='service_types') class _Base(plugin.CentralPollster): @@ -62,11 +69,10 @@ class _Base(plugin.CentralPollster): # only ever called once if _Base._ENDPOINT is None: try: - endpoint_type = cfg.CONF.service_credentials.os_endpoint_type - endpoint = ksclient.service_catalog.url_for( - service_type='object-store', - endpoint_type=endpoint_type) - _Base._ENDPOINT = endpoint + conf = cfg.CONF.service_credentials + _Base._ENDPOINT = ksclient.service_catalog.url_for( + service_type=cfg.CONF.service_types.swift, + endpoint_type=conf.os_endpoint_type) except exceptions.EndpointNotFound: LOG.debug(_("Swift endpoint not found")) return _Base._ENDPOINT diff --git a/ceilometer/tests/energy/test_kwapi.py b/ceilometer/tests/energy/test_kwapi.py index f659e30de6..4e5dd4705b 100644 --- a/ceilometer/tests/energy/test_kwapi.py +++ b/ceilometer/tests/energy/test_kwapi.py @@ -98,6 +98,10 @@ class TestEnergyPollster(base.BaseTestCase): probe_dict['id'] = key yield probe_dict + def test_default_discovery(self): + pollster = kwapi.EnergyPollster() + self.assertEqual('endpoint:energy', pollster.default_discovery) + def test_sample(self): cache = {} samples = list(kwapi.EnergyPollster().get_samples( @@ -161,6 +165,10 @@ class TestPowerPollster(base.BaseTestCase): probe_dict['id'] = key yield probe_dict + def test_default_discovery(self): + pollster = kwapi.PowerPollster() + self.assertEqual('endpoint:energy', pollster.default_discovery) + def test_sample(self): cache = {} samples = list(kwapi.PowerPollster().get_samples( diff --git a/ceilometer/tests/image/test_glance.py b/ceilometer/tests/image/test_glance.py index 6f60311b63..f5bd398fa5 100644 --- a/ceilometer/tests/image/test_glance.py +++ b/ceilometer/tests/image/test_glance.py @@ -181,6 +181,10 @@ class TestImagePollster(base.BaseTestCase): glance._Base, 'get_glance_client', side_effect=self.fake_get_glance_client)) + def test_default_discovery(self): + pollster = glance.ImagePollster() + self.assertEqual('endpoint:image', pollster.default_discovery) + def test_iter_images(self): # Tests whether the iter_images method returns a unique image # list when there is nothing in the cache diff --git a/ceilometer/tests/network/test_floatingip.py b/ceilometer/tests/network/test_floatingip.py index 29fbfb5acd..3248b16435 100644 --- a/ceilometer/tests/network/test_floatingip.py +++ b/ceilometer/tests/network/test_floatingip.py @@ -56,6 +56,9 @@ class TestFloatingIPPollster(base.BaseTestCase): ips.append(ip) return ips + def test_default_discovery(self): + self.assertEqual('endpoint:compute', self.pollster.default_discovery) + # FIXME(dhellmann): Is there a useful way to define this # test without a database? # diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index 736adb1f72..464aa96fb5 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -67,6 +67,23 @@ pecan_debug The value of DEFAULT.debug Toggle Pe processes with mod_wsgi. =============================== ==================================== =============================================================== +Service polling configuration +============================== + +The following options must be placed under a [service_types] section +and will be used by Ceilometer to retrieve information from OpenStack +components. + +=============================== ==================================== ============================================================== +Parameter Default Note +=============================== ==================================== ============================================================== +nova compute The service type for nova +neutron network The service type for neutron +glance image The service type for glance +swift object-store The service type for swift +kwapi energy The service type for kwapi +=============================== ==================================== ============================================================== + Service polling authentication ==============================