Skip central agent interval_task when keystone fails

There is a chance when ceilometer-agent-central try to trigger interval_task
but keystone is not available, then an exception is raised but not caught, the
outside oslo.loopingcall will stop calling the task function, finally leading
to the agent-central service is no longer available forever, even the keystone
is available again.

We can skip the particular interval_task when keystone is not available.

Change-Id: I0849cafadac8fb8a7670aaa4cc76dc708bdb25a1
Closes-Bug: #1287613
This commit is contained in:
ZhiQiang Fan 2014-03-05 10:58:59 +08:00
parent bf2a745a32
commit ffff1cb132
2 changed files with 23 additions and 9 deletions

View File

@ -20,6 +20,7 @@ from keystoneclient.v2_0 import client as ksclient
from oslo.config import cfg
from ceilometer import agent
from ceilometer.openstack.common.gettextutils import _ # noqa
from ceilometer.openstack.common import log
from ceilometer.openstack.common import service as os_service
from ceilometer import service
@ -35,15 +36,19 @@ class AgentManager(agent.AgentManager):
super(AgentManager, self).__init__('central')
def interval_task(self, task):
self.keystone = 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)
try:
self.keystone = 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:
LOG.error(_('Skip interval_task because Keystone error: %s'), e)
return
super(AgentManager, self).interval_task(task)

View File

@ -50,3 +50,12 @@ class TestRunTasks(agentbase.BaseAgentManagerTestCase):
polling_tasks = self.mgr.setup_polling_tasks()
self.mgr.interval_task(polling_tasks.values()[0])
self.assertTrue(self.Pollster.resources)
def test_skip_task_when_keystone_fail(self):
"""Test for https://bugs.launchpad.net/ceilometer/+bug/1287613."""
self.useFixture(mockpatch.Patch(
'keystoneclient.v2_0.client.Client',
side_effect=Exception))
polling_tasks = self.mgr.setup_polling_tasks()
self.mgr.interval_task(polling_tasks.values()[0])
self.assertFalse(self.Pollster.samples)