X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FRefreshPeer.py;h=4d5d1144c17faf5ff3fa86d791c59c0e31f6c827;hb=dfd614ed44d424d6677599d55dc8ccf76f274a2b;hp=21ebf0a23a7017fb8f5c05bdb5e5a9089d5a32a1;hpb=93a6ed94c2f71f4f44a4d4487c442efe9df0c435;p=plcapi.git diff --git a/PLC/Methods/RefreshPeer.py b/PLC/Methods/RefreshPeer.py index 21ebf0a..4d5d114 100644 --- a/PLC/Methods/RefreshPeer.py +++ b/PLC/Methods/RefreshPeer.py @@ -16,42 +16,53 @@ 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_sites': the number of new sites from that peer - may be negative - (*) 'new_keys': - (*) 'new_nodes': - (*) 'new_persons': - (*) 'new_slices': + (*) '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_sites, new_keys, new_nodes, new_persons, 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'] @@ -61,7 +72,29 @@ class RefreshPeer(Method): auth={ 'Username': person['email'], 'AuthMethod' : 'password', 'AuthString' : person['password'], - 'Role' : 'admin' } + 'Role' : 'admin' , + } + + # 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 + + # 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) - return cache.refresh_peer () + result = cache.refresh_peer () + result['peername']=peername + + return result