removed another bunch of references to geni
[sfa.git] / sfa / plc / sfaImport.py
index e224d8d..a554cb6 100644 (file)
@@ -13,11 +13,10 @@ import sys
 import tempfile
 
 from sfa.util.record import *
-from sfa.util.genitable import GeniTable
-from sfa.util.misc import *
+from sfa.util.table import SfaTable
+from sfa.util.namespace import *
 from sfa.util.config import Config
 from sfa.util.report import trace, error
-
 from sfa.trust.certificate import convert_public_key, Keypair
 from sfa.trust.trustedroot import *
 from sfa.trust.hierarchy import *
@@ -48,26 +47,13 @@ def cleanup_string(str):
     str = str.replace('"', "_")
     return str
 
-def person_to_hrn(parent_hrn, person):
-    # the old way - Lastname_Firstname
-    #personname = person['last_name'] + "_" + person['first_name']
-
-    # the new way - use email address up to the "@"
-    personname = person['email'].split("@")[0]
-
-    personname = cleanup_string(personname)
-
-    hrn = parent_hrn + "." + personname
-    return hrn
-
-
 class sfaImport:
 
-    def __init__(self):
+    def __init__(self, logger=None):
+        self.logger = logger
         self.AuthHierarchy = Hierarchy()
-        self.TrustedRoots = TrustedRootList()
-
         self.config = Config()
+        self.TrustedRoots = TrustedRootList(Config.get_trustedroots_dir(self.config))
         self.plc_auth = self.config.get_plc_auth()
         self.root_auth = self.config.SFA_REGISTRY_ROOT_AUTH
         self.level1_auth = self.config.SFA_REGISTRY_LEVEL1_AUTH
@@ -83,88 +69,75 @@ class sfaImport:
             import PLC.Shell
             self.shell = PLC.Shell.Shell(globals = globals())        
 
-    def get_auth_table(self, auth_name):
-        AuthHierarchy = self.AuthHierarchy
-        auth_info = AuthHierarchy.get_auth_info(auth_name)
-
-        table = GeniTable(hrn=auth_name,
-                          cninfo=auth_info.get_dbinfo())
-
-        # if the table doesn't exist, then it means we haven't put any records
-        # into this authority yet.
-
-        if not table.exists():
-            trace("Import: creating table for authority " + auth_name)
-            table.create()
-
-        return table
-
 
     def create_top_level_auth_records(self, hrn):
         AuthHierarchy = self.AuthHierarchy
         
-        # if root doesnt exist, create it
+        # if auth records for this hrn dont exist, create it
         if not AuthHierarchy.auth_exists(hrn):
+            trace("Import: creating top level authorites", self.logger)
             AuthHierarchy.create_auth(hrn)
         
-        # get the parent hrn
-        parent_hrn = get_authority(hrn)
-        if not parent_hrn:
-            parent_hrn = hrn
 
         # get the auth info of the newly created root auth (parent)
         # or level1_auth if it exists
-        auth_info = AuthHierarchy.get_auth_info(parent_hrn)
         if self.level1_auth:
             auth_info = AuthHierarchy.get_auth_info(hrn)
-        table = self.get_auth_table(parent_hrn)
+            parent_hrn = hrn
+        else:
+            parent_hrn = get_authority(hrn)
+            if not parent_hrn:
+                parent_hrn = hrn
+            auth_info = AuthHierarchy.get_auth_info(parent_hrn)
+            
+        table = SfaTable()
+        auth_record = table.find({'type': 'authority', 'hrn': hrn})
 
-        auth_record = table.resolve("authority", hrn)
         if not auth_record:
-            auth_record = GeniRecord(hrn=hrn, gid=auth_info.get_gid_object(), type="authority", pointer=-1)
-            trace("  inserting authority record for " + hrn)
+            auth_record = SfaRecord(hrn=hrn, gid=auth_info.get_gid_object(), type="authority", pointer=-1)
+            auth_record['authority'] = get_authority(auth_record['hrn'])
+            trace("Import: inserting authority record for " + hrn, self.logger)
             table.insert(auth_record)
 
 
     def import_person(self, parent_hrn, person):
         AuthHierarchy = self.AuthHierarchy
-        hrn = person_to_hrn(parent_hrn, person)
+        hrn = email_to_hrn(parent_hrn, person['email'])
 
         # ASN.1 will have problems with hrn's longer than 64 characters
         if len(hrn) > 64:
             hrn = hrn[:64]
 
