X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FGetPeerData.py;h=f4681ef88805d849b55ea8270d05c013518c7f62;hb=053fd6410f733aef90482cda571059ed116d40e1;hp=d6ef1e38280b5238cc582f65e034f0d9f5d67289;hpb=dfd614ed44d424d6677599d55dc8ccf76f274a2b;p=plcapi.git diff --git a/PLC/Methods/GetPeerData.py b/PLC/Methods/GetPeerData.py index d6ef1e3..f4681ef 100644 --- a/PLC/Methods/GetPeerData.py +++ b/PLC/Methods/GetPeerData.py @@ -1,6 +1,8 @@ # # Thierry Parmentelat - INRIA -# +# +# $Id$ +# $URL$ import time @@ -15,60 +17,70 @@ from PLC.Sites import Site, Sites from PLC.Keys import Key, Keys from PLC.Nodes import Node, Nodes from PLC.Persons import Person, Persons -from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes from PLC.Slices import Slice, Slices -from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.SliceTags import SliceTags -class GetPeerData (Method): +class GetPeerData(Method): """ - Gather all data needed by RefreshPeer in a single xmlrpc request + Returns lists of local objects that a peer should cache in its + database as foreign objects. Also returns the list of foreign + nodes in this database, for which the calling peer is + authoritative, to assist in synchronization of slivers. - Expects a peer id or peer name, that identifies the requesting peer - - Returns a dict containing, for the various types of cached entities, - the local objects as well as the ones attached to that peer + See the implementation of RefreshPeer for how this data is used. """ - roles = ['admin'] - - accepts = [Auth(), - Mixed (Parameter (Peer.fields['peer_id']), - Parameter (Peer.fields['peername'])), - ] - # for RefreshPeer - returns = Parameter (dict, - "Sites-local Sites-peer Keys-local Keys-peer " - "Nodes-local Nodes-peer Persons-local Persons-peer " - "SliceAttibuteTypes-local SliceAttibuteTypes-peer " - "Slices-local Slices-peer " - "SliceAttributes-local SliceAttributes-peer") - - def call (self, auth, peer_id_or_peername): - - # checking the argument - try: - peer_id = Peers(self.api,[peer_id_or_peername])[0]['peer_id'] - except: - raise PLCInvalidArgument,'GetPeerData: no such peer %r'%peer_id_or_peername - - t_start = time.time() + roles = ['admin', 'peer'] + + accepts = [Auth()] + + returns = { + 'Sites': Parameter([dict], "List of local sites"), + 'Keys': Parameter([dict], "List of local keys"), + 'Nodes': Parameter([dict], "List of local nodes"), + 'Persons': Parameter([dict], "List of local users"), + 'Slices': Parameter([dict], "List of local slices"), + 'db_time': Parameter(float, "(Debug) Database fetch time"), + } + + def call (self, auth): + start = time.time() + + # Filter out various secrets + node_fields = [ field for field in Node.fields if field \ + not in ['boot_nonce', 'key', 'session', 'root_person_ids']] + nodes = Nodes(self.api, {'peer_id': None}, node_fields); + # filter out whitelisted nodes + nodes = [ n for n in nodes if not n['slice_ids_whitelist']] + + + person_fields = [ field for field in Person.fields if field \ + not in ['password', 'verification_key', 'verification_expires']] + + # XXX Optimize to return only those Persons, Keys, and Slices + # necessary for slice creation on the calling peer's nodes. + + # filter out special person + persons = Persons(self.api, {'~email':[self.api.config.PLC_API_MAINTENANCE_USER, + self.api.config.PLC_ROOT_USER], + 'peer_id': None}, person_fields) + + # filter out system slices + system_slice_ids = SliceTags(self.api, {'name': 'system', 'value': '1'}).dict('slice_id') + slices = Slices(self.api, {'peer_id': None, + '~slice_id':system_slice_ids.keys()}) + result = { - 'Sites-local' : Sites (self.api,{'peer_id':None}), - 'Sites-peer' : Sites (self.api,{'peer_id':peer_id}), - 'Keys-local' : Keys (self.api,{'peer_id':None}), - 'Keys-peer' : Keys (self.api,{'peer_id':peer_id}), - 'Nodes-local' : Nodes (self.api,{'peer_id':None}), - 'Nodes-peer' : Nodes (self.api,{'peer_id':peer_id}), - 'Persons-local' : Persons (self.api,{'peer_id':None}), - 'Persons-peer' : Persons (self.api,{'peer_id':peer_id}), - 'SliceAttibuteTypes-local' : SliceAttributeTypes (self.api,{'peer_id':None}), - 'SliceAttibuteTypes-peer' : SliceAttributeTypes (self.api,{'peer_id':peer_id}), - 'Slices-local' : Slices (self.api,{'peer_id':None}), - 'Slices-peer' : Slices (self.api,{'peer_id':peer_id}), - 'SliceAttributes-local': SliceAttributes (self.api,{'peer_id':None}), - 'SliceAttributes-peer': SliceAttributes (self.api,{'peer_id':peer_id}), + 'Sites': Sites(self.api, {'peer_id': None}), + 'Keys': Keys(self.api, {'peer_id': None}), + 'Nodes': nodes, + 'Persons': persons, + 'Slices': slices, } - t_end = time.time() - result['ellapsed'] = t_end-t_start + + if isinstance(self.caller, Peer): + result['PeerNodes'] = Nodes(self.api, {'peer_id': self.caller['peer_id']}) + + result['db_time'] = time.time() - start + return result -