WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-api

[Xen-API] [PATCH 06 of 33] interface-reconfigure: Explicity cache databa

To: xen-api@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-API] [PATCH 06 of 33] interface-reconfigure: Explicity cache database configuration in /var/xapi/network.dbcache
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Fri, 18 Dec 2009 14:17:01 +0000
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Fri, 18 Dec 2009 06:18:16 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1261145815@xxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-post: <mailto:xen-api@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-api-bounces@xxxxxxxxxxxxxxxxxxx
This cache is used in the force actions rather than relying on state
under /etc being preserved.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r 1fd2f2aecb8c -r 4805599e2732 scripts/interface-reconfigure
--- a/scripts/interface-reconfigure     Fri Dec 18 14:16:32 2009 +0000
+++ b/scripts/interface-reconfigure     Fri Dec 18 14:16:32 2009 +0000
@@ -14,29 +14,28 @@
 #
 """Usage:
 
-    %(command-name)s --session <SESSION-REF> --pif <PIF-REF> [up|down|rewrite]
-    %(command-name)s --force <BRIDGE> [up|down|rewrite <CONFIG>]
+    %(command-name)s <PIF> up
+    %(command-name)s <PIF> down
+    %(command-name)s [<PIF>] rewrite
+    %(command-name)s --force <BRIDGE> up
+    %(command-name)s --force <BRIDGE> down
+    %(command-name)s --force <BRIDGE> rewrite --device=<INTERFACE> <CONFIG>
     %(command-name)s --force all down
 
-    where,
-          <CONFIG> = --device=<INTERFACE> --mode=dhcp
-          <CONFIG> = --device=<INTERFACE> --mode=static --ip=<IPADDR> 
--netmask=<NM> [--gateway=<GW>]
+    where <PIF> is one of:
+       --session <SESSION-REF> --pif <PIF-REF>
+       --pif-uuid <PIF-UUID>
+    and <CONFIG> is one of:
+       --mode=dhcp
+       --mode=static --ip=<IPADDR> --netmask=<NM> [--gateway=<GW>]
 
   Options:
     --session          A session reference to use to access the xapi DB
-    --pif               A PIF reference.
-    --force-interface  An interface name. Mutually exclusive with 
--session/--pif.
-
-  Either both --session and --pif  or just --pif-uuid.
-  
-  <ACTION> is either "up" or "down" or "rewrite"
+    --pif               A PIF reference within the session.
+    --pif-uuid          The UUID of a PIF.
+    --force             An interface name.
 """
 
-#
-# Undocumented parameters for test & dev:
-#
-#  --pif-uuid  A PIF UUID, use instead of --session/--pif.
-#
 # Notes:
 # 1. Every pif belongs to exactly one network
 # 2. Every network has zero or one pifs
@@ -56,6 +55,7 @@
 management_pif = None
 
 sysfs_bonding_masters = "/sys/class/net/bonding_masters"
+dbcache_file = "/var/xapi/network.dbcache"
 
 class Usage(Exception):
     def __init__(self, msg):
@@ -714,6 +714,25 @@
                    filter(lambda (ref,rec): rec['device'] == device,
                           self.__pifs.items()))
 
+    def get_pif_by_bridge(self, bridge):
+        networks = map(lambda (ref,rec): ref,
+                       filter(lambda (ref,rec): rec['bridge'] == bridge,
+                              self.__networks.items()))
+        if len(networks) == 0:
+            raise Error("No matching network \"%s\"" % bridge)
+
+        answer = None
+        for network in networks:
+            nwrec = self.get_network_record(network)
+            for pif in nwrec['PIFs']:
+                pifrec = self.get_pif_record(pif)
+                if answer:
+                    raise Error("Multiple PIFs on host for network %s" % 
(bridge))
+                answer = pif
+        if not answer:
+            raise Error("No PIF on host for network %s" % (bridge))
+        return answer
+
     def get_pif_record(self, pif):
         if self.__pifs.has_key(pif):
             return self.__pifs[pif]