-        trace("Import: importing person " + hrn)
-
-        table = self.get_auth_table(parent_hrn)
-
+        trace("Import: importing person " + hrn, self.logger)
         key_ids = []
         if 'key_ids' in person and person['key_ids']:
             key_ids = person["key_ids"]
-
             # get the user's private key from the SSH keys they have uploaded
             # to planetlab
-            keys = shell.GetKeys(plc_auth, key_ids)
+            keys = self.shell.GetKeys(self.plc_auth, key_ids)
             key = keys[0]['key']
             pkey = convert_public_key(key)
+            if not pkey:
+                pkey = Keypair(create=True)
         else:
             # the user has no keys
-            trace("   person " + hrn + " does not have a PL public key")
-
+            trace("   person " + hrn + " does not have a PL public key", self.logger)
             # if a key is unavailable, then we still need to put something in the
             # user's GID. So make one up.
             pkey = Keypair(create=True)
 
         # create the gid
         person_gid = AuthHierarchy.create_gid(hrn, create_uuid(), pkey)
-        person_record = table.resolve("user", hrn)
-        if not person_record:
-            trace("  inserting user record for " + hrn)
-            person_record = GeniRecord(hrn=hrn, gid=person_gid, type="user", pointer=person['person_id'])
+        table = SfaTable()
+        person_record = SfaRecord(hrn=hrn, gid=person_gid, type="user", pointer=person['person_id'])
+        person_record['authority'] = get_authority(person_record['hrn'])
+        existing_records = table.find({'hrn': hrn, 'type': 'user', 'pointer': person['person_id']})
+        if not existing_records:
             table.insert(person_record)
         else:
-            trace("  updating user record for " + hrn)
-            person_record = GeniRecord(hrn=hrn, gid=person_gid, type="user", pointer=person['person_id'])
+            trace("Import: %s exists, updating " % hrn, self.logger)
+            existing_record = existing_records[0]
+            person_record['record_id'] = existing_record['record_id']
             table.update(person_record)
 
     def import_slice(self, parent_hrn, slice):
@@ -173,49 +146,55 @@ class sfaImport:
         slicename = cleanup_string(slicename)
 
         if not slicename:
-            error("Import_Slice: failed to parse slice name " + slice['name'])
+            error("Import_Slice: failed to parse slice name " + slice['name'], self.logger)
             return
 
         hrn = parent_hrn + "." + slicename
-        trace("Import: importing slice " + hrn)
-
-        table = self.get_auth_table(parent_hrn)
-
-        slice_record = table.resolve("slice", hrn)
-        if not slice_record:
-            pkey = Keypair(create=True)
-            slice_gid = AuthHierarchy.create_gid(hrn, create_uuid(), pkey)
-            slice_record = GeniRecord(hrn=hrn, gid=slice_gid, type="slice", pointer=slice['slice_id'])
-            trace("  inserting slice record for " + hrn)
+        trace("Import: importing slice " + hrn, self.logger)
+
+        pkey = Keypair(create=True)
+        slice_gid = AuthHierarchy.create_gid(hrn, create_uuid(), pkey)
+        slice_record = SfaRecord(hrn=hrn, gid=slice_gid, type="slice", pointer=slice['slice_id'])
+        slice_record['authority'] = get_authority(slice_record['hrn'])
+        table = SfaTable()
+        existing_records = table.find({'hrn': hrn, 'type': 'slice', 'pointer': slice['slice_id']})
+        if not existing_records:
             table.insert(slice_record)
+        else:
+            trace("Import: %s exists, updating " % hrn, self.logger)
+            existing_record = existing_records[0]
+            slice_record['record_id'] = existing_record['record_id']
+            table.update(slice_record)
 
     def import_node(self, parent_hrn, node):
         AuthHierarchy = self.AuthHierarchy
         nodename = node['hostname'].split(".")[0]
         nodename = cleanup_string(nodename)
-
+        
         if not nodename:
-            error("Import_node: failed to parse node name " + node['hostname'])
+            error("Import_node: failed to parse node name " + node['hostname'], self.logger)
             return
 
         hrn = parent_hrn + "." + nodename
-
+        trace("Import: importing node " + hrn, self.logger)
         # ASN.1 will have problems with hrn's longer than 64 characters
         if len(hrn) > 64:
             hrn = hrn[:64]
 
