now returns a dict rather than a tuple
[plcapi.git] / PLC / Methods / RefreshPeer.py
1 #
2 # Thierry Parmentelat - INRIA
3
4
5 import xmlrpclib
6
7 from PLC.Faults import *
8 from PLC.Method import Method
9 from PLC.Parameter import Parameter, Mixed
10 from PLC.Auth import Auth
11
12 from PLC.Peers import Peer, Peers
13 from PLC.Persons import Person, Persons
14 ##from PLC.ForeignNodes import ForeignNode, ForeignNodes
15
16
17 class RefreshPeer(Method):
18     """
19     Query a peer PLC for its list of nodes, and refreshes
20     the local database accordingly
21     
22     Returns a dict containing
23     (*) 'plcname' :   the peer name
24     (*) 'new_nodes' : the number of new nodes from that peer - may be negative
25     (*) 'new_slices': the number of new slices from that peer - may be negative
26     """
27     
28     roles = ['admin']
29     
30     accepts = [ Auth(),
31                 Parameter (int, "Peer id") ]
32     
33     returns = Parameter(dict, "plcname, new_nodes, new_slices")
34
35     def call (self, auth, peer_id):
36         
37         ### retrieve peer info
38         peers = Peers (self.api,[peer_id])
39         try:
40             peer=peers[0]
41         except:
42             raise PLCInvalidArgument,'no such peer_id:%d'%peer_id
43         
44         ### retrieve account info
45         person_id = peer['person_id']
46         persons = Persons (self.api,[person_id])
47         try:
48             person = persons[0]
49         except:
50             raise PLCInvalidArgument,'no such person_id:%d'%person_id
51         
52         ### build up foreign auth
53         auth={ 'Username': person['email'],
54                'AuthMethod' : 'password',
55                'AuthString' : person['password'],
56                'Role' : 'admin' }
57
58         ## connect to the peer's API
59         url=peer['peer_url']
60         print 'url=',url
61         apiserver = xmlrpclib.Server (url)
62         print 'auth=',auth
63
64         peer_get_nodes = apiserver.GetNodes(auth)
65         nb_new_nodes = peer.refresh_nodes(peer_get_nodes)
66         
67         # rough and temporary
68         peer_foreign_nodes = apiserver.GetForeignNodes(auth)
69         peer_get_slices = apiserver.GetSlices(auth)
70         nb_new_slices = peer.refresh_slices(peer_get_slices,peer_foreign_nodes)
71         
72         return {'plcname':self.api.config.PLC_NAME,
73                 'new_nodes':nb_new_nodes,
74                 'new_slices':nb_new_slices}