@@ -1442,204 +1461,8 @@
         f.revert()
         raise
 
-def force_pif_up(pifdev):
-    if os.path.exists(os.path.join(ifcfg, "ifcfg-" + pifdev)):
-        if not interface_up(pifdev):
-            log("Bring interface %s up" % pifdev)
-            ifup(pifdev)
-        else:
-            log("Interface %s is already up, leaving" % pifdev)
-    else:
-        log("No configuration found for PIF %s, attempting to continue" % 
pifdev)
-
-
-def force_pif_down(pifdev):
-    if os.path.exists(os.path.join(ifcfg, "ifcfg-" + pifdev)):
-        if interface_up(pifdev):
-            log("Bring interface %s down" % pifdev)
-            ifdown(pifdev)
-        else:
-            log("Interface %s is already down, leaving" % pifdev)
-    else:
-        log("No configuration found for PIF %s, attempting to continue" % 
pifdev)
-
-def action_force_up(bridge):
-    ifcfg_bridge = os.path.join(ifcfg, "ifcfg-" + bridge)
-    if not os.path.exists(ifcfg_bridge):
-        raise Error("No configuration found for bridge %s" % bridge)
-
-    f = open(ifcfg_bridge)
-    pifdevs = filter(lambda x: x.startswith("PIFDEV="), f.readlines())
-    f.close()
-
-    if len(pifdevs) == 0:
-        log("PIF device is not configured for %s, attempting to continue" % 
bridge)
-    else:
-        if len(pifdevs) > 1:
-            log("Device %s has %d PIF devices configured. Selecting the first" 
% (bridge, len(pifdevs)))
-        pifdev = pifdevs[0].strip()[len("PIFDEV="):]
-
-        split = pifdev.split(".",1)
-        if len(split) == 2:
-            vlanmaster = split[0]
-            vlantag = split[1]
-        else:
-            vlanmaster = None
-
-        if pifdev.startswith("bond"):
-            # Drop the (optional) VLAN suffix
-            bond = pifdev.split(".")[0]
-            __create_bond_device(bond)
-
-        if vlanmaster:
-            force_pif_up(vlanmaster)
-            
-        force_pif_up(pifdev)
-        
-    if not os.path.exists(os.path.join(ifcfg, "ifcfg-" + bridge)):
-        log("No configuration found for bridge %s, attempting to continue" % 
bridge)
-    elif not interface_up(bridge):
-        log("Bring bridge %s up" % bridge)
-        ifup(bridge)
-    else:
-        log("Bridge %s is already up, leaving" % bridge)
-
-
-def action_force_down(bridge):
-    if bridge == 'all':
-        action_force_down_all_devices()
-    
-    ifcfg_bridge = os.path.join(ifcfg, "ifcfg-" + bridge)
-    if not os.path.exists(ifcfg_bridge):
-        raise Error("No configuration found for bridge %s" % bridge)
-
-    if interface_up(bridge):
-        log("Bring bridge %s down" % bridge)
-        ifdown(bridge)
-    else:
-        log("Bridge %s is already down, leaving" % bridge)
-
-
-    f = open(ifcfg_bridge)
-    pifdevs = filter(lambda x: x.startswith("PIFDEV="), f.readlines())
-    f.close()
-
-    if len(pifdevs) == 0:
-        log("PIF device is not configured for %s, attempting to continue" % 
bridge)
-    else:
-        if len(pifdevs) > 1:
-            log("Device %s has %d PIF devices configured. Selecting the first" 
% (bridge, len(pifdevs)))
-        pifdev = pifdevs[0].strip()[len("PIFDEV="):]
-
-        force_pif_down(pifdev)
-
-        split = pifdev.split(".",1)
-        if len(split) == 2:
-            vlanmaster = split[0]
-            vlantag = split[1]
-        else:
-            vlanmaster = None
-
-        if vlanmaster:
-            force_pif_down(vlanmaster)
-
-        if pifdev.startswith("bond"):
-            # Drop the (optional) VLAN suffix
-            bond = pifdev.split(".")[0]
-            __destroy_bond_device(bond)
-        
-
-# This is useful for reconfiguring the mgmt interface after having lost 
connectivity to the pool master
 def action_force_rewrite(bridge, config):
