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
|