From b78eea6146145793a7c61705a1602cf5e9ac3d3a Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Mon, 13 Jan 2014 13:57:04 -0800 Subject: [PATCH] Remove and recreate interface if already exists If the dhcp-agent machine restarts when openvswitch comes up it logs the following warning messages for all tap interfaces that do not exist: bridge|WARN|could not open network device tap2cf7dbad-9d (No such device) Once the dhcp-agent starts it recreates the interfaces and re-adds them to the ovs-bridge. Unfortunately, ovs does not reinitialize the interfaces as they are already in ovsdb and does not assign them a ofport number. This situation corrects itself though the next time a port is added to the ovs-bridge which is why no one has probably noticed this issue till now. In order to correct this we should first remove interface that exist and then readd them. Closes-bug: #1268762 Change-Id: I4bb0019135ab7fa7cdfa6d5db3bff6eafe22fc85 --- neutron/agent/linux/interface.py | 2 +- neutron/tests/unit/test_linux_interface.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/neutron/agent/linux/interface.py b/neutron/agent/linux/interface.py index fc32efc1cb9..c763b03a30d 100644 --- a/neutron/agent/linux/interface.py +++ b/neutron/agent/linux/interface.py @@ -144,7 +144,7 @@ class OVSInterfaceDriver(LinuxInterfaceDriver): def _ovs_add_port(self, bridge, device_name, port_id, mac_address, internal=True): - cmd = ['ovs-vsctl', '--', '--may-exist', + cmd = ['ovs-vsctl', '--', '--if-exists', 'del-port', device_name, '--', 'add-port', bridge, device_name] if internal: cmd += ['--', 'set', 'Interface', device_name, 'type=internal'] diff --git a/neutron/tests/unit/test_linux_interface.py b/neutron/tests/unit/test_linux_interface.py index 48ecb4c31d0..43ebd093a3c 100644 --- a/neutron/tests/unit/test_linux_interface.py +++ b/neutron/tests/unit/test_linux_interface.py @@ -160,7 +160,8 @@ class TestOVSInterfaceDriver(TestBase): def device_exists(dev, root_helper=None, namespace=None): return dev == bridge - vsctl_cmd = ['ovs-vsctl', '--', '--may-exist', 'add-port', + vsctl_cmd = ['ovs-vsctl', '--', '--if-exists', 'del-port', + 'tap0', '--', 'add-port', bridge, 'tap0', '--', 'set', 'Interface', 'tap0', 'type=internal', '--', 'set', 'Interface', 'tap0', 'external-ids:iface-id=port-1234', '--', 'set', @@ -247,7 +248,8 @@ class TestOVSInterfaceDriverWithVeth(TestOVSInterfaceDriver): mock.call().add_veth('tap0', devname, namespace2=namespace)] - vsctl_cmd = ['ovs-vsctl', '--', '--may-exist', 'add-port', + vsctl_cmd = ['ovs-vsctl', '--', '--if-exists', 'del-port', + 'tap0', '--', 'add-port', bridge, 'tap0', '--', 'set', 'Interface', 'tap0', 'external-ids:iface-id=port-1234', '--', 'set', 'Interface', 'tap0',