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