-    # Notes:
-    # 1. that this assumes the interface is bridged
-    # 2. If --gateway is given it will make that the default gateway for the 
host
-
-    # extract the configuration
-    try:
-        mode = config['mode']
-        interface = config['device']
-    except:
-        raise Usage("Please supply --mode and --device")
-    if mode == 'static':
-        try:
-            netmask = config['netmask']
-            ip = config['ip']
-        except:
-            raise Usage("Please supply --netmask and --ip")
-        try:
-            gateway = config['gateway']
-        except:
-            gateway = None
-    elif mode != 'dhcp':
-        raise Usage("--mode must be either static or dhcp")
-
-    if config.has_key('vlan'):
-        is_vlan = True
-        vlan_slave, vlan_vid = config['vlan'].split('.')
-    else:
-        is_vlan = False
-
-    log("Configuring %s using %s configuration" % (bridge, mode))
-    # Physical Device configuration
-    f = __open_ifcfg(interface)
-    if is_vlan:
-        f.write("VLAN=yes\n")
-        try:
-            slv_mac = open("/sys/class/net/%s/address" % 
vlan_slave).read().strip()
-        except:
-            raise Error("cannot find device %s" % vlan_slave)
-        slv =  __open_ifcfg(vlan_slave)
-        slv.write("TYPE=Ethernet\n")
-        slv.write("HWADDR=%s\n" % slv_mac)
-        slv.close()
-        f.attach_child(slv)
-    else:
-        try:
-            itf_mac = open("/sys/class/net/%s/address" % 
interface).read().strip()
-        except:
-            raise Error("cannot find device %s" % interface)
-        f.write("TYPE=Ethernet\n")
-        f.write("HWADDR=%s\n" % itf_mac)
-    f.write("BRIDGE=%s\n" % bridge)
-    f.close()
-
-
-    br = __open_ifcfg(bridge)
-    f.attach_child(br)
-
-    # Networking configuration
-    br.write("TYPE=Bridge\n")
-    br.write("DELAY=0\n")
-    br.write("STP=off\n")
-    br.write("PIFDEV=%s\n" % interface)
-
-    if mode == "dhcp":
-        br.write("BOOTPROTO=dhcp\n")
-        br.write("PERSISTENT_DHCLIENT=yes\n")
-    elif mode == "static":
-        br.write("BOOTPROTO=none\n") 
-        br.write("NETMASK=%s\n" % netmask)
-        br.write("IPADDR=%s\n" % ip)
-        if gateway:
-            br.write("GATEWAY=%s\n" % gateway)
-            fnetwork = ConfigurationFile("/etc/sysconfig/network")
-            for line in fnetwork.readlines():
-                if line.lstrip().startswith('GATEWAY') :
-                    continue
-                fnetwork.write(line)
-            fnetwork.write('GATEWAYDEV=%s\n' % bridge)
-            fnetwork.close()
-            br.attach_child(fnetwork)
-    br.close()
-
-    try:
-        f.apply()
-        f.commit()
-    except Error, e:
-        log("failed to apply changes: %s" % e.msg)
-        f.revert()
-        raise
+    raise Error("Force rewrite is not implemented yet.")
 
 # This is an almighty big hammer which uses heuristics to determine
 # which interfaces are up and how they're configured and brings
@@ -1713,8 +1536,7 @@
     for phys in physifs:
         run("/sbin/ip", "route", "flush", "dev", phys, "table", "all")
         run("/sbin/ip", "addr", "flush", "dev", phys)
