RefreshPeer now manages Site*Person and Person*Role relationships
authorMohamed Larabi <mohamed.larabi@inria.fr>
Fri, 6 Dec 2013 19:00:57 +0000 (20:00 +0100)
committerMohamed Larabi <mohamed.larabi@inria.fr>
Fri, 6 Dec 2013 19:00:57 +0000 (20:00 +0100)
PLC/Methods/RefreshPeer.py

index d9a6249..75b3a87 100644 (file)
@@ -21,6 +21,7 @@ from PLC.BootStates import BootState, BootStates
 from PLC.Nodes import Node, Nodes
 from PLC.SliceInstantiations import SliceInstantiations
 from PLC.Slices import Slice, Slices
 from PLC.Nodes import Node, Nodes
 from PLC.SliceInstantiations import SliceInstantiations
 from PLC.Slices import Slice, Slices
+from PLC.Roles import Role, Roles
 
 #################### settings
 # initial version was doing only one final commit
 
 #################### settings
 # initial version was doing only one final commit
@@ -118,7 +119,7 @@ class RefreshPeer(Method):
                         'address_ids', 'node_ids', 'person_ids', 'pcu_ids', 'slice_ids' ]
     ignore_key_fields=['peer_id','peer_key_id', 'person_id']
     ignore_person_fields=['peer_id','peer_person_id','last_updated','date_created',
                         'address_ids', 'node_ids', 'person_ids', 'pcu_ids', 'slice_ids' ]
     ignore_key_fields=['peer_id','peer_key_id', 'person_id']
     ignore_person_fields=['peer_id','peer_person_id','last_updated','date_created',
-                          'roles','role_ids','key_ids','site_ids','slice_ids','person_tag_ids']
+                          'key_ids','slice_ids','person_tag_ids']
     ignore_node_fields=['peer_id','peer_node_id','last_updated','last_contact','date_created',
                         'node_tag_ids', 'interface_ids', 'slice_ids', 'nodegroup_ids','pcu_ids','ports']
     ignore_slice_fields=['peer_id','peer_slice_id','created',
     ignore_node_fields=['peer_id','peer_node_id','last_updated','last_contact','date_created',
                         'node_tag_ids', 'interface_ids', 'slice_ids', 'nodegroup_ids','pcu_ids','ports']
     ignore_slice_fields=['peer_id','peer_slice_id','created',
@@ -448,6 +449,7 @@ class RefreshPeer(Method):
                 person['peer_id'] = peer_id
                 person['peer_person_id'] = peer_person_id
                 person['key_ids'] = []
                 person['peer_id'] = peer_id
                 person['peer_person_id'] = peer_person_id
                 person['key_ids'] = []
+     
 
             # User as viewed by peer
             peer_person = persons_at_peer[peer_person_id]
 
             # User as viewed by peer
             peer_person = persons_at_peer[peer_person_id]
@@ -672,6 +674,69 @@ class RefreshPeer(Method):
 
         timers['slices'] = time.time() - start
 
 
         timers['slices'] = time.time() - start
 
+
+        #
+        # Persons x Sites
+        #
+        start = time.time()
+
+        message('Dealing Sites X Persons relationship')
+
+        for peer_site_id, site in peer_sites.iteritems():
+            # Site as viewed by peer
+            peer_site = sites_at_peer[peer_site_id]
+
+            # Persons that are currently part of the site
+            old_site_person_ids = [ person_transcoder[person_id] for person_id in site['person_ids'] \
+                                   if person_id in person_transcoder and person_transcoder[person_id] in peer_persons]
+
+            # Perons that should be part of the site
+            site_person_ids = [ person_id for person_id in peer_site['person_ids'] if person_id in peer_persons]
+
+            # Remove stale persons from site
+            for person_id in (set(old_site_person_ids) - set(site_person_ids)):
+                site.remove_person(peer_persons[person_id], commit = commit_mode)
+                message ("%s person %s removed from site %s"%(peer['peername'], peer_persons[person_id]['email'], site['login_base']))
+
+            # Add new persons to site
+            for person_id in (set(site_person_ids) - set(old_site_person_ids)):
+                site.add_person(peer_persons[person_id], commit = commit_mode)
+                message ("%s person %s added into site %s"%(peer['peername'], peer_persons[person_id]['email'], site['login_base']))
+
+        timers['sites-persons'] = time.time() - start
+
+
+        #
+        # Persons x Roles
+        #
+        start = time.time()
+
+        message('Dealing with Persons Roles relationship')
+        
+        roles = Roles(self.api)
+        roles_dict = dict([(role['role_id'], role) for role in roles])
+        for peer_person_id, person in peer_persons.iteritems():
+            # Person as viewed by peer
+            peer_person = persons_at_peer[peer_person_id]
+
+            # Roles that are currently attributed for the person
+            old_person_role_ids = [ role_id for role_id in person['role_ids'] ]
+
+            # Roles that should be attributed to the person
+            person_role_ids = [ role_id for role_id in peer_person['role_ids'] ]
+
+            # Remove stale roles
+            for role_id in (set(old_person_role_ids) - set(person_role_ids)):
+                person.remove_role(roles_dict[role_id], commit = commit_mode)
+                message ("%s role %s removed from person %s"%(peer['peername'], roles_dict[role_id]['name'], person['email']))
+
+            # Add new roles to person
+            for role_id in (set(person_role_ids) - set(old_person_role_ids)):
+                person.add_role(roles_dict[role_id], commit = commit_mode)
+                message ("%s role %s added from person %s"%(peer['peername'], roles_dict[role_id]['name'], person['email']))
+
+        timers['persons-roles'] = time.time() - start
+
         # Update peer itself and commit
         peer.sync(commit = True)
 
         # Update peer itself and commit
         peer.sync(commit = True)