From: Ben Pfaff Date: Thu, 10 Dec 2009 23:37:59 +0000 (-0800) Subject: xenserver: Make basic interface-reconfigure calls work. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0eb8e3158299f50270b283adb55da65c736246a;p=openvswitch xenserver: Make basic interface-reconfigure calls work. Now a XenServer can boot OK with the database at least in simple cases. interface-reconfigure is slow because there is a 5-second sleep in place of a proper way to wait for vswitchd reconfiguration to complete. --- diff --git a/xenserver/opt_xensource_libexec_interface-reconfigure b/xenserver/opt_xensource_libexec_interface-reconfigure index 2b6f62b4..8119ee86 100755 --- a/xenserver/opt_xensource_libexec_interface-reconfigure +++ b/xenserver/opt_xensource_libexec_interface-reconfigure @@ -1207,25 +1207,18 @@ A VLAN PIF cannot be a datapath PIF. return [pif] def datapath_deconfigure_physical(netdev): - # The use of [!0-9] keeps an interface of 'eth0' from matching - # VLANs attached to eth0 (such as 'eth0.123'), which are distinct - # interfaces. - return ['--del-match=bridge.*.port=%s' % netdev, - '--del-match=port.%s.[!0-9]*' % netdev, - '--del-match=bonding.*.slave=%s' % netdev, - '--del-match=iface.%s.[!0-9]*' % netdev] + return ['--', '--if-exists', 'del-port', netdev] def datapath_configure_bond(pif,slaves): + bridge = pif_bridge_name(pif) pifrec = db.get_pif_record(pif) interface = pif_netdev_name(pif) - argv = ['--del-match=bonding.%s.[!0-9]*' % interface] - argv += ["--add=bonding.%s.slave=%s" % (interface, pif_netdev_name(slave)) - for slave in slaves] - argv += ['--add=bonding.%s.fake-iface=true' % interface] + argv = ['--', 'add-bond', bridge, interface] + slaves - if pifrec['MAC'] != "": - argv += ['--add=port.%s.mac=%s' % (interface, pifrec['MAC'])] + # XXX need ovs-vsctl support + #if pifrec['MAC'] != "": + # argv += ['--add=port.%s.mac=%s' % (interface, pifrec['MAC'])] # Bonding options. bond_options = { @@ -1243,25 +1236,16 @@ def datapath_configure_bond(pif,slaves): overrides = map(lambda (key,val): (key[5:], val), overrides) bond_options.update(overrides) for (name,val) in bond_options.items(): - argv += ["--add=bonding.%s.%s=%s" % (interface, name, val)] + # XXX need ovs-vsctl support for bond options + #argv += ["--add=bonding.%s.%s=%s" % (interface, name, val)] + pass return argv def datapath_deconfigure_bond(netdev): - # The use of [!0-9] keeps an interface of 'eth0' from matching - # VLANs attached to eth0 (such as 'eth0.123'), which are distinct - # interfaces. - return ['--del-match=bonding.%s.[!0-9]*' % netdev, - '--del-match=port.%s.[!0-9]*' % netdev] + return ['--', '--if-exists', 'del-port', netdev] def datapath_deconfigure_ipdev(interface): - # The use of [!0-9] keeps an interface of 'eth0' from matching - # VLANs attached to eth0 (such as 'eth0.123'), which are distinct - # interfaces. - return ['--del-match=bridge.*.port=%s' % interface, - '--del-match=port.%s.[!0-9]*' % interface, - '--del-match=iface.%s.[!0-9]*' % interface, - '--del-match=vlan.%s.trunks=*' % interface, - '--del-match=vlan.%s.tag=*' % interface] + return ['--', '--if-exists', 'del-port', interface] def datapath_modify_config(commands): if debug_mode(): @@ -1269,12 +1253,11 @@ def datapath_modify_config(commands): for c in commands: log(" %s" % c) - rc = run_command(['/usr/bin/ovs-cfg-mod', '-vANY:console:emer', - '-F', '/etc/ovs-vswitchd.conf'] - + [c for c in commands if c[0] != '#'] + ['-c']) + rc = run_command(['/usr/bin/ovs-vsctl'] + + [c for c in commands if not c.startswith('#')]) if not rc: raise Error("Failed to modify vswitch configuration") - run_command(['/sbin/service', 'vswitch', 'reload']) + run_command(['/bin/sleep', '5']) # XXX return True # @@ -1349,7 +1332,7 @@ def configure_datapath(pif): b = pif_bridge_name(brpif) ifdown(b) cfgmod_argv += ['# remove bridge %s' % b] - cfgmod_argv += ['--del-match=bridge.%s.*' % b] + cfgmod_argv += ['--', '--if-exists', 'del-br', b] for n in extra_down_ports: dev = pif_netdev_name(n) @@ -1392,18 +1375,23 @@ def configure_datapath(pif): if len(offload): run_command(['/sbin/ethtool', '-K', dev] + offload) + if pif_is_vlan(pif): + datapath = pif_datapath(pif) + vlan = db.get_pif_record(pif)['VLAN'] + cfgmod_argv += ['--', 'add-br', bridge, datapath, vlan] + else: + cfgmod_argv += ['--', 'add-br', bridge] + if len(physical_devices) > 1: cfgmod_argv += ['# deconfigure bond %s' % pif_netdev_name(pif)] cfgmod_argv += datapath_deconfigure_bond(pif_netdev_name(pif)) - cfgmod_argv += ['--del-entry=bridge.%s.port=%s' % (bridge,pif_netdev_name(pif))] cfgmod_argv += ['# configure bond %s' % pif_netdev_name(pif)] cfgmod_argv += datapath_configure_bond(pif, physical_devices) - cfgmod_argv += ['--add=bridge.%s.port=%s' % (bridge,pif_netdev_name(pif)) ] extra_up_ports += [pif_netdev_name(pif)] else: iface = pif_netdev_name(physical_devices[0]) cfgmod_argv += ['# add physical device %s' % iface] - cfgmod_argv += ['--add=bridge.%s.port=%s' % (bridge,iface) ] + cfgmod_argv += ['--', 'add-port', bridge, iface] return cfgmod_argv,extra_up_ports @@ -1428,7 +1416,7 @@ def deconfigure_datapath(pif): cfgmod_argv += datapath_deconfigure_bond(pif_netdev_name(pif)) cfgmod_argv += ['# deconfigure bridge %s' % bridge] - cfgmod_argv += ['--del-match=bridge.%s.*' % bridge] + cfgmod_argv += ['--', '--if-exists', 'del-br', bridge] return cfgmod_argv @@ -1454,9 +1442,7 @@ def action_up(pif): cfgmod_argv += c extra_ports += e - cfgmod_argv += ['# configure xs-network-uuids'] - cfgmod_argv += ['--del-match=bridge.%s.xs-network-uuids=*' % bridge] - + xs_network_uuids = [] for nwpif in db.get_pifs_by_device(db.get_pif_record(pif)['device']): rec = db.get_pif_record(nwpif) @@ -1467,24 +1453,20 @@ def action_up(pif): # log("Network PIF %s not currently attached (%s)" % (rec['uuid'],pifrec['uuid'])) # continue nwrec = db.get_network_record(rec['network']) - cfgmod_argv += ['--add=bridge.%s.xs-network-uuids=%s' % (bridge, nwrec['uuid'])] + xs_network_uuids += [nwrec['uuid']] + cfgmod_argv += ['# configure xs-network-uuids'] + cfgmod_argv += ['--', 'br-set-external-id', bridge, + 'xs-network-uuids', ' '.join(xs_network_uuids)] - cfgmod_argv += ["# deconfigure ipdev %s" % ipdev] - cfgmod_argv += datapath_deconfigure_ipdev(ipdev) - cfgmod_argv += ["# reconfigure ipdev %s" % ipdev] - cfgmod_argv += ['--add=bridge.%s.port=%s' % (bridge, ipdev)] + if ipdev != bridge: + cfgmod_argv += ["# deconfigure ipdev %s" % ipdev] + cfgmod_argv += datapath_deconfigure_ipdev(ipdev) + cfgmod_argv += ["# reconfigure ipdev %s" % ipdev] + cfgmod_argv += ['--', 'add-port', bridge, ipdev] f = ipdev_configure_network(pif) f.close() - # /etc/xensource/scripts/vif needs to know where to add VIFs. - if pif_is_vlan(pif): - if not bridge: - raise Error("Unbridged VLAN devices not implemented yet") - cfgmod_argv += ['--add=vlan.%s.tag=%s' % (ipdev, pifrec['VLAN'])] - cfgmod_argv += ['--add=iface.%s.internal=true' % (ipdev)] - cfgmod_argv += ['--add=iface.%s.fake-bridge=true' % (ipdev)] - # Apply updated configuration. try: f.apply() @@ -1520,8 +1502,6 @@ def action_down(pif): if dp: nw = db.get_pif_record(pif)['network'] nwrec = db.get_network_record(nw) - cfgmod_argv += ['# deconfigure xs-network-uuids'] - cfgmod_argv += ['--del-entry=bridge.%s.xs-network-uuids=%s' % (bridge,nwrec['uuid'])] log("deconfigure ipdev %s on %s" % (ipdev,bridge)) cfgmod_argv += ["# deconfigure ipdev %s" % ipdev]