diff --git a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py index 0663d5bf4a1..a3e4d2ffa89 100644 --- a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py +++ b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py @@ -1405,13 +1405,12 @@ class OVNClient(object): txn.add(self._nb_idl.update_lrouter(router_name, **update)) # Check for route updates - routes = new_router.get('routes') - if routes: - old_routes = utils.get_lrouter_non_gw_routes(ovn_router) - added, removed = helpers.diff_list_of_dict( - old_routes, routes) - self.update_router_routes( - admin_context, router_id, added, removed, txn=txn) + routes = new_router.get('routes', []) + old_routes = utils.get_lrouter_non_gw_routes(ovn_router) + added, removed = helpers.diff_list_of_dict( + old_routes, routes) + self.update_router_routes( + admin_context, router_id, added, removed, txn=txn) if check_rev_cmd.result == ovn_const.TXN_COMMITTED: db_rev.bump_revision(admin_context, new_router, diff --git a/neutron/tests/unit/services/ovn_l3/test_plugin.py b/neutron/tests/unit/services/ovn_l3/test_plugin.py index f89210e4025..ed5030f823a 100644 --- a/neutron/tests/unit/services/ovn_l3/test_plugin.py +++ b/neutron/tests/unit/services/ovn_l3/test_plugin.py @@ -464,6 +464,35 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase): 'neutron-router-id', ip_prefix='1.1.1.0/24', nexthop='10.0.0.2') + @mock.patch.object(utils, 'get_lrouter_non_gw_routes') + @mock.patch('neutron.db.extraroute_db.ExtraRoute_dbonly_mixin.' + 'update_router') + @mock.patch('neutron.db.l3_db.L3_NAT_dbonly_mixin.get_router') + @mock.patch('neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.' + 'ovn_client.OVNClient._get_v4_network_of_all_router_ports') + def test_update_router_static_route_clear(self, get_rps, get_r, func, + mock_routes): + router_id = 'router-id' + get_rps.return_value = [{'device_id': '', + 'device_owner': 'network:router_interface', + 'mac_address': 'aa:aa:aa:aa:aa:aa', + 'fixed_ips': [{'ip_address': '10.0.0.100', + 'subnet_id': 'subnet-id'}], + 'id': 'router-port-id'}] + + mock_routes.return_value = self.fake_router['routes'] + get_r.return_value = self.fake_router + new_router = self.fake_router.copy() + updated_data = {'routes': []} + new_router.update(updated_data) + func.return_value = new_router + self.l3_inst.update_router(self.context, router_id, + {'router': updated_data}) + self.l3_inst._ovn.add_static_route.assert_not_called() + self.l3_inst._ovn.delete_static_route.assert_called_once_with( + 'neutron-router-id', + ip_prefix='1.1.1.0/24', nexthop='10.0.0.2') + @mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.get_port') @mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.get_subnet') @mock.patch('neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.'