[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-API] [PATCH 04 of 33] interface-reconfigure: Only include objects on the current host in the DatabaseCache



This allows us to remove a bunch of checks for the speicific host from other 
functions.

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

diff -r bcbca445b898 -r 5a6964b8b30b 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
@@ -398,23 +398,66 @@
     return f
 
 class DatabaseCache(object):
+    def __pif_on_host(self,pif):
+        return self.__pifs.has_key(pif)
+
+    def __get_pif_records_from_xapi(self, session, host):
+        self.__pifs = {}
+        for (p,rec) in session.xenapi.PIF.get_all_records().items():
+            if rec['host'] != host:
+                continue
+            self.__pifs[p] = rec
+
+    def __get_vlan_records_from_xapi(self, session):
+        self.__vlans = {}
+        for v in session.xenapi.VLAN.get_all():
+            rec = session.xenapi.VLAN.get_record(v)
+            if not self.__pif_on_host(rec['untagged_PIF']):
+                continue
+            self.__vlans[v] = rec
+
+    def __get_bond_records_from_xapi(self, session):
+        self.__bonds = {}
+        for b in session.xenapi.Bond.get_all():
+            rec = session.xenapi.Bond.get_record(b)
+            if not self.__pif_on_host(rec['master']):
+                continue
+            self.__bonds[b] = rec
+
+    def __get_network_records_from_xapi(self, session):
+        self.__networks = {}
+        for n in session.xenapi.network.get_all():
+            rec = session.xenapi.network.get_record(n)
+            self.__networks[n] = rec
+            # drop PIFs on other hosts
+            self.__networks[n]["PIFs"] = [p for p in rec["PIFs"] if 
self.__pif_on_host(p)]
+
     def __init__(self, session_ref):
-        session = XenAPI.xapi_local()
+            # XXX extra level of indendation temporarily reduces diff until 
XML cache patch
+            session = XenAPI.xapi_local()
 
-        if not session_ref:
-            log("No session ref given on command line, logging in.")
-            session.xenapi.login_with_password("root", "")
-        else:
-            session._session = session_ref
+            if not session_ref:
+                log("No session ref given on command line, logging in.")
+                session.xenapi.login_with_password("root", "")
+            else:
+                session._session = session_ref
 
-        try:
-            self.__vlans = session.xenapi.VLAN.get_all_records()
-            self.__bonds = session.xenapi.Bond.get_all_records()
-            self.__pifs = session.xenapi.PIF.get_all_records()
-            self.__networks = session.xenapi.network.get_all_records()
-        finally:
-            if not session_ref:
-                session.xenapi.session.logout()
+            try:
+
+                inventory = self.__read_xensource_inventory()
+                assert(inventory.has_key('INSTALLATION_UUID'))
+                log("host uuid is %s" % inventory['INSTALLATION_UUID'])
+
+                host = 
session.xenapi.host.get_by_uuid(inventory['INSTALLATION_UUID'])
+
+                self.__get_pif_records_from_xapi(session, host)
+
+                self.__get_vlan_records_from_xapi(session)
+                self.__get_bond_records_from_xapi(session)
+                self.__get_network_records_from_xapi(session)
+            finally:
+                if not session_ref:
+                    session.xenapi.session.logout()
 
     def get_pif_by_uuid(self, uuid):
         pifs = map(lambda (ref,rec): ref,
@@ -427,25 +470,10 @@
 
         return pifs[0]
 
-    def get_pif_by_record(self, record):
-        """record is partial pif record.
-        Get the pif whose record matches.
-        """
-        def match(pifrec):
-            for key in record:
-                if record[key] != pifrec[key]:
-                    return False
-            return True
-            
-        pifs = map(lambda (ref,rec): ref,
-                  filter(lambda (ref,rec): match(rec),
-                         self.__pifs.items()))
-        if len(pifs) == 0:
-            raise Error("No matching PIF \"%s\"" % str(record))
-        elif len(pifs) > 1:
-            raise Error("Multiple matching PIFs \"%s\"" % str(record))
-
-        return pifs[0]
+    def get_pifs_by_device(self, device):
+        return map(lambda (ref,rec): ref,
+                   filter(lambda (ref,rec): rec['device'] == device,
+                          self.__pifs.items()))
 
     def get_pif_record(self, pif):
         if self.__pifs.has_key(pif):
@@ -455,15 +483,14 @@
         return self.__pifs
     def pif_exists(self, pif):
         return self.__pifs.has_key(pif)
-    
-    def get_management_pif(self, host):
+
+    def get_management_pif(self):
         """ Returns the management pif on host
         """
         all = self.get_all_pifs()
-        for pif in all: 
+        for pif in all:
             pifrec = self.get_pif_record(pif)
-            if pifrec['management'] and pifrec['host'] == host :
-                return pif
+            if pifrec['management']: return pif
         return None
 
     def get_network_record(self, network):
@@ -613,7 +640,6 @@
     """
     
     pifrec = db.get_pif_record(pif)
-    host = pifrec['host']
     nw = pifrec['network']
     nwrec = db.get_network_record(nw)
     oc = None
@@ -668,8 +694,7 @@
     # This is because when we are called to bring up an interface with a bond 
master, it is implicit that
     # we should bring down that master.
     pifs_on_host = [ __pif for __pif in db.get_all_pifs() if
-                     db.get_pif_record(__pif)['host'] == host and 
-                     (not  __pif in get_bond_masters_of_pif(pif)) ]
+                     not  __pif in get_bond_masters_of_pif(pif) ]
     other_pifs_on_host = [ __pif for __pif in pifs_on_host if __pif != pif ]
 
     peerdns_pif = None
@@ -782,7 +807,6 @@
     """Returns a list of PIFs which make up the given bonded pif."""
     
     pifrec = db.get_pif_record(pif)
-    host = pifrec['host']
 
     bmo = pifrec['bond_master_of']
     if len(bmo) > 1:
@@ -804,8 +828,8 @@
     try:
         attached_slaves = open("/sys/class/net/%s/bonding/slaves" % 
pifrec['device']).readline().split()
         for slave in attached_slaves:
-            partial_pifrec = {'host':host, 'device':slave}
-            slave_pif = db.get_pif_by_record(partial_pifrec)
+            pifs = [p for p in db.get_pifs_by_device(slave) if 
db.get_pif_record(p)['VLAN'] == '-1']
+            slave_pif = pifs[0]
             slave_pifs.remove(slave_pif)
             slave_pifs.insert(0, slave_pif)
     except IOError:
@@ -1548,8 +1572,7 @@
                 # 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)
-                host = pifrec['host']
-                management_pif = db.get_management_pif(host)
+                management_pif = db.get_management_pif()
 
             log_pif_action(action, pif)
 

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.