9bc0c635d5fb22f841f8746b6eb89b614dc7cb30
[plcapi.git] / PLC / ForeignNodes.py
1 #
2 # Thierry Parmentelat - INRIA
3
4
5 from types import StringTypes
6
7 from PLC.Table import Row, Table
8 from PLC.Parameter import Parameter
9
10 class ForeignNode (Row) :
11     """
12     This object stores information about nodes hosted on 
13     other peering instances of myplc
14     """
15
16     table_name = 'nodes'
17     primary_key = 'node_id'
18
19     fields = {
20         'node_id': Parameter (int, "Node Id"),
21         'hostname': Parameter (str, "Node name"),
22         'peer_id': Parameter (str, "Peer id"),
23         'boot_state' : Parameter (str, "Boot state, see Node"),
24         'model' : Parameter (str,"Model, see Node"),
25         'version' : Parameter (str,"Version, see Node"),
26         'date_created': Parameter(int, "Creation time, see Node"),
27         'last_updated': Parameter(int, "Update time, see Node"),
28         }
29
30     def __init__(self,api,fields={},uptodate=True):
31         Row.__init__(self,api,fields)
32         self.uptodate=uptodate
33
34     def delete (self, commit=True):
35         """
36         Delete existing foreign node.
37         """
38         print 'in ForeignNode::delete',self
39         self['deleted']=True
40         self.sync(commit)
41         
42
43 class ForeignNodes (Table):
44
45     def __init__ (self, api, foreign_node_id_or_hostname_list=None):
46
47         self.api=api
48
49         sql =""
50         sql += "SELECT %s FROM view_foreign_nodes " % ", ".join(ForeignNode.fields)
51         sql += "WHERE view_foreign_nodes.deleted IS False " 
52
53         if foreign_node_id_or_hostname_list:
54             foreign_node_id_list = [ str(x) for x in foreign_node_id_or_hostname_list 
55                                      if isinstance(x, (int,long))]
56             hostname_list = [ x for x in foreign_node_id_or_hostname_list
57                               if isinstance(x, StringTypes)]
58             sql += " AND (False"
59             if foreign_node_id_list:
60                 sql += " OR node_id in (%s)" % ", ".join(foreign_node_id_list)
61             if hostname_list:
62                 ## figure how to retrieve peer_id from the hostname(s)
63                 sql += " OR hostname IN (%s)" % ", ".join(api.db.quote(hostname_list))
64             sql += ")"
65
66         rows = self.api.db.selectall (sql)
67
68         for row in rows:
69             self[row['hostname']] = ForeignNode (api,row)
70
71
72