From 36cbefefe9f6ebed6733c92eaed85885c4360fd9 Mon Sep 17 00:00:00 2001 From: Anton Arefiev Date: Mon, 21 Sep 2015 11:16:58 +0300 Subject: [PATCH] Fix conductor deregistration on non init conductor Conductor deregistration fails if called on non initialized conductor, e.g. when AMQP server is unreachable, it raise Attribute error. Change-Id: Ic550d840b69676c619ddcb7ec550b9e6c3b28ac0 Closes-Bug: 1496017 --- ironic/conductor/manager.py | 4 ++++ ironic/tests/unit/conductor/test_manager.py | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py index ed5c1c090c..fc80bdeaae 100644 --- a/ironic/conductor/manager.py +++ b/ironic/conductor/manager.py @@ -327,6 +327,10 @@ class ConductorManager(periodic_task.PeriodicTasks): self.add_periodic_task(method) def del_host(self, deregister=True): + # Conductor deregistration fails if called on non-initialized + # conductor (e.g. when rpc server is unreachable). + if not hasattr(self, 'conductor'): + return self._keepalive_evt.set() if deregister: try: diff --git a/ironic/tests/unit/conductor/test_manager.py b/ironic/tests/unit/conductor/test_manager.py index 5ad9dbbe36..a0b31d8e14 100644 --- a/ironic/tests/unit/conductor/test_manager.py +++ b/ironic/tests/unit/conductor/test_manager.py @@ -211,6 +211,11 @@ class StartStopTestCase(_ServiceSetUpMixin, tests_db_base.DbTestCase): res = objects.Conductor.get_by_hostname(self.context, self.hostname) self.assertEqual(self.hostname, res['hostname']) + @mock.patch.object(manager.ConductorManager, 'init_host') + def test_stop_uninitialized_conductor(self, mock_init): + self._start_service() + self.service.del_host() + @mock.patch.object(driver_factory.DriverFactory, '__getitem__', lambda *args: mock.MagicMock()) def test_start_registers_driver_names(self):