Bug fixes to add a federated user.
[sfa.git] / sfa / senslab / slabslices.py
index c63acf4..3fe82b4 100644 (file)
@@ -316,11 +316,12 @@ class SlabSlices:
         slicename = slice_hrn
         slices_list = self.driver.GetSlices(slice_filter = slicename, \
                                             slice_filter_type = 'slice_hrn') 
+        sfa_slice = None                                 
         if slices_list:
             for sl in slices_list:
             
-                logger.debug("SLABSLICE \tverify_slice slicename %s sl %s \
-                                    slice_record %s"%(slicename, sl, \
+                logger.debug("SLABSLICE \tverify_slice slicename %s slices_list %s sl %s \
+                                    slice_record %s"%(slicename, slices_list,sl, \
                                                             slice_record))
                 sfa_slice = sl
                 sfa_slice.update(slice_record)
@@ -339,26 +340,44 @@ class SlabSlices:
                     ##self.driver.UpdateSlice( slice['slice_id'], {'expires' : \
                                                         #slice_record['expires']})
         else:
+            #Search for user in ldap based on email SA 14/11/12
+            ldap_user = self.driver.ldap.LdapFindUser(slice_record['user'])
             logger.debug(" SLABSLICES \tverify_slice Oups \
-                        slice_record %s peer %s sfa_peer %s "\
-                        %(slice_record, peer,sfa_peer))
-            sfa_slice = {'slice_hrn': slicename,
+                        slice_record %s peer %s sfa_peer %s ldap_user %s"\
+                        %(slice_record, peer,sfa_peer ,ldap_user ))
+            #User already registered in ldap, meaning user should be in SFA db
+            #and hrn = sfa_auth+ uid           
+            if ldap_user : 
+                hrn = self.driver.root_auth +'.'+ ldap_user['uid']
+                
+                user = self.driver.get_user(hrn)
+                
+                logger.debug(" SLABSLICES \tverify_slice hrn %s USER %s" %(hrn, user))
+                sfa_slice = {'slice_hrn': slicename,
                      #'url': slice_record.get('url', slice_hrn), 
                      #'description': slice_record.get('description', slice_hrn)
                      'node_list' : [],
-                     'record_id_user' : slice_record['person_ids'][0],
-                     'record_id_slice': slice_record['record_id'],
+                     'authority' : slice_record['authority'],
+                     'gid':slice_record['gid'],
+                     'record_id_user' : user.record_id,
+                     'slice_id' : slice_record['record_id'],
+                     'reg-researchers':slice_record['reg-researchers'],
+                     #'record_id_slice': slice_record['record_id'],
                      'peer_authority':str(peer.hrn)
                     
                      }
+                     
+                if peer:
+                    sfa_slice['slice_id'] = slice_record['record_id']
             # add the slice  
-            self.driver.AddSlice(sfa_slice)                         
+            if sfa_slice:
+                self.driver.AddSlice(sfa_slice, user)                         
             #slice['slice_id'] = self.driver.AddSlice(slice)
             logger.debug("SLABSLICES \tverify_slice ADDSLICE OK") 
             #slice['node_ids']=[]
             #slice['person_ids'] = []
             #if peer:
-                #slice['peer_slice_id'] = slice_record.get('slice_id', None) 
+                #sfa_slice['peer_slice_id'] = slice_record.get('slice_id', None) 
             # mark this slice as an sfa peer record
             #if sfa_peer:
                 #peer_dict = {'type': 'slice', 'hrn': slice_hrn, 
@@ -381,7 +400,7 @@ class SlabSlices:
         """
         #TODO SA 21/08/12 verify_persons Needs review 
         
-        
+        logger.debug("SLABSLICES \tverify_persons \tslice_hrn  %s  \t slice_record %s\r\n users %s \t peer %s "%( slice_hrn, slice_record, users,  peer)) 
         users_by_id = {}  
         users_by_hrn = {} 
         #users_dict : dict whose keys can either be the user's hrn or its id.
@@ -389,19 +408,17 @@ class SlabSlices:
         users_dict = {}
         
         #First create dicts by hrn and id for each user in the user record list:      
-        for user in users:
+        for info in users:
             
-            if 'urn' in user and (not 'hrn' in user ) :
-                user['hrn'], user['type'] = urn_to_hrn(user['urn'])
+            if 'slice_record' in info :
+                slice_rec = info['slice_record'] 
+                user = slice_rec['user']
+
                
-            if 'person_id' in user and 'hrn' in user:
-                users_by_id[user['person_id']] = user
-                users_dict[user['person_id']] = {'person_id':\
-                                        user['person_id'], 'hrn':user['hrn']}
+            if 'hrn' in user:
 
                 users_by_hrn[user['hrn']] = user
-                users_dict[user['hrn']] = {'person_id':user['person_id'], \
-                                                        'hrn':user['hrn']}
+                users_dict[user['hrn']] = user
                 
         
         logger.debug( "SLABSLICE.PY \t verify_person  \
@@ -434,8 +451,8 @@ class SlabSlices:
             if existing_users:
                 for user in existing_users :
                     existing_user_hrns.append(users_dict[user['hrn']]['hrn'])
-                    existing_user_ids.\
-                                    append(users_dict[user['hrn']]['person_id'])
+                    #existing_user_ids.\
+                                    #append(users_dict[user['hrn']]['person_id'])
          
             # User from another known trusted federated site. Check 
             # if a senslab account matching the email has already been created.
@@ -457,25 +474,28 @@ class SlabSlices:
                 else:
                     #User not existing in LDAP
                     #TODO SA 21/08/12 raise smthg to add user or add it auto ?
+                    new_record = {}
+                    new_record['pkey'] = users[0]['keys'][0]
+                    new_record['mail'] = users[0]['email']
+                    self.driver.ldap.LdapAddUser(new_record)
                     logger.debug(" SLABSLICE.PY \tverify_person users \
                                 not in ldap ...NEW ACCOUNT NEEDED %s \r\n \t \
                                 ldap_reslt %s "  %(users, ldap_reslt))
    
-        requested_user_ids = users_by_id.keys() 
+        #requested_user_ids = users_by_id.keys() 
         requested_user_hrns = users_by_hrn.keys()
-        logger.debug("SLABSLICE.PY \tverify_person requested_user_ids  %s \
-                        user_by_hrn %s " %(requested_user_ids, users_by_hrn)) 
+        logger.debug("SLABSLICE.PY \tverify_person  \
+                        user_by_hrn %s " %( users_by_hrn)) 
       
    
         #Check that the user of the slice in the slice record
         #matches the existing users 
         try:
-            if slice_record['record_id_user'] in requested_user_ids and \
-                                slice_record['PI'][0] in requested_user_hrns:
-                logger.debug(" SLABSLICE  \tverify_person  \
-                        requested_user_ids %s = \
-                        slice_record['record_id_user'] %s" \
-                        %(requested_user_ids,slice_record['record_id_user']))
+            if slice_record['PI'][0] in requested_user_hrns:
+            #if slice_record['record_id_user'] in requested_user_ids and \
+                                #slice_record['PI'][0] in requested_user_hrns:
+                logger.debug(" SLABSLICE  \tverify_person  \slice_record['record_id_user'] %s" \
+                        %(slice_record['record_id_user']))
            
         except KeyError:
             pass
@@ -498,17 +518,20 @@ class SlabSlices:
         for added_user_hrn in added_user_hrns:
             added_user = users_dict[added_user_hrn]
             #hrn, type = urn_to_hrn(added_user['urn'])  
-            person = {
-                #'first_name': added_user.get('first_name', hrn),
-                #'last_name': added_user.get('last_name', hrn),
-                'first_name': added_user['first_name'],
-                'last_name': added_user['last_name'],
-                'person_id': added_user['person_id'],
-                'peer_person_id': None,
-                'keys': [],
-                'key_ids': added_user.get('key_ids', []),
+
+            person = {}
+            person['peer_person_id'] =  None
+            k_list  = ['first_name','last_name','person_id']
+            for k in k_list:
+                if k in added_user:
+                    person[k] = added_user[k]
+
+            person['keys'] = added_user['keys'][0]
+            person['key_ids'] =  added_user.get('key_ids', [])
                 
-            } 
+
+
+            
             person['person_id'] = self.driver.AddPerson(person)
             if peer:
                 person['peer_person_id'] = added_user['person_id']