reworked import
[sfa.git] / sfa / importer / sfaimporter.py
index 00e9908..4f17c2d 100644 (file)
@@ -11,8 +11,9 @@ from sfa.util.config import Config
 from sfa.trust.certificate import convert_public_key, Keypair
 from sfa.trust.trustedroots import TrustedRoots
 from sfa.trust.gid import create_uuid
-from sfa.storage.model import RegRecord, RegAuthority, RegUser
+
 from sfa.storage.alchemy import dbsession
+from sfa.storage.model import RegRecord, RegAuthority, RegUser
 
 def _un_unicode(str):
    if isinstance(str, unicode):
@@ -43,13 +44,18 @@ class SfaImporter:
     def __init__(self, auth_hierarchy, logger):
        self.logger=logger
        self.auth_hierarchy = auth_hierarchy
-       self.config = Config()
-       self.TrustedRoots = TrustedRoots(Config.get_trustedroots_dir(self.config))
-       self.root_auth = self.config.SFA_REGISTRY_ROOT_AUTH
+       config = Config()
+       self.TrustedRoots = TrustedRoots(Config.get_trustedroots_dir(config))
+       self.root_auth = config.SFA_REGISTRY_ROOT_AUTH
+       self.interface_hrn = config.SFA_INTERFACE_HRN
+
+    # check before creating a RegRecord entry as we run this over and over
+    def record_exists (self, type, hrn):
+       return dbsession.query(RegRecord).filter_by(hrn=hrn,type=type).count()!=0
 
     # record options into an OptionParser
-    def record_options (self, parser):
-       self.logger.info ("SfaImporter.record_options : to do")
+    def add_options (self, parser):
+       # no generic option
        pass
 
     def run (self, options):
@@ -61,22 +67,20 @@ class SfaImporter:
         Create top level and interface records
         """
         # create root authority
-        interface_hrn = self.config.SFA_INTERFACE_HRN
-        self.create_top_level_auth_records(interface_hrn)
+        self.create_top_level_auth_records(self.interface_hrn)
 
         # create s user record for the slice manager
         self.create_sm_client_record()
 
         # create interface records
-        self.logger.info("Import: creating interface records")
-# xxx authority+ turning off the creation of authority+*
-# in fact his is required - used in SfaApi._getCredentialRaw
-# that tries to locate 'authority+sa'
+        # xxx turning off the creation of authority+*
+        # in fact his is required - used in SfaApi._getCredentialRaw
+        # that tries to locate 'authority+sa'
         self.create_interface_records()
 
         # add local root authority's cert  to trusted list
-        self.logger.info("Import: adding " + interface_hrn + " to trusted list")
-        authority = self.auth_hierarchy.get_auth_info(interface_hrn)
+        self.logger.info("SfaImporter: adding " + self.interface_hrn + " to trusted list")
+        authority = self.auth_hierarchy.get_auth_info(self.interface_hrn)
         self.TrustedRoots.add_gid(authority.get_gid_object())
 
     def create_top_level_auth_records(self, hrn):
@@ -93,37 +97,33 @@ class SfaImporter:
         # ensure key and cert exists:
         self.auth_hierarchy.create_top_level_auth(hrn)    
         # create the db record if it doesnt already exist    
+        if self.record_exists ('authority',hrn): return
         auth_info = self.auth_hierarchy.get_auth_info(hrn)
-        auth_record = RegAuthority()
-        auth_record.type='authority'
-        auth_record.hrn=hrn
-        auth_record.gid=auth_info.get_gid_object()
-        auth_record.authority=get_authority(hrn)
+        auth_record = RegAuthority(hrn=hrn, gid=auth_info.get_gid_object(),
+                                   authority=get_authority(hrn))
         auth_record.just_created()
         dbsession.add (auth_record)
         dbsession.commit()
-        self.logger.info("Import: imported authority (parent) %s " % auth_record)
+        self.logger.info("SfaImporter: imported authority (parent) %s " % auth_record)
 
     def create_sm_client_record(self):
         """
         Create a user record for the Slicemanager service.
         """
-        hrn = self.config.SFA_INTERFACE_HRN + '.slicemanager'
+        hrn = self.interface_hrn + '.slicemanager'
         urn = hrn_to_urn(hrn, 'user')
         if not self.auth_hierarchy.auth_exists(urn):
-            self.logger.info("Import: creating Slice Manager user")
+            self.logger.info("SfaImporter: creating Slice Manager user")
             self.auth_hierarchy.create_auth(urn)
 
+        if self.record_exists ('user',hrn): return
         auth_info = self.auth_hierarchy.get_auth_info(hrn)
-        user_record = RegUser()
-        user_record.type='user'
-        user_record.hrn=hrn
-        user_record.gid=auth_info.get_gid_object()
-        user_record.authority=get_authority(hrn)
+        user_record = RegUser(hrn=hrn, gid=auth_info.get_gid_object(),
+                              authority=get_authority(hrn))
         user_record.just_created()
         dbsession.add (user_record)
         dbsession.commit()
-        self.logger.info("Import: importing user (slicemanager) %s " % user_record)
+        self.logger.info("SfaImporter: importing user (slicemanager) %s " % user_record)
 
     def create_interface_records(self):
         """
@@ -131,26 +131,18 @@ class SfaImporter:
         """
         # just create certs for all sfa interfaces even if they
         # aren't enabled
-        hrn = self.config.SFA_INTERFACE_HRN
-        auth_info = self.auth_hierarchy.get_auth_info(hrn)
+        auth_info = self.auth_hierarchy.get_auth_info(self.interface_hrn)
         pkey = auth_info.get_pkey_object()
+        hrn=self.interface_hrn
         for type in  [ 'authority+sa', 'authority+am', 'authority+sm', ]:
             urn = hrn_to_urn(hrn, type)
             gid = self.auth_hierarchy.create_gid(urn, create_uuid(), pkey)
-            # xxx this should probably use a RegAuthority, or a to-be-defined RegPeer object
-            # but for now we have to preserve the authority+<> stuff
-            interface_record = RegAuthority()
-            interface_record.type=type
-            interface_record.hrn=hrn
-            interface_record.gid= gid
-            interface_record.authority=get_authority(hrn)
+            # for now we have to preserve the authority+<> stuff
+            if self.record_exists (type,hrn): continue
+            interface_record = RegAuthority(type=type, hrn=hrn, gid=gid,
+                                            authority=get_authority(hrn))
             interface_record.just_created()
             dbsession.add (interface_record)
             dbsession.commit()
-            self.logger.info("Import: imported authority (%s) %s " % (type,interface_record))
+            self.logger.info("SfaImporter: imported authority (%s) %s " % (type,interface_record))
              
-    def delete_record(self, hrn, type):
-        # delete the record
-        for rec in dbsession.query(RegRecord).filter_by(type=type,hrn=hrn):
-           dbsession.delete(rec)
-        dbsession.commit()