X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=geni%2Futil%2Frecord.py;h=72d54c88a7556ccb660c2d1e47fd3333e0058e76;hb=707f7b96c09fc27ad3096ee6abe0dc8cf91db05a;hp=56aafae08f2fb2cb4e2b8bb1d7a2aee91ed36a81;hpb=5c961e50f9c9282ac4bca1c20c8dfd524c6e1853;p=sfa.git diff --git a/geni/util/record.py b/geni/util/record.py index 56aafae0..72d54c88 100644 --- a/geni/util/record.py +++ b/geni/util/record.py @@ -5,8 +5,9 @@ ## import report +from types import StringTypes from gid import * - +from geni.util.rspec import * ## # The GeniRecord class implements a Geni Record. A GeniRecord is a tuple # (Name, GID, Type, Info). @@ -28,7 +29,7 @@ from gid import * # of different types. For example, planetlab.us.arizona may have both an SA # and a MA record, but cannot have two SA records. -class GeniRecord(): +class GeniRecord: ## # Create a Geni Record @@ -75,7 +76,7 @@ class GeniRecord(): # @param gid is a GID object or the string representation of a GID object def set_gid(self, gid): - if isinstance(gid, str): + if isinstance(gid, StringTypes): self.gid = gid else: self.gid = gid.save_to_string(save_parents=True) @@ -105,6 +106,16 @@ class GeniRecord(): # @param pl_info is a dictionary containing planetlab info def set_pl_info(self, pl_info): + if isinstance(pl_info, list): + pl_info = pl_info[0] + + # Convert any boolean strings to real bools + for key in pl_info: + if isinstance(pl_info[key], StringTypes): + if pl_info[key].lower() in ["true"]: + pl_info[key] = True + elif pl_info[key].lower() in ["false"]: + pl_info[key] = False self.pl_info = pl_info self.dirty = True @@ -114,6 +125,8 @@ class GeniRecord(): # @param geni_info is a dictionary containing geni info def set_geni_info(self, geni_info): + if isinstance(geni_info, list): + geni_info = geni_info[0] self.geni_info = geni_info self.dirty = True @@ -229,12 +242,15 @@ class GeniRecord(): def load_from_dict(self, dict): self.set_name(dict['name']) - self.set_gid(dict['gid']) + gidstr = dict.get("gid", None) + if gidstr: + self.set_gid(dict['gid']) + self.set_type(dict['type']) self.set_pointer(dict['pointer']) - if "pl_info" in dict: + if "pl_info" in dict and dict['pl_info']: self.set_pl_info(dict["pl_info"]) - if "geni_info" in dict: + if "geni_info" in dict and dict['geni_info']: self.set_geni_info(dict["geni_info"]) ## @@ -242,8 +258,12 @@ class GeniRecord(): # the record. def save_to_string(self): + dict = self.as_dict() - str = xmlrpclib.dumps((dict,), allow_none=True) + record = RecordSpec() + record.parseDict(dict) + str = record.toxml() + #str = xmlrpclib.dumps((dict,), allow_none=True) return str ## @@ -251,8 +271,13 @@ class GeniRecord(): # representation of the record. def load_from_string(self, str): - dict = xmlrpclib.loads(str)[0][0] - self.load_from_dict(dict) + #dict = xmlrpclib.loads(str)[0][0] + + record = RecordSpec() + record.parseString(str) + record_dict = record.toDict() + geni_dict = record_dict['record'] + self.load_from_dict(geni_dict) ## # Dump the record to stdout @@ -284,8 +309,12 @@ class GeniRecord(): print " ", key, ":", pl_info[key] - def get(self): - info = {} - info.update(getattr(self, "geni_info", {})) - info.update(getattr(self, "pl_info", {})) + def getdict(self): + info = {'hrn': self.name, 'type': self.type, 'gid': self.gid} + geni_info = getattr(self, "geni_info", {}) + pl_info = getattr(self, "pl_info", {}) + if geni_info: + info.update(geni_info) + if pl_info: + info.update(pl_info) return info