From f552a3003862839abc3fb2d87e89de3b88e384d7 Mon Sep 17 00:00:00 2001 From: Adam Harwell Date: Wed, 7 Nov 2018 12:14:07 -0800 Subject: [PATCH] Fix possible state machine hole in failover Change-Id: I5c68791c48b0f6766439560bca1cb6b0e61360be --- octavia/controller/worker/controller_worker.py | 6 ++++++ .../tests/unit/controller/worker/test_controller_worker.py | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/octavia/controller/worker/controller_worker.py b/octavia/controller/worker/controller_worker.py index 835378ab48..56b82b2f4c 100644 --- a/octavia/controller/worker/controller_worker.py +++ b/octavia/controller/worker/controller_worker.py @@ -867,6 +867,12 @@ class ControllerWorker(base_taskflow.BaseTaskFlowEngine): db_apis.get_session(), amp.load_balancer_id, provisioning_status=constants.ACTIVE) except Exception as e: + try: + self._lb_repo.update( + db_apis.get_session(), amp.load_balancer_id, + provisioning_status=constants.ERROR) + except Exception: + LOG.error("Unable to revert LB status to ERROR.") with excutils.save_and_reraise_exception(): LOG.error("Failover exception: %s", e) diff --git a/octavia/tests/unit/controller/worker/test_controller_worker.py b/octavia/tests/unit/controller/worker/test_controller_worker.py index 3e81ad1e3d..a3027dc671 100644 --- a/octavia/tests/unit/controller/worker/test_controller_worker.py +++ b/octavia/tests/unit/controller/worker/test_controller_worker.py @@ -1197,7 +1197,9 @@ class TestControllerWorker(base.TestCase): @mock.patch('octavia.controller.worker.controller_worker.ControllerWorker.' '_perform_amphora_failover') + @mock.patch('octavia.db.repositories.LoadBalancerRepository.update') def test_failover_amp_flow_exception(self, + mock_update, mock_perform_amp_failover, mock_api_get_session, mock_dyn_log_listener, @@ -1214,6 +1216,8 @@ class TestControllerWorker(base.TestCase): mock_perform_amp_failover.side_effect = TestException('boom') cw = controller_worker.ControllerWorker() self.assertRaises(TestException, cw.failover_amphora, AMP_ID) + mock_update.assert_called_with(_db_session, LB_ID, + provisioning_status=constants.ERROR) @mock.patch('octavia.controller.worker.controller_worker.ControllerWorker.' '_perform_amphora_failover')