Merge "Delete MAC binding for LRP when the port is deleted"
This commit is contained in:
commit
4ceb9ed818
|
@ -32,10 +32,12 @@ from neutron_lib.plugins import directory
|
||||||
from neutron_lib.plugins import utils as p_utils
|
from neutron_lib.plugins import utils as p_utils
|
||||||
from neutron_lib.utils import helpers
|
from neutron_lib.utils import helpers
|
||||||
from neutron_lib.utils import net as n_net
|
from neutron_lib.utils import net as n_net
|
||||||
|
from oslo_concurrency import processutils
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
from oslo_utils import excutils
|
from oslo_utils import excutils
|
||||||
from ovsdbapp.backend.ovs_idl import idlutils
|
from ovsdbapp.backend.ovs_idl import idlutils
|
||||||
|
import tenacity
|
||||||
|
|
||||||
from neutron.common.ovn import acl as ovn_acl
|
from neutron.common.ovn import acl as ovn_acl
|
||||||
from neutron.common.ovn import constants as ovn_const
|
from neutron.common.ovn import constants as ovn_const
|
||||||
|
@ -1561,6 +1563,26 @@ class OVNClient(object):
|
||||||
db_rev.bump_revision(
|
db_rev.bump_revision(
|
||||||
context, port, ovn_const.TYPE_ROUTER_PORTS)
|
context, port, ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
|
@tenacity.retry(wait=tenacity.wait_random(min=2, max=3),
|
||||||
|
stop=tenacity.stop_after_attempt(3))
|
||||||
|
def delete_mac_binding_entries_by_mac(self, mac):
|
||||||
|
"""Delete all MAC_Binding entries associated to this mac address
|
||||||
|
|
||||||
|
The reason for using ovsdb-client intead of sb_ovn.db_destroy
|
||||||
|
is refer to patch:
|
||||||
|
https://review.opendev.org/c/openstack/neutron/+/812805
|
||||||
|
"""
|
||||||
|
cmd = ['ovsdb-client', 'transact', ovn_conf.get_ovn_sb_connection(),
|
||||||
|
'--timeout', str(ovn_conf.get_ovn_ovsdb_timeout())]
|
||||||
|
if ovn_conf.get_ovn_sb_private_key():
|
||||||
|
cmd += ['-p', ovn_conf.get_ovn_sb_private_key(), '-c',
|
||||||
|
ovn_conf.get_ovn_sb_certificate(), '-C',
|
||||||
|
ovn_conf.get_ovn_sb_ca_cert()]
|
||||||
|
cmd += ['["OVN_Southbound", {"op": "delete", "table": "MAC_Binding", '
|
||||||
|
'"where": [["mac", "==", "%s"]]}]' % mac]
|
||||||
|
return processutils.execute(*cmd,
|
||||||
|
log_errors=processutils.LOG_FINAL_ERROR)
|
||||||
|
|
||||||
def _delete_lrouter_port(self, context, port_id, router_id=None, txn=None):
|
def _delete_lrouter_port(self, context, port_id, router_id=None, txn=None):
|
||||||
"""Delete a logical router port."""
|
"""Delete a logical router port."""
|
||||||
commands = [self._nb_idl.lrp_del(
|
commands = [self._nb_idl.lrp_del(
|
||||||
|
@ -1580,6 +1602,7 @@ class OVNClient(object):
|
||||||
|
|
||||||
subnet_ids = subnet_ids or []
|
subnet_ids = subnet_ids or []
|
||||||
port_removed = False
|
port_removed = False
|
||||||
|
port_mac = ovn_port.mac
|
||||||
with self._nb_idl.transaction(check_error=True) as txn:
|
with self._nb_idl.transaction(check_error=True) as txn:
|
||||||
port = None
|
port = None
|
||||||
try:
|
try:
|
||||||
|
@ -1610,6 +1633,8 @@ class OVNClient(object):
|
||||||
if port_removed:
|
if port_removed:
|
||||||
self._delete_lrouter_port(context, port_id, router_id,
|
self._delete_lrouter_port(context, port_id, router_id,
|
||||||
txn=txn)
|
txn=txn)
|
||||||
|
if port_mac:
|
||||||
|
self.delete_mac_binding_entries_by_mac(port_mac)
|
||||||
return
|
return
|
||||||
|
|
||||||
if not subnet_ids:
|
if not subnet_ids:
|
||||||
|
@ -1644,6 +1669,8 @@ class OVNClient(object):
|
||||||
# revision database to ensure consistency
|
# revision database to ensure consistency
|
||||||
if port_removed:
|
if port_removed:
|
||||||
self._delete_lrouter_port(context, port_id, router_id, txn=txn)
|
self._delete_lrouter_port(context, port_id, router_id, txn=txn)
|
||||||
|
if port_mac:
|
||||||
|
self.delete_mac_binding_entries_by_mac(port_mac)
|
||||||
else:
|
else:
|
||||||
# otherwise, we just update the revision database
|
# otherwise, we just update the revision database
|
||||||
db_rev.bump_revision(
|
db_rev.bump_revision(
|
||||||
|
|
|
@ -293,6 +293,10 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
||||||
'.OVNClient._is_lb_member_fip',
|
'.OVNClient._is_lb_member_fip',
|
||||||
return_value=False)
|
return_value=False)
|
||||||
self.mock_is_lb_member_fip.start()
|
self.mock_is_lb_member_fip.start()
|
||||||
|
self._start_mock(
|
||||||
|
'neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.ovn_client.'
|
||||||
|
'OVNClient.delete_mac_binding_entries_by_mac',
|
||||||
|
return_value=1)
|
||||||
|
|
||||||
def test__plugin_driver(self):
|
def test__plugin_driver(self):
|
||||||
# No valid mech drivers should raise an exception.
|
# No valid mech drivers should raise an exception.
|
||||||
|
@ -1712,6 +1716,10 @@ class OVNL3ExtrarouteTests(test_l3_gw.ExtGwModeIntTestCase,
|
||||||
self._start_mock(
|
self._start_mock(
|
||||||
'neutron.common.ovn.utils.get_revision_number',
|
'neutron.common.ovn.utils.get_revision_number',
|
||||||
return_value=1)
|
return_value=1)
|
||||||
|
self._start_mock(
|
||||||
|
'neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.ovn_client.'
|
||||||
|
'OVNClient.delete_mac_binding_entries_by_mac',
|
||||||
|
return_value=1)
|
||||||
self.setup_notification_driver()
|
self.setup_notification_driver()
|
||||||
|
|
||||||
# Note(dongj): According to bug #1657693, status of an unassociated
|
# Note(dongj): According to bug #1657693, status of an unassociated
|
||||||
|
|
Loading…
Reference in New Issue