-        run("/sbin/ip", "link", "set", phys, "down")
-        
+        run("/sbin/ip", "link", "set", phys, "down")        
 
 def main(argv=None):
     global management_pif
@@ -1771,61 +1593,81 @@
             raise Usage("Too many arguments")
 
         action = args[0]
+
+        if not action in ["up", "down", "rewrite", "rewrite-configuration"]:
+            raise Usage("Unknown action \"%s\"" % action)
+
         # backwards compatibility
         if action == "rewrite-configuration": action = "rewrite"
-        
+
         if ( session or pif ) and pif_uuid:
             raise Usage("--session/--pif and --pif-uuid are mutually 
exclusive.")
         if ( session and not pif ) or ( not session and pif ):
             raise Usage("--session and --pif must be used together.")
         if force_interface and ( session or pif or pif_uuid ):
             raise Usage("--force is mutually exclusive with --session, --pif 
and --pif-uuid")
+        if force_interface == "all" and action != "down":
+            raise Usage("\"--force all\" only valid for down action")
         if len(force_rewrite_config) and not (force_interface and action == 
"rewrite"):
             raise Usage("\"--force rewrite\" needed for --device, --mode, 
--ip, --netmask, and --gateway")
 
+        global db
         if force_interface:
             log("Force interface %s %s" % (force_interface, action))
-            
-            if action == "up":
-                action_force_up(force_interface)
-            elif action == "down":
-                action_force_down(force_interface)
-            elif action == "rewrite":
+
+            if action == "rewrite":
                 action_force_rewrite(force_interface, force_rewrite_config)
+            elif action in ["up", "down"]:
+                if action == "down" and force_interface == "all":
+                    action_force_down_all_devices()
+
+                db = DatabaseCache(cache_file=dbcache_file)
+                pif = db.get_pif_by_bridge(force_interface)
+                management_pif = db.get_management_pif()
+
+                if action == "up":
+                    action_up(pif)
+                elif action == "down":
+                    action_down(pif)
             else:
-                raise Usage("Unknown action %s"  % action)
+                raise Error("Unknown action %s"  % action)
         else:
-            global db
-            db = DatabaseCache(session)
+            db = DatabaseCache(session_ref=session)
 
             if pif_uuid:
                 pif = db.get_pif_by_uuid(pif_uuid)
-        
-            if not pif:
-                raise Usage("No PIF given")
 
-            if force_management:
-                # pif is going to be the management pif 
-                management_pif = pif
+            if action == "rewrite" and not pif:
+                pass
             else:
-                # pif is not going to be the management pif.
-                # Search DB cache for pif on same host with management=true
-                pifrec = db.get_pif_record(pif)
-                management_pif = db.get_management_pif()
+                if not pif:
+                    raise Usage("No PIF given")
 
-            log_pif_action(action, pif)
+                if force_management:
+                    # pif is going to be the management pif
+                    management_pif = pif
+                else:
+                    # pif is not going to be the management pif.
+                    # Search DB cache for pif on same host with management=true
+                    pifrec = db.get_pif_record(pif)
+                    management_pif = db.get_management_pif()
 
-            if not check_allowed(pif):
-                return 0
+                log_pif_action(action, pif)
 
-            if action == "up":
-                action_up(pif)
-            elif action == "down":
-                action_down(pif)
-            elif action == "rewrite":
-                action_rewrite(pif)
-            else:
-                raise Usage("Unknown action %s"  % action)
+                if not check_allowed(pif):
+                    return 0
+
+                if action == "up":
+                    action_up(pif)
+                elif action == "down":
+                    action_down(pif)
+                elif action == "rewrite":
+                    action_rewrite(pif)
+                else:
+                    raise Error("Unknown action %s"  % action)
+
+            # Save cache.
+            db.save(dbcache_file)
         
     except Usage, err:
         print >>sys.stderr, err.msg

_______________________________________________
xen-api mailing list
xen-api@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/mailman/listinfo/xen-api

<Prev in Thread] Current Thread [Next in Thread>