-        trace("Import: importing node " + hrn)
-
-        table = self.get_auth_table(parent_hrn)
-
-        node_record = table.resolve("node", hrn)
-        if not node_record:
-            pkey = Keypair(create=True)
-            node_gid = AuthHierarchy.create_gid(hrn, create_uuid(), pkey)
-            node_record = GeniRecord(hrn=hrn, gid=node_gid, type="node", pointer=node['node_id'])
-            trace("  inserting node record for " + hrn)
+        table = SfaTable()
+        node_record = table.find({'type': 'node', 'hrn': hrn})
+        pkey = Keypair(create=True)
+        node_gid = AuthHierarchy.create_gid(hrn, create_uuid(), pkey)
+        node_record = SfaRecord(hrn=hrn, gid=node_gid, type="node", pointer=node['node_id'])
+        node_record['authority'] = get_authority(node_record['hrn'])
+        existing_records = table.find({'hrn': hrn, 'type': 'node', 'pointer': node['node_id']})
+        if not existing_records:
             table.insert(node_record)
-
+        else:
+            trace("Import: %s exists, updating " % hrn, self.logger)
+            existing_record = existing_records[0]
+            node_record['record_id'] = existing_record['record_id']
+            table.update(node_record)
 
     
     def import_site(self, parent_hrn, site):
@@ -231,14 +210,14 @@ class sfaImport:
         # internet2 nodes. This is a special operation for some vini
         # sites only
         if ".vini" in parent_hrn and parent_hrn.endswith('vini'):
-            if sitename.startswith("ii"):
-                sitename = sitename.replace("ii", "")
+            if sitename.startswith("i2"):
+                #sitename = sitename.replace("ii", "")
                 hrn = ".".join([parent_hrn, "internet2", sitename])
             elif sitename.startswith("nlr"):
+                #sitename = sitename.replace("nlr", "")
                 hrn = ".".join([parent_hrn, "internet2", sitename])
-                sitename = sitename.replace("nlr", "")
 
-        trace("Import_Site: importing site " + hrn)
+        trace("Import: importing site " + hrn, self.logger)
 
         # create the authority
         if not AuthHierarchy.auth_exists(hrn):
@@ -246,44 +225,25 @@ class sfaImport:
 
         auth_info = AuthHierarchy.get_auth_info(hrn)
 
-        table = self.get_auth_table(parent_hrn)
-
-        auth_record = table.resolve("authority", hrn)
-        if not auth_record:
-            auth_record = GeniRecord(hrn=hrn, gid=auth_info.get_gid_object(), type="authority", pointer=site['site_id'])
-            trace("  inserting authority record for " + hrn)
+        table = SfaTable()
+        auth_record = SfaRecord(hrn=hrn, gid=auth_info.get_gid_object(), type="authority", pointer=site['site_id'])
+        auth_record['authority'] = get_authority(auth_record['hrn'])
+        existing_records = table.find({'hrn': hrn, 'type': 'authority', 'pointer': site['site_id']})
+        if not existing_records:
             table.insert(auth_record)
+        else:
+            trace("Import: %s exists, updating " % hrn, self.logger)
+            existing_record = existing_records[0]
+            auth_record['record_id'] = existing_record['record_id']
+            table.update(auth_record)
 
-        if 'person_ids' in site:
-            for person_id in site['person_ids']:
-                persons = shell.GetPersons(plc_auth, [person_id])
-                if persons:
-                    try:
-                        self.import_person(hrn, persons[0])
-                    except Exception, e:
-                        trace("Failed to import: %s (%s)" % (persons[0], e))
-        if 'slice_ids' in site:
-            for slice_id in site['slice_ids']:
-                slices = shell.GetSlices(plc_auth, [slice_id])
-                if slices:
-                    try:
-                        self.import_slice(hrn, slices[0])
-                    except Exception, e:
-                        trace("Failed to import: %s (%s)" % (slices[0], e))
-        if 'node_ids' in site:
-            for node_id in site['node_ids']:
-                nodes = shell.GetNodes(plc_auth, [node_id])
-                if nodes:
-                    try:
-                        self.import_node(hrn, nodes[0])
-                    except Exception, e:
-                        trace("Failed to import: %s (%s)" % (nodes[0], e))     
-
-    def delete_record(self, hrn, type = "*"):
-        auth_name = self.get_auth_table(hrn)
-        table = self.AuthHierarchy.get_auth_table(auth_name)
-        record_list = table.resolve(type, hrn)
-        if not record_list:
-            return
-        record = record_list[0]
-        table.remove(record)        
+        return hrn
+
+
+    def delete_record(self, hrn, type):
+        # delete the record
+        table = SfaTable()
+        record_list = table.find({'type': type, 'hrn': hrn})
+        for record in record_list:
+            trace("Import: Removing record %s %s" % (type, hrn), self.logger)
+            table.remove(record)