Change in vdsm[master]: network: wait for a bridge to appear before disabling IPv6 o...

osvoboda at redhat.com osvoboda at redhat.com
Tue Jul 14 11:00:14 UTC 2015


Ondřej Svoboda has uploaded a new change for review.

Change subject: network: wait for a bridge to appear before disabling IPv6 on it
......................................................................

network: wait for a bridge to appear before disabling IPv6 on it

A traceback such as

  File "/usr/share/vdsm/network/configurators/ifcfg.py", line 101, in configureBridge
    sysctl.disable_ipv6(bridge.name)
  File "/usr/lib/python2.7/site-packages/vdsm/sysctl.py", line 42, in disable_ipv6
    with open('/proc/sys/net/ipv6/conf/%s/disable_ipv6' % dev, 'w') as f:
IOError: [Errno 2] No such file or directory: u'/proc/sys/net/ipv6/conf/test-network/disable_ipv6'

shows that a bridge was not yet created when _ifup in ifcfg's configureBridge
already finished.

This patch makes configureBridge wait for the bridge for up to 1s. If it is
not created by then, a standard exception is triggered.

Change-Id: Ic5292e5a297ff50a0e82ba0781333e21fd9dd7f3
Signed-off-by: Ondřej Svoboda <osvoboda at redhat.com>
---
M vdsm/network/configurators/__init__.py
M vdsm/network/configurators/ifcfg.py
M vdsm/network/configurators/iproute2.py
3 files changed, 22 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/83/43583/1

diff --git a/vdsm/network/configurators/__init__.py b/vdsm/network/configurators/__init__.py
index e51d3ed..6a5b484 100644
--- a/vdsm/network/configurators/__init__.py
+++ b/vdsm/network/configurators/__init__.py
@@ -24,6 +24,7 @@
 from vdsm import netinfo
 from vdsm.config import config
 from vdsm.netconfpersistence import RunningConfig
+from vdsm.netlink import monitor
 
 from .dhclient import DhcpClient
 from ..errors import ConfigNetworkError, ERR_FAILED_IFUP
@@ -178,3 +179,19 @@
     if iface.blockingdhcp and rc:
         raise ConfigNetworkError(ERR_FAILED_IFUP, 'dhclient%s failed',
                                  family)
+
+
+def wait_for_bridge(name, timeout=1):
+    """
+    Wait for a bridge to appear in a given timeout. If the bridge is not
+    created by then, raise a ConfigNetworkError.
+    """
+    with monitor.Monitor(timeout=timeout, groups=('link',),
+                         silent_timeout=True) as mon:
+        if name in netinfo.bridges():
+            return
+        for event in mon:
+            if event.get('name') == name and event.get('event') == 'new_link':
+                return
+    raise ConfigNetworkError(ERR_FAILED_IFUP, 'Bridge %s was not created '
+                             'during a %ss timeout.' % (name, timeout))
diff --git a/vdsm/network/configurators/ifcfg.py b/vdsm/network/configurators/ifcfg.py
index e9ef7cc..b42e9b3 100644
--- a/vdsm/network/configurators/ifcfg.py
+++ b/vdsm/network/configurators/ifcfg.py
@@ -44,7 +44,7 @@
 if utils.isOvirtNode():
     from ovirt.node.utils import fs as node_fs
 
-from . import Configurator, dhclient, getEthtoolOpts, libvirt
+from . import Configurator, dhclient, getEthtoolOpts, libvirt, wait_for_bridge
 from ..errors import ConfigNetworkError, ERR_FAILED_IFUP
 from ..models import Nic, Bridge, IPv4, IPv6
 from ..sourceroute import StaticSourceRoute, DynamicSourceRoute
@@ -98,6 +98,7 @@
         _ifup(bridge)
         if not bridge.ipv6.address and not bridge.ipv6.ipv6autoconf and (
                 not bridge.ipv6.dhcpv6):
+            wait_for_bridge(bridge.name)
             sysctl.disable_ipv6(bridge.name)
 
     def configureVlan(self, vlan, **opts):
diff --git a/vdsm/network/configurators/iproute2.py b/vdsm/network/configurators/iproute2.py
index 0b5b73e..ef36766 100644
--- a/vdsm/network/configurators/iproute2.py
+++ b/vdsm/network/configurators/iproute2.py
@@ -29,7 +29,8 @@
 from vdsm.utils import CommandPath
 from vdsm.utils import execCmd
 
-from . import Configurator, runDhclient, getEthtoolOpts, libvirt
+from . import (Configurator, runDhclient, getEthtoolOpts, libvirt,
+               wait_for_bridge)
 from .dhclient import DhcpClient
 from ..errors import ConfigNetworkError, ERR_FAILED_IFUP, ERR_FAILED_IFDOWN
 from ..models import Nic
@@ -75,6 +76,7 @@
         self.configApplier.setIfaceConfigAndUp(bridge)
         if not bridge.ipv6.address and not bridge.ipv6.ipv6autoconf and (
                 not bridge.ipv6.dhcpv6):
+            wait_for_bridge(bridge.name)
             sysctl.disable_ipv6(bridge.name)
         self._addSourceRoute(bridge)
         if 'custom' in opts and 'bridge_opts' in opts['custom']:


-- 
To view, visit https://gerrit.ovirt.org/43583
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic5292e5a297ff50a0e82ba0781333e21fd9dd7f3
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Ondřej Svoboda <osvoboda at redhat.com>


More information about the vdsm-patches mailing list