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