2 # Thierry Parmentelat - INRIA
6 from types import StringTypes
8 from PLC.Table import Row, Table
9 from PLC.Parameter import Parameter
10 from PLC.Filter import Filter
12 class ForeignNode (Row) :
14 This object stores information about nodes hosted on
15 other peering instances of myplc
19 primary_key = 'node_id'
22 'node_id': Parameter (int, "Node Id"),
23 'hostname': Parameter (str, "Node name"),
24 'peer_id': Parameter (str, "Peer id"),
25 'boot_state' : Parameter (str, "Boot state, see Node"),
26 'model' : Parameter (str,"Model, see Node"),
27 'version' : Parameter (str,"Version, see Node"),
28 'date_created': Parameter(int, "Creation time, see Node"),
29 'last_updated': Parameter(int, "Update time, see Node"),
30 'slice_ids': Parameter([int], "List of slices on this node"),
33 def __init__(self,api,fields={},uptodate=True):
34 Row.__init__(self,api,fields)
35 self.uptodate=uptodate
37 def validate_date_created(self,timestamp):
38 return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(timestamp))
40 def validate_last_updated(self,timestamp):
41 return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(timestamp))
43 def purge_peer_node (self,commit=True):
44 sql = "DELETE FROM peer_node WHERE node_id=%d"%self['node_id']
49 def delete (self, commit=True):
51 Delete existing foreign node.
53 self.purge_peer_node()
58 class ForeignNodes (Table):
59 def __init__ (self, api, foreign_node_filter = None, columns = None):
60 Table.__init__(self, api, ForeignNode, columns)
63 sql += "SELECT %s FROM view_foreign_nodes " % ", ".join(self.columns)
64 sql += "WHERE deleted IS False "
66 if foreign_node_filter is not None:
67 if isinstance(foreign_node_filter, (list, tuple, set)):
68 # Separate the list into integers and strings
69 ints = filter(lambda x: isinstance(x, (int, long)), foreign_node_filter)
70 strs = filter(lambda x: isinstance(x, StringTypes), foreign_node_filter)
71 foreign_node_filter = Filter(ForeignNode.fields, {'node_id': ints, 'hostname': strs})
72 sql += " AND (%s)" % foreign_node_filter.sql(api, "OR")
73 elif isinstance(foreign_node_filter, dict):
74 foreign_node_filter = Filter(ForeignNode.fields, foreign_node_filter)
75 sql += " AND (%s)" % foreign_node_filter.sql(api, "AND")
79 # # managing an index by hostname
80 # def hostname_index(self):
81 # if 'hostname' not in self.columns:
82 # raise PLCFault,"ForeignNodes::index_hostname, hostname not selected"
84 # for foreign_node in self:
85 # self.index[foreign_node['hostname']]=foreign_node
87 # def hostname_add_by(self,foreign_node):
88 # self.index[foreign_node['hostname']]=foreign_node
90 # def hostname_locate(self,hostname):
91 # return self.index[hostname]