first stab at a design where each incoming API call has its own dbsession
[sfa.git] / sfa / importer / nitosimporter.py
index 080417d..425be77 100644 (file)
@@ -7,7 +7,9 @@ from sfa.util.xrn import Xrn, get_leaf, get_authority, hrn_to_urn
 from sfa.trust.gid import create_uuid    
 from sfa.trust.certificate import convert_public_key, Keypair
 
-from sfa.storage.alchemy import dbsession
+# using global alchemy.session() here is fine 
+# as importer is on standalone one-shot process
+from sfa.storage.alchemy import global_dbsession
 from sfa.storage.model import RegRecord, RegAuthority, RegSlice, RegNode, RegUser, RegKey
 
 from sfa.nitos.nitosshell import NitosShell    
@@ -83,7 +85,7 @@ class NitosImporter:
         shell = NitosShell (config)
 
         ######## retrieve all existing SFA objects
-        all_records = dbsession.query(RegRecord).all()
+        all_records = global_dbsession.query(RegRecord).all()
 
         # create hash by (type,hrn) 
         # we essentially use this to know if a given record is already known to SFA 
@@ -146,8 +148,8 @@ class NitosImporter:
                                                pointer=0,
                                                authority=get_authority(site_hrn))
                     site_record.just_created()
-                    dbsession.add(site_record)
-                    dbsession.commit()
+                    global_dbsession.add(site_record)
+                    global_dbsession.commit()
                     self.logger.info("NitosImporter: imported authority (site) : %s" % site_record) 
                     self.remember_record (site_record)
                 except:
@@ -177,8 +179,8 @@ class NitosImporter:
                                                pointer =node['node_id'],
                                                authority=get_authority(node_hrn))
                         node_record.just_created()
-                        dbsession.add(node_record)
-                        dbsession.commit()
+                        global_dbsession.add(node_record)
+                        global_dbsession.commit()
                         self.logger.info("NitosImporter: imported node: %s" % node_record)  
                         self.remember_record (node_record)
                     except:
@@ -236,8 +238,8 @@ class NitosImporter:
                         else:
                             self.logger.warning("No key found for user %s"%user_record)
                         user_record.just_created()
-                        dbsession.add (user_record)
-                        dbsession.commit()
+                        global_dbsession.add (user_record)
+                        global_dbsession.commit()
                         self.logger.info("NitosImporter: imported user: %s" % user_record)
                         self.remember_record ( user_record )
                     else:
@@ -245,15 +247,20 @@ class NitosImporter:
                         # if user's primary key has changed then we need to update the 
                         # users gid by forcing an update here
                         sfa_keys = user_record.reg_keys
-                        def key_in_list (key,sfa_keys):
-                            for reg_key in sfa_keys:
-                                if reg_key.key==key: return True
+
+                        def sfa_key_in_list (sfa_key,nitos_user_keys):
+                            for nitos_key in nitos_user_keys:
+                                if nitos_key==sfa_key: return True
                             return False
-                        # is there a new key in NITOS ?
+                        # are all the SFA keys known to nitos ?
                         new_keys=False
-                        for key in user['keys']:
-                            if not key_in_list (key,sfa_keys):
-                                new_keys = True
+                        if not sfa_keys and user['keys']:
+                            new_keys = True
+                        else:
+                            for sfa_key in sfa_keys:
+                                 if not sfa_key_in_list (sfa_key.key,user['keys']):
+                                     new_keys = True
+
                         if new_keys:
                             (pubkey,pkey) = init_user_key (user)
                             user_gid = self.auth_hierarchy.create_gid(user_urn, create_uuid(), pkey)
@@ -261,9 +268,11 @@ class NitosImporter:
                                 user_record.reg_keys=[]
                             else:
                                 user_record.reg_keys=[ RegKey (pubkey)]
+                            user_record.gid = user_gid
+                            user_record.just_updated()
                             self.logger.info("NitosImporter: updated user: %s" % user_record)
                     user_record.email = user['email']
-                    dbsession.commit()
+                    global_dbsession.commit()
                     user_record.stale=False
                 except:
                     self.logger.log_exc("NitosImporter: failed to import user %s %s"%(user['user_id'],user['email']))
@@ -282,8 +291,8 @@ class NitosImporter:
                                                  pointer=slice['slice_id'],
                                                  authority=get_authority(slice_hrn))
                         slice_record.just_created()
-                        dbsession.add(slice_record)
-                        dbsession.commit()
+                        global_dbsession.add(slice_record)
+                        global_dbsession.commit()
                         self.logger.info("NitosImporter: imported slice: %s" % slice_record)  
                         self.remember_record ( slice_record )
                     except:
@@ -295,7 +304,7 @@ class NitosImporter:
                 # record current users affiliated with the slice
                 slice_record.reg_researchers = \
                       [ self.locate_by_type_pointer ('user',int(user_id)) for user_id in slice['user_ids'] ]
-                dbsession.commit()
+                global_dbsession.commit()
                 slice_record.stale=False
 
 
@@ -315,12 +324,7 @@ class NitosImporter:
                 self.logger.warning("stale not found with %s"%record)
             if stale:
                 self.logger.info("NitosImporter: deleting stale record: %s" % record)
-                dbsession.delete(record)
-                dbsession.commit()
-
+                global_dbsession.delete(record)
+                global_dbsession.commit()
 
 
-if __name__ == "__main__":
-       from sfa.util.sfalogging import logger
-       nitosimporter = NitosImporter("pla.nitos", logger)
-       nitosimporter.run(None)