]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Remove and recreate interface if already exists
authorAaron Rosen <aaronorosen@gmail.com>
Mon, 13 Jan 2014 21:57:04 +0000 (13:57 -0800)
committerAaron Rosen <aaronorosen@gmail.com>
Mon, 20 Jan 2014 21:49:55 +0000 (13:49 -0800)
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
neutron/tests/unit/test_linux_interface.py

index fc32efc1cb906a24e52400c77d07016f7fc9bf89..c763b03a30d62771f73cb6be5ef979d64b3e12ac 100644 (file)
@@ -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']
index 48ecb4c31d01284638a0e0b279f29a55ad72de64..43ebd093a3c8ff55caedb9cdfebe41b3c1ec613a 100644 (file)
@@ -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',