# Thierry Parmentelat - INRIA
#
-import xmlrpclib
-
from PLC.Faults import *
from PLC.Method import Method
from PLC.Parameter import Parameter, Mixed
from PLC.Peers import Peer, Peers
from PLC.Persons import Person, Persons
-##from PLC.ForeignNodes import ForeignNode, ForeignNodes
+from PLC.Cache import Cache
class RefreshPeer(Method):
"""
- Query a peer PLC for its list of nodes, and refreshes
- the local database accordingly
-
- Returns a tuple containing
- (*) the peer name
- (*) the number of new nodes from that peer - may be negative
- (*) the number of new slices from that peer - may be negative
+ First queries a remote PLC for its name and updates the local peers table
+
+ Then proceeds with fetching objects on the remote PLC, and updates the
+ local database accordingly
+
+ It requires the remote peer to be aware of our own name (as configured in PLC_NAME)
+
+ Returns a dict containing
+ (*) 'peername' : the peer's name
+ (*) 'new_xxx': the number of new objects from that peer - may be negative
+ (*) 'timers': various stats on performance for optimization
+
"""
roles = ['admin']
accepts = [ Auth(),
- Parameter (int, "Peer id") ]
+ Mixed(Peer.fields['peer_id'],
+ Peer.fields['peername']),
+ ]
- returns = Parameter(int, "Delta in number of foreign nodes attached to that peer")
+ returns = {
+ 'new_sites': Parameter([dict], "List of new sites"),
+ 'new_keys': Parameter([dict], "List of new keys"),
+ 'new_nodes': Parameter([dict], "List of new nodes"),
+ 'new_persons': Parameter([dict], "List of new users"),
+ 'new_slice_attribute_types': Parameter([dict], "List of new slice attribute types"),
+ 'new_slices': Parameter([dict], "List of new slices"),
+ 'new_slice_attributes': Parameter([dict], "List of new slice attributes"),
+ 'timers': Parameter(dict, "(Debug) Timing information"),
+ }
+
+ def call (self, auth, peer_id_or_peername):
+ peers = Peers(self.api, [peer_id_or_peername])
+ if not peers:
+ raise PLCInvalidArgument, "No such peer '%s'" % unicode(peer_id_or_peername)
+ peer = peers[0]
+
+ # Connect to peer API
+ peer.connect()
+
+ # Update peer name
+ peername = peer.GetPeerName()
+ if peer['peername'] != peername:
+ peer['peername'] = peername
+ peer.sync()
- def call (self, auth, peer_id):
-
- ### retrieve peer info
- peers = Peers (self.api,[peer_id])
- try:
- peer=peers[0]
- except:
- raise PLCInvalidArgument,'no such peer_id:%d'%peer_id
-
- ### retrieve account info
- person_id = peer['person_id']
- persons = Persons (self.api,[person_id])
- try:
- person = persons[0]
- except:
- raise PLCInvalidArgument,'no such person_id:%d'%person_id
-
- ### build up foreign auth
- auth={ 'Username': person['email'],
- 'AuthMethod' : 'password',
- 'AuthString' : person['password'],
- 'Role' : 'admin' }
+ cache = Cache(self.api, peer['peer_id'], peer)
+ result = cache.refresh_peer()
- ## connect to the peer's API
- url=peer['peer_url']
- print 'url=',url
- apiserver = xmlrpclib.Server (url)
- print 'auth=',auth
+ # Add peer name to result set
+ result['peername'] = peername
- peer_get_nodes = apiserver.GetNodes(auth)
- nb_new_nodes = peer.refresh_nodes(peer_get_nodes)
-
- # rough and temporary
- peer_foreign_nodes = apiserver.GetForeignNodes(auth)
- peer_get_slices = apiserver.GetSlices(auth)
- nb_new_slices = peer.refresh_slices(peer_get_slices,peer_foreign_nodes)
-
- return (self.api.config.PLC_NAME,nb_new_nodes,nb_new_slices)
+ return result