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
-
+ 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
- (*) 'plcname' : the peer name
- (*) 'new_nodes' : the number of new nodes from that peer - may be negative
- (*) 'new_slices': the number of new slices from that peer - may be negative
+ (*) '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(dict, "plcname, new_nodes, new_slices")
+ returns = Parameter(dict,
+ 'new_sites '
+ 'new_keys '
+ 'new_nodes '
+ 'new_persons '
+ 'new_slice_attribute_types '
+ 'new_slices '
+ 'new_slice_attributes '
+ 'timers ')
- def call (self, auth, peer_id):
+ def call (self, auth, peer_id_or_peername):
### retrieve peer info
- peers = Peers (self.api,[peer_id])
+ peers = Peers (self.api,[peer_id_or_peername])
try:
peer=peers[0]
except:
- raise PLCInvalidArgument,'no such peer_id:%d'%peer_id
+ raise PLCInvalidArgument,'RefreshPeer: no such peer:%r'%peer_id_or_peername
### retrieve account info
- person_id = peer['person_id']
- persons = Persons (self.api,[person_id])
+ auth_person_id = peer['auth_person_id']
+ persons = Persons (self.api,[auth_person_id])
try:
person = persons[0]
except:
- raise PLCInvalidArgument,'no such person_id:%d'%person_id
+ raise PLCInvalidArgument,'RefreshPeer: no such person_id:%d'%auth_person_id
+ ## connect to the peer's API
+ url=peer['peer_url']
+ apiserver = xmlrpclib.ServerProxy (url,allow_none=True)
+
### build up foreign auth
auth={ 'Username': person['email'],
'AuthMethod' : 'password',
'AuthString' : person['password'],
- 'Role' : 'admin' }
+ 'Role' : 'admin' ,
+ }
- ## connect to the peer's API
- url=peer['peer_url']
- print 'url=',url
- apiserver = xmlrpclib.Server (url)
- print 'auth=',auth
-
- 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)
+ # xxx
+ # right now we *need* the remote peer to know our name
+ # (this is used in the GetPeerData that we issue)
+ # in general this will be true
+ # however if anyone decides to change its own plc name things can get wrong
+ # doing this should ensure things become right again after some iterations
+ # that is, hopefully
+ # might wish to change this policy once we have peer authentication, maybe
- return {'plcname':self.api.config.PLC_NAME,
- 'new_nodes':nb_new_nodes,
- 'new_slices':nb_new_slices}
+ # make sure we have the right name for that peer
+ peername = apiserver.GetPeerName (auth)
+ peer.update_name(peername)
+
+ # we need a peer_id from there on
+ peer_id = peer['peer_id']
+
+ print 'Got peer_id',peer_id
+
+ cache = Cache (self.api, peer_id, apiserver, auth)
+ result = cache.refresh_peer ()
+ result['peername']=peername
+
+ return result