Antoni Segura Puimedon has uploaded a new change for review. Change subject: [WIP] Don't fail silently when ifup fails. ......................................................................
[WIP] Don't fail silently when ifup fails. Up until now we discarded ifup return codes and ignored the possible errors present in ifup stdout. Use this information to perform better error reporting. Change-Id: I1cc9dcc0a6b55d36fc937e1d364bd9c256ecd70a Signed-off-by: Antoni S. Puimedon <[email protected]> Bug-Url: https://bugzilla.redhat.com/856737 --- M vdsm/configNetwork.py M vdsm/neterrors.py 2 files changed, 28 insertions(+), 8 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/15/8415/1 diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py index a114798..fb7cd94 100755 --- a/vdsm/configNetwork.py +++ b/vdsm/configNetwork.py @@ -29,6 +29,7 @@ from xml.sax.saxutils import escape import glob import shutil +from functools import partial import libvirt import selinux @@ -60,15 +61,23 @@ return rc -def ifup(iface, async=False): +def ifup(iface, async=False, final=None): "Bring up an interface" - _ifup = lambda netIf: execCmd([constants.EXT_IFUP, netIf], raw=True) + def _ifup(netIf, toCall=None): + rc, out, err = execCmd([constants.EXT_IFUP, netIf], raw=False) + + if rc != 0: + # In /etc/sysconfig/network-scripts/ifup* the last line usually + # contains the error reason. + raise ConfigNetworkError(ne.ERR_FAILED_IFUP, out[-1]) + elif toCall is not None: + toCall() if async: # wait for dhcp in another thread, # so vdsm won't get stuck (BZ#498940) t = threading.Thread(target=_ifup, name='ifup-waiting-on-dhcp', - args=(iface,)) + args=(iface, final)) t.daemon = True t.start() else: @@ -899,6 +908,11 @@ nic = nics[0] if nics else None iface = bonding or nic blockingDhcp = utils.tobool(options.get('blockingdhcp')) + # Asynchronous top level ifup creation variables. + async = options['bootproto'] and blockingDhcp + libvirtNetworkCreation = partial(configWriter.createLibvirtNetwork, + network, bridged, iface) + # take down nics that need to be changed vlanedIfaces = [v['iface'] for v in _netinfo.vlans.values()] @@ -959,22 +973,27 @@ # Now we can run ifup for all interfaces if bonding: - ifup(bonding, bondBootproto == 'dhcp' and not blockingDhcp) + ifup(bonding, bondBootproto == 'dhcp' and not blockingDhcp, + libvirtNetworkCreation) # NICs must be activated in the same order of boot time # to expose the correct MAC address. for nic in nicSort(nics): - ifup(nic, options['bootproto'] and not blockingDhcp) + ifup(nic, options['bootproto'] and not blockingDhcp, + libvirtNetworkCreation) # Now we can ifup VLAN interface, because bond and nic already up if vlan: - ifup(iface, vlanBootproto == 'dhcp' and not blockingDhcp) + ifup(iface, vlanBootproto == 'dhcp' and not blockingDhcp, + libvirtNetworkCreation) if bridged: - ifup(network, bridgeBootproto == 'dhcp' and not blockingDhcp) + ifup(network, bridgeBootproto == 'dhcp' and not blockingDhcp, + libvirtNetworkCreation) # add libvirt network - configWriter.createLibvirtNetwork(network, bridged, iface) + if not async: + libvirtNetworkCreation() def assertBridgeClean(bridge, vlan, bonding, nics): diff --git a/vdsm/neterrors.py b/vdsm/neterrors.py index 65e2674..92faa59 100644 --- a/vdsm/neterrors.py +++ b/vdsm/neterrors.py @@ -27,4 +27,5 @@ ERR_BAD_VLAN = 26 ERR_BAD_BRIDGE = 27 ERR_USED_BRIDGE = 28 +ERR_FAILED_IFUP = 30 ERR_LOST_CONNECTION = 10 # noConPeer -- To view, visit http://gerrit.ovirt.org/8415 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I1cc9dcc0a6b55d36fc937e1d364bd9c256ecd70a Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Antoni Segura Puimedon <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
