X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=xenserver%2Fopt_xensource_libexec_interface-reconfigure;h=07e7ba24b2f7ee0e87d8927d818fa3dd3000b6d8;hb=edaa959f6b5100361a6af2e5c68ca6abb94bf838;hp=61027c5fc886268868e3fdfc03813a431a6cde6f;hpb=00908dc27a4d93bd1c5bda3bcdc84ec351e9a09a;p=openvswitch diff --git a/xenserver/opt_xensource_libexec_interface-reconfigure b/xenserver/opt_xensource_libexec_interface-reconfigure index 61027c5f..07e7ba24 100755 --- a/xenserver/opt_xensource_libexec_interface-reconfigure +++ b/xenserver/opt_xensource_libexec_interface-reconfigure @@ -8,6 +8,7 @@ %(command-name)s --session --pif [up|down|rewrite] %(command-name)s --force [up|down|rewrite ] %(command-name)s --force all down + %(command-name)s init-dbcache where, = --device= --mode=dhcp @@ -38,24 +39,6 @@ # 3. A network may have an associated bridge, allowing vifs to be attached # 4. A network may be bridgeless (there's no point having a bridge over a storage pif) -# XXX: --force-interface=all down - -# XXX: --force-interface rewrite - -# XXX: Sometimes this leaves "orphaned" datapaths, e.g. a datapath whose -# only port is the local port. Should delete those. - -# XXX: This can leave crud in ovs-vswitchd.conf in this scenario: -# - Create bond in XenCenter. -# - Create VLAN on bond in XenCenter. -# - Attempt to delete bond in XenCenter (this will fail because there -# is a VLAN on the bond, although the error may not be reported -# until the next step) -# - Delete VLAN in XenCenter. -# - Delete bond in XenCenter. -# At this point there will still be some configuration data for the bond -# or the VLAN in ovs-vswitchd.conf. - import XenAPI import os, sys, getopt, time, signal import syslog @@ -71,8 +54,8 @@ output_directory = None db = None management_pif = None -dbcache_file = "/etc/ovs-vswitch.dbcache" -vswitch_config_dir = "/etc/openvswitch" +vswitch_state_dir = "/var/lib/openvswitch/" +dbcache_file = vswitch_state_dir + "dbcache" class Usage(Exception): def __init__(self, msg): @@ -370,6 +353,12 @@ PIF_ATTRS = { 'uuid': (str_to_xml,str_from_xml), 'MAC': (str_to_xml,str_from_xml), 'other_config': (lambda x, p, t, v: otherconfig_to_xml(x, p, v, PIF_OTHERCONFIG_ATTRS), lambda n: otherconfig_from_xml(n, PIF_OTHERCONFIG_ATTRS)), + + # Special case: We write the current value + # PIF.currently-attached to the cache but since it will + # not be valid when we come to use the cache later + # (i.e. after a reboot) we always read it as False. + 'currently_attached': (bool_to_xml, lambda n: False), } PIF_OTHERCONFIG_ATTRS = [ 'domain', 'peerdns', 'defaultroute', 'mtu', 'static-routes' ] + \ @@ -450,7 +439,11 @@ class DatabaseCache(object): rec = session.xenapi.network.get_record(n) self.__networks[n] = {} for f in NETWORK_ATTRS: - self.__networks[n][f] = rec[f] + if f == "PIFs": + # drop PIFs on other hosts + self.__networks[n][f] = [p for p in rec[f] if self.__pif_on_host(p)] + else: + self.__networks[n][f] = rec[f] self.__networks[n]['other_config'] = {} for f in NETWORK_OTHERCONFIG_ATTRS: if not rec['other_config'].has_key(f): continue @@ -1038,7 +1031,7 @@ def configure_physdev(pif): run_ethtool(device, oc) def modify_config(commands): - run_command(['/root/vswitch/bin/ovs-cfg-mod', '-vANY:console:emer', + run_command(['/usr/bin/ovs-cfg-mod', '-vANY:console:emer', '-F', '/etc/ovs-vswitchd.conf'] + commands + ['-c']) run_command(['/sbin/service', 'vswitch', 'reload']) @@ -1131,9 +1124,9 @@ def action_up(pif): # /etc/xensource/scripts/vif needs to know where to add VIFs. if vlan_slave: - if not os.path.exists(vswitch_config_dir): - os.mkdir(vswitch_config_dir) - br = ConfigurationFile("br-%s" % bridge, vswitch_config_dir) + if not os.path.exists(vswitch_state_dir): + os.mkdir(vswitch_state_dir) + br = ConfigurationFile("br-%s" % bridge, vswitch_state_dir) br.write("VLAN_SLAVE=%s\n" % datapath) br.write("VLAN_VID=%s\n" % pifrec['VLAN']) br.close() @@ -1198,7 +1191,7 @@ def action_up(pif): # - The networks corresponding to any VLANs attached to the # datapath's PIF. network_uuids = [] - for nwpif in db.get_pifs_by_device({'device': pifrec['device']}): + for nwpif in db.get_pifs_by_device(pifrec['device']): net = db.get_pif_record(nwpif)['network'] network_uuids += [db.get_network_record(net)['uuid']] @@ -1233,7 +1226,7 @@ def action_up(pif): argv += ['--add=iface.%s.fake-bridge=true' % (ipdev)] else: try: - os.unlink("%s/br-%s" % (vswitch_config_dir, bridge)) + os.unlink("%s/br-%s" % (vswitch_state_dir, bridge)) except OSError: pass argv += ['--del-match=bridge.%s.xs-network-uuids=*' % datapath] @@ -1449,6 +1442,9 @@ def main(argv=None): if len(force_rewrite_config) and not (force_interface and action == "rewrite"): raise Usage("\"--force rewrite\" needed for --device, --mode, --ip, --netmask, and --gateway") + if action == "init-dbcache" and arglist: + raise Usage("\"init-dbcache\" action does not accept any options") + global db if force_interface: log("Force interface %s %s" % (force_interface, action)) @@ -1466,6 +1462,8 @@ def main(argv=None): action_down(pif) else: raise Usage("Unknown action %s" % action) + elif action == "init-dbcache": + DatabaseCache().save(dbcache_file) else: db = DatabaseCache(session_ref=session) @@ -1499,7 +1497,6 @@ def main(argv=None): raise Usage("Unknown action %s" % action) # Save cache. - pifrec = db.get_pif_record(pif) db.save(dbcache_file) except Usage, err: