split tables from records
[sfa.git] / util / record.py
1 # record.py
2 #
3 # implements support for geni records
4 #
5 # TODO: Use existing PLC database methods? or keep this separate?
6
7 import report
8
9 # Record is a tuple (Name, GID, Type, Info)
10 #    info is comprised of the following sub-fields
11 #        pointer = a pointer to the record in the PL database
12 #        pl_info = planetlab-specific info (when talking to client)
13 #        geni_info = geni-specific info (when talking to client)
14
15 class GeniRecord():
16     def __init__(self, name=None, gid=None, type=None, pointer=None, dict=None):
17         self.dirty = True
18         self.pl_info = None
19         self.geni_info = None
20         if name:
21             self.set_name(name)
22         if gid:
23             self.set_gid(gid)
24         if type:
25             self.set_type(type)
26         if pointer:
27             self.set_pointer(pointer)
28         if dict:
29             self.set_name(dict['name'])
30             self.set_gid(dict['gid'])
31             self.set_type(dict['type'])
32             self.set_pointer(dict['pointer'])
33             if "pl_info" in dict:
34                self.set_pl_info(dict["pl_info"])
35             if "geni_info" in dict:
36                self.set_geni_info(dict["geni_info"])
37
38     def set_name(self, name):
39         self.name = name
40         self.dirty = True
41
42     def set_gid(self, gid):
43         if isinstance(gid, str):
44             self.gid = gid
45         else:
46             self.gid = gid.save_to_string(save_parents=True)
47         self.dirty = True
48
49     def set_type(self, type):
50         self.type = type
51         self.dirty = True
52
53     def set_pointer(self, pointer):
54         self.pointer = pointer
55         self.dirty = True
56
57     def set_pl_info(self, pl_info):
58         self.pl_info = pl_info
59         self.dirty = True
60
61     def set_geni_info(self, geni_info):
62         self.geni_info = geni_info
63         self.dirty = True
64
65     def get_pl_info(self):
66         if self.pl_info:
67             return self.pl_info
68         else:
69             return {}
70
71     def get_geni_info(self):
72         if self.geni_info:
73             return self.geni_info
74         else:
75             return {}
76
77     def get_name(self):
78         return self.name
79
80     def get_type(self):
81         return self.type
82
83     def get_pointer(self):
84         return self.pointer
85
86     # TODO: not the best name for the function, because we have things called gidObjects in the Cred
87     def get_gid_object(self):
88         return GID(string=self.gid)
89
90     def get_key(self):
91         return self.name + "#" + self.type
92
93     def get_field_names(self):
94         return ["name", "gid", "type", "pointer"]
95
96     def get_field_value_string(self, fieldname):
97         if fieldname == "key":
98             val = self.get_key()
99         else:
100             val = getattr(self, fieldname)
101         if isinstance(val, str):
102             return "'" + str(val) + "'"
103         else:
104             return str(val)
105
106     def get_field_value_strings(self, fieldnames):
107         strs = []
108         for fieldname in fieldnames:
109             strs.append(self.get_field_value_string(fieldname))
110         return strs
111
112     def as_dict(self):
113         dict = {}
114         names = self.get_field_names()
115         for name in names:
116             dict[name] = getattr(self, name)
117
118         if self.pl_info:
119             dict['pl_info'] = self.pl_info
120
121         if self.geni_info:
122             dict['geni_info'] = self.geni_info
123
124         return dict
125
126     def dump(self, dump_parents=False):
127         print "RECORD", self.name
128         print "        hrn:", self.name
129         print "       type:", self.type
130         print "        gid:"
131         self.get_gid_object().dump(8, dump_parents)
132         print "    pointer:", self.pointer
133
134         print "  geni_info:"
135         geni_info = getattr(self, "geni_info", {})
136         if geni_info:
137             for key in geni_info.keys():
138                 print "       ", key, ":", geni_info[key]
139
140         print "    pl_info:"
141         pl_info = getattr(self, "pl_info", {})
142         if pl_info:
143             for key in pl_info.keys():
144                 print "       ", key, ":", pl_info[key]
145
146