diff --git a/octavia/controller/worker/controller_worker.py b/octavia/controller/worker/controller_worker.py index 9b4d632f93..3003bdfa6e 100644 --- a/octavia/controller/worker/controller_worker.py +++ b/octavia/controller/worker/controller_worker.py @@ -622,15 +622,25 @@ class ControllerWorker(base_taskflow.BaseTaskFlowEngine): try: amp = self._amphora_repo.get(db_apis.get_session(), id=amphora_id) + stored_params = {constants.FAILED_AMPHORA: amp, + constants.LOADBALANCER_ID: amp.load_balancer_id, + constants.BUILD_TYPE_PRIORITY: + constants.LB_CREATE_FAILOVER_PRIORITY} + + # if we run with anti-affinity we need to set the server group + # as well + if CONF.nova.enable_anti_affinity: + lb = self._amphora_repo.get_all_lbs_on_amphora( + db_apis.get_session(), amp.id) + if lb: + stored_params[constants.SERVER_GROUP_ID] = ( + lb[0].server_group_id) failover_amphora_tf = self._taskflow_load( - self._amphora_flows.get_failover_flow(role=amp.role, - status=amp.status), - store={constants.FAILED_AMPHORA: amp, - constants.LOADBALANCER_ID: amp.load_balancer_id, - constants.BUILD_TYPE_PRIORITY: - constants.LB_CREATE_FAILOVER_PRIORITY - }) + self._amphora_flows.get_failover_flow( + role=amp.role, + status=amp.status), + store=stored_params) with tf_logging.DynamicLoggingListener( failover_amphora_tf, log=LOG, hide_inputs_outputs_of=self._exclude_result_logging_tasks): diff --git a/octavia/tests/unit/controller/worker/test_controller_worker.py b/octavia/tests/unit/controller/worker/test_controller_worker.py index 5287a9d552..acd8fe914c 100644 --- a/octavia/tests/unit/controller/worker/test_controller_worker.py +++ b/octavia/tests/unit/controller/worker/test_controller_worker.py @@ -1095,6 +1095,47 @@ class TestControllerWorker(base.TestCase): _flow_mock.run.assert_called_once_with() + @mock.patch('octavia.controller.worker.flows.' + 'amphora_flows.AmphoraFlows.get_failover_flow', + return_value=_flow_mock) + @mock.patch( + 'octavia.db.repositories.AmphoraRepository.get_all_lbs_on_amphora', + return_value=[_load_balancer_mock]) + def test_failover_amphora_anti_affinity(self, + mock_get_update_listener_flow, + mock_get_all_lbs_for_amp_mock, + mock_api_get_session, + mock_dyn_log_listener, + mock_taskflow_load, + mock_pool_repo_get, + mock_member_repo_get, + mock_l7rule_repo_get, + mock_l7policy_repo_get, + mock_listener_repo_get, + mock_lb_repo_get, + mock_health_mon_repo_get, + mock_amp_repo_get): + + self.conf.config(group="nova", enable_anti_affinity=True) + _flow_mock.reset_mock() + _load_balancer_mock.server_group_id = "123" + + cw = controller_worker.ControllerWorker() + cw.failover_amphora(AMP_ID) + + (base_taskflow.BaseTaskFlowEngine._taskflow_load. + assert_called_once_with( + _flow_mock, + store={constants.FAILED_AMPHORA: _amphora_mock, + constants.LOADBALANCER_ID: + _amphora_mock.load_balancer_id, + constants.BUILD_TYPE_PRIORITY: + constants.LB_CREATE_FAILOVER_PRIORITY, + constants.SERVER_GROUP_ID: "123", + })) + + _flow_mock.run.assert_called_once_with() + @mock.patch('octavia.controller.worker.flows.' 'amphora_flows.AmphoraFlows.cert_rotate_amphora_flow', return_value=_flow_mock)