2 # Thierry Parmentelat - INRIA
7 from PLC.Faults import *
8 from PLC.Method import Method
9 from PLC.Parameter import Parameter, Mixed
10 from PLC.Auth import Auth
12 from PLC.Peers import Peer, Peers
13 from PLC.Persons import Person, Persons
14 from PLC.ForeignNodes import ForeignNode, ForeignNodes
17 class UpdatePeer(Method):
19 Query a peer PLC for its list of nodes, and refreshes
20 the local database accordingly
28 Parameter (int, "Peer id") ]
32 def call (self, auth, peer_id):
34 ### retrieve peer info
35 peers = Peers (self.api)
38 ### retrieve account info
39 person_id = peer['person_id']
40 persons = Persons (self.api,[person_id])
41 person = persons[person_id]
43 ### build up foreign auth
44 auth={ 'Username': person['email'],
45 'AuthMethod' : 'password',
46 'AuthString' : person['password'],
49 ## connect to the peer's API
50 apiserver = xmlrpclib.Server (peer['peer_url']+"/PLCAPI/")
52 current_peer_nodes = apiserver.GetNodes(auth,[])
54 ## manual feed for tests
55 # n1 = {'hostname': 'n1.plc', 'boot_state': 'inst'}
56 # n2 = {'hostname': 'n2.plc', 'boot_state': 'inst'}
57 # n3 = {'hostname': 'n3.plc', 'boot_state': 'inst'}
58 # current_peer_nodes = [n2,n3]
61 # we get the whole table just in case
62 # a host would have switched from one plc to the other
63 foreign_nodes = ForeignNodes (self.api)
65 ### mark entries for this peer outofdate
66 for foreign_node in foreign_nodes.values():
67 if foreign_node['peer_id'] == peer_id:
68 foreign_node.uptodate=False
70 ### scan the new entries, and mark them uptodate
71 for node in current_peer_nodes:
72 hostname = node['hostname']
73 foreign_node = foreign_nodes.get(hostname)
76 foreign_node['peer_id'] = peer_id
77 foreign_node['boot_state'] = node['boot_state']
78 foreign_node.uptodate = True
80 foreign_nodes[hostname] = ForeignNode(self.api,
82 'boot_state':node['boot_state'],
84 foreign_nodes[hostname].sync()
86 ### delete entries that are not uptodate
87 [ x.delete() for x in foreign_nodes.values() if not x.uptodate ]