From 591f3f2e34c2bdc654d5a653a163c71417ae4733 Mon Sep 17 00:00:00 2001 From: Josh Gachnang Date: Sun, 20 Jul 2014 10:33:04 -0700 Subject: [PATCH] Improve last_error for async exceptions This sets the last_error to have a more informative message when errors occur in agent vendor asyncronous tasks. Change-Id: I1a0962224c84725329ee834a67dbe9da8c417fb1 --- ironic/drivers/modules/agent_base_vendor.py | 11 ++++++----- ironic/tests/drivers/test_agent_base_vendor.py | 10 ++++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ironic/drivers/modules/agent_base_vendor.py b/ironic/drivers/modules/agent_base_vendor.py index 6f8da217da..65718a7b7f 100644 --- a/ironic/drivers/modules/agent_base_vendor.py +++ b/ironic/drivers/modules/agent_base_vendor.py @@ -164,11 +164,12 @@ class BaseAgentVendor(base.VendorInterface): self.deploy_is_done(task)): msg = _('Node failed to move to active state.') self.reboot_to_instance(task, **kwargs) - except Exception: - LOG.exception(_LE('Async exception for %(node)s: %(msg)s'), - {'node': node.uuid, - 'msg': msg}) - deploy_utils.set_failed_state(task, msg) + except Exception as e: + err_info = {'node': node.uuid, 'msg': msg, 'e': e} + last_error = _('Asynchronous exception for node %(node)s: ' + '%(msg)s exception: %(e)s') % err_info + LOG.exception(last_error) + deploy_utils.set_failed_state(task, last_error) @base.driver_passthru(['POST'], async=False) def lookup(self, context, **kwargs): diff --git a/ironic/tests/drivers/test_agent_base_vendor.py b/ironic/tests/drivers/test_agent_base_vendor.py index ca9addf07d..6eac45828c 100644 --- a/ironic/tests/drivers/test_agent_base_vendor.py +++ b/ironic/tests/drivers/test_agent_base_vendor.py @@ -263,17 +263,23 @@ class TestBaseAgentVendor(db_base.DbTestCase): @mock.patch.object(deploy_utils, 'set_failed_state') @mock.patch.object(agent_base_vendor.BaseAgentVendor, 'deploy_is_done') - def test_heartbeat_deploy_done_fails(self, done_mock, failed_mock): + @mock.patch.object(agent_base_vendor.LOG, 'exception') + def test_heartbeat_deploy_done_fails(self, log_mock, done_mock, + failed_mock): kwargs = { 'agent_url': 'http://127.0.0.1:9999/bar' } - done_mock.side_effect = Exception + done_mock.side_effect = Exception('LlamaException') with task_manager.acquire( self.context, self.node['uuid'], shared=True) as task: task.node.provision_state = states.DEPLOYING task.node.target_provision_state = states.ACTIVE self.passthru.heartbeat(task, **kwargs) failed_mock.assert_called_once_with(task, mock.ANY) + log_mock.assert_called_once_with( + 'Asynchronous exception for node ' + '1be26c0b-03f2-4d2e-ae87-c02d7f33c123: Failed checking if deploy ' + 'is done. exception: LlamaException') def test_vendor_passthru_vendor_routes(self): expected = ['heartbeat']