- be a little more verbose in the returns doc
[plcapi.git] / PLC / Methods / RefreshPeer.py
index 8f4aaef..5ab4bcf 100644 (file)
@@ -2,8 +2,6 @@
 # Thierry Parmentelat - INRIA
 # 
 
-import xmlrpclib
-
 from PLC.Faults import *
 from PLC.Method import Method
 from PLC.Parameter import Parameter, Mixed
@@ -11,64 +9,62 @@ from PLC.Auth import Auth
 
 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 = {
+        '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 {'plcname':self.api.config.PLC_NAME,
-                'new_nodes':nb_new_nodes,
-                'new_slices':nb_new_slices}
+        return result