3 # implements support for geni records
5 # TODO: Use existing PLC database methods? or keep this separate?
9 GENI_TABLE_PREFIX = "geni$"
11 # Record is a tuple (Name, GID, Type, Info)
12 # info is comprised of the following sub-fields
13 # pointer = a pointer to the record in the PL database
14 # pl_info = planetlab-specific info (when talking to client)
15 # geni_info = geni-specific info (when talking to client)
18 def __init__(self, name=None, gid=None, type=None, pointer=None, dict=None):
29 self.set_pointer(pointer)
31 self.set_name(dict['name'])
32 self.set_gid(dict['gid'])
33 self.set_type(dict['type'])
34 self.set_pointer(dict['pointer'])
36 self.set_pl_info(dict["pl_info"])
37 if "geni_info" in dict:
38 self.set_geni_info(dict["geni_info"])
40 def set_name(self, name):
44 def set_gid(self, gid):
48 def set_type(self, type):
52 def set_pointer(self, pointer):
53 self.pointer = pointer
56 def set_pl_info(self, pl_info):
57 self.pl_info = pl_info
60 def set_geni_info(self, geni_info):
61 self.geni_info = geni_info
64 def get_pl_info(self):
70 def get_geni_info(self):
76 def get_pointer(self):
80 return self.name + "#" + self.type
82 def get_field_names(self):
83 return ["name", "gid", "type", "pointer"]
85 def get_field_value_string(self, fieldname):
86 if fieldname == "key":
89 val = getattr(self, fieldname)
90 if isinstance(val, str):
91 return "'" + str(val) + "'"
95 def get_field_value_strings(self, fieldnames):
97 for fieldname in fieldnames:
98 strs.append(self.get_field_value_string(fieldname))
103 names = self.get_field_names()
105 dict[name] = self.getattr(name)
108 dict['pl_info'] = self.pl_info
111 dict['geni_info'] = self.geni_info
117 # Represents a single table on a registry for a single authority.
120 def __init__(self, create=False, hrn="unspecified.default.registry", cninfo=None):
121 global GENI_TABLE_PREFIX
125 # pgsql doesn't like table names with "." in them, to replace it with "$"
126 self.tablename = GENI_TABLE_PREFIX + self.hrn.replace(".", "$")
128 # establish a connection to the pgsql server
129 self.cnx = DB(cninfo['dbname'], cninfo['address'], port=cninfo['port'], user=cninfo['user'], passwd=cninfo['password'])
131 # if asked to create the table, then create it
136 tableList = self.cnx.get_tables()
137 return (self.tablename in tableList)
140 querystr = "CREATE TABLE " + self.tablename + " ( \
147 self.cnx.query('DROP TABLE IF EXISTS ' + self.tablename)
148 self.cnx.query(querystr)
150 def remove(self, record):
151 query_str = "DELETE FROM " + self.tablename + " WHERE key = '" + record.get_key() + "'"
152 self.cnx.quert(query_str)
154 def insert(self, record):
155 fieldnames = ["key"] + record.get_field_names()
156 fieldvals = record.get_field_value_strings(fieldnames)
157 query_str = "INSERT INTO " + self.tablename + \
158 "(" + ",".join(fieldnames) + ") " + \
159 "VALUES(" + ",".join(fieldvals) + ")"
161 self.cnx.query(query_str)
163 def update(self, record):
164 names = record.get_field_names()
167 val = record.get_field_value_string(name)
168 pairs.append(name + " = " + val)
169 update = ", ".join(pairs)
171 query_str = "UPDATE " + self.tablename+ " SET " + update + " WHERE key = '" + record.get_key() + "'"
173 self.cnx.query(query_str)
175 def resolve_dict(self, type, hrn):
176 query_str = "SELECT * FROM " + self.tablename + " WHERE name = '" + hrn + "'"
177 dict_list = self.cnx.query(query_str).dictresult()
178 result_dict_list = []
179 for dict in dict_list:
180 if (type=="*") or (dict['type'] == type):
181 result_dict_list.append(dict)
182 return result_dict_list
184 def resolve(self, type, hrn):
185 result_dict_list = self.resolve_dict(type, hrn)
187 for dict in result_dict_list:
188 result_rec_list.append(GeniRecord(dict=dict))
189 return result_rec_list
192 query_str = "SELECT * FROM " + self.tablename
193 result_dict_list = self.cnx.query(query_str).dictresult()
194 return result_dict_list
197 result_dict_list = self.list_dict()
199 for dict in result_dict_list:
200 result_rec_list.append(GeniRecord(dict=dict))
201 return result_rec_list
203 def set_geni_table_prefix(x):
204 global GENI_TABLE_PREFIX
206 GENI_TABLE_PREFIX = x
208 def geni_records_purge(cninfo):
209 global GENI_TABLE_PREFIX
211 cnx = DB(cninfo['dbname'], cninfo['address'], port=cninfo['port'], user=cninfo['user'], passwd=cninfo['password'])
212 tableList = cnx.get_tables()
213 for table in tableList:
214 if table.startswith(GENI_TABLE_PREFIX):
215 cnx.query("DROP TABLE " + table)