gid creation code change, again. NT.
[sfa.git] / sfa / senslab / slab-import.py
index 20d435b..38be563 100644 (file)
@@ -6,13 +6,19 @@
 #
 ###########################################################################
 import sys
+import datetime
+import time
 from sfa.senslab.OARrestapi import OARapi
 from sfa.senslab.LDAPapi import LDAPapi
 from sfa.senslab.slabdriver import SlabDriver
 from sfa.util.config import Config
-from sfa.util.xrn import hrn_to_urn, get_authority
+from sfa.util.xrn import hrn_to_urn, get_authority,Xrn,get_leaf
 from sfa.util.table import SfaTable
+from sfa.util.record import SfaRecord
 from sfa.trust.hierarchy import Hierarchy
+from sfa.trust.certificate import Keypair,convert_public_key
+from sfa.trust.gid import create_uuid
+
 
 AuthHierarchy = Hierarchy()
 table = SfaTable()
@@ -45,6 +51,7 @@ def create_top_level_auth_records(hrn):
     if not auth_record:
         auth_record = SfaRecord(hrn=hrn, gid=auth_info.get_gid_object(), type="authority", pointer=-1)
         auth_record['authority'] = get_authority(auth_record['hrn'])
+        print sys.stderr, " \r\n \t slab-import : auth record %s inserted" %(auth_record['hrn'])
         table.insert(auth_record)
         print>>sys.stderr, "\r\n ========= \t\t SenslabImport NO AUTH RECORD \r\n" ,auth_record['authority']
         
@@ -61,8 +68,11 @@ def import_node(hrn, node):
     node_gid = AuthHierarchy.create_gid(urn, 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'])
+    extime = datetime.datetime.utcnow()
+    node_record['date_created'] = int(time.mktime(extime.timetuple()))
     existing_records = table.find({'hrn': hrn, 'type': 'node', 'pointer': node['node_id']})
     if not existing_records:
+        print>>sys.stderr, " \r\n \t slab-import : node record %s inserted" %(node_record['hrn'])
         table.insert(node_record)
     else:
         existing_record = existing_records[0]
@@ -70,24 +80,60 @@ def import_node(hrn, node):
         table.update(node_record)
 
 # person is already a sfa record 
-def import_person(person):       
+def import_person(authname,person):       
     existing_records = table.find({'hrn': person['hrn'], 'type': 'user'})
+    extime = datetime.datetime.utcnow()
+    person['date_created'] = int(time.mktime(extime.timetuple()))
     if not existing_records:
+        print>>sys.stderr, " \r\n \t slab-import : person record %s inserted" %(person['hrn'])
+        uuid=create_uuid() 
+        RSA_KEY_STRING=person['pkey']
+        pkey=convert_public_key(RSA_KEY_STRING)
+       person['gid']=AuthHierarchy.create_gid("urn:publicid:IDN+"+authname+"+user+"+person['uid'], uuid, pkey, CA=False).save_to_string()
         table.insert(person)
     else:
         existing_record = existing_records[0]
         person['record_id'] = existing_record['record_id']
-        table.update(person)      
-        
+        # handle key change ??? 
+        table.update(person)
         
+def import_slice(person):
+
+    hrn = person['hrn']+'_slice'
+    pkey = Keypair(create=True)
+    urn = hrn_to_urn(hrn, 'slice')
+    gid = AuthHierarchy.create_gid(urn, create_uuid(), pkey)
+    slice_record= SfaRecord(hrn=hrn, gid=gid, type="slice", pointer=-1)
+    slice_record['authority'] = get_authority(slice_record['hrn'])
+   
+    extime = datetime.datetime.utcnow()
+    slice_record['date_created'] = int(time.mktime(extime.timetuple()))
+                               
+    print>>sys.stderr, " \r\n \t slab-import : slice record %s " %(slice_record['hrn']) 
+    existing_records = table.find({'hrn': slice_record['hrn'], 'type': 'slice'})
+    if not existing_records:
+        print>>sys.stderr, " \r\n \t slab-import : slice record %s inserted" %(slice_record['hrn'])
+        table.insert(slice_record)
+    else:
+        print>>sys.stderr, " \r\n \t slab-import : slice record %s updated" %(slice_record['hrn'])
+        existing_record = existing_records[0]
+        slice_record['record_id'] = existing_record['record_id']
+        table.update(slice_record)        
         
 def delete_record( hrn, type):
     # delete the record
     record_list = table.find({'type': type, 'hrn': hrn})
     for record in record_list:
+        print>>sys.stderr, " \r\n \t slab-import : record %s deleted" %(record['hrn'])
         table.remove(record)
                 
-                
+def hostname_to_hrn(root_auth,hostname):
+    # keep only the first part of the DNS name
+    #hrn='.'.join( [auth,hostname.split(".")[0] ] )
+    # escape the '.' in the hostname
+    hrn='.'.join( [root_auth,Xrn.escape(hostname)] )
+    return hrn_to_urn(hrn,'node')
+    
 def main():
 
     config = Config()
@@ -128,13 +174,11 @@ def main():
    
     Driver = SlabDriver(config)
     nodes_dict  = Driver.GetNodes()
-    print "\r\n NODES8DICT ",nodes_dict
+    #print "\r\n NODES8DICT ",nodes_dict
     
     ldap_person_list = Driver.GetPersons()
-    print "\r\n PERSONS_LIST ",ldap_person_list
-
-   
     
+
     #slices_list = SenslabUsers.GetSlices()
     #print "\r\n SLICES_LIST ",slices_list
     
@@ -155,24 +199,19 @@ def main():
              #site_hrn = SenslabImporter.import_site(interface_hrn, site)
    
         # import node records
-       #for node_id in site['node_ids']:
-               #for[node['node_id'] for node in nodes_dict]:
-                       #print '\r\n \t **NODE_ID %s node %s '%( node_id, node)         
-                       #continue 
     for node in nodes_dict:
-        print '\r\n \t NODE_ID %s node %s '%( node_id, node)
-        hrn =  hostname_to_hrn(interface_hrn, root_auth, node['hostname'])
+        hrn =  hostname_to_hrn( root_auth, node['hostname'])
         if hrn not in existing_hrns or \
         (hrn, 'node') not in existing_records:
-            print "\t\t NODE HRN NOT in existing records!" ,hrn
             import_node(hrn, node)
 
    # import persons
     for person in ldap_person_list:
-        print >>sys.stderr, "\r\n\r\n^^^^^^^^^^^^^PERSON hrn %s person %s site hrn %s" %(hrn,person)    
         if person['hrn'] not in existing_hrns or \
             (person['hrn'], 'user') not in existing_records :
-            import_person( person)     
+            import_person(root_auth,person)
+            import_slice(person)
+
 # import slices
         #for slice_id in site['slice_ids']:
                #print >>sys.stderr, "\r\n\r\n \t ^^^^^^^\\\\\\\\\\\\\\\^^^^^^ slice_id  %s  " %(slice_id)              
@@ -188,6 +227,7 @@ def main():
                                        
     # remove stale records    
     system_records = [interface_hrn, root_auth, interface_hrn + '.slicemanager']
+
     for (record_hrn, type) in existing_records.keys():
         if record_hrn in system_records:
             continue
@@ -210,27 +250,31 @@ def main():
             break
                 
         elif type == 'user':
-            for person in persons:
+            for person in ldap_person_list:
                 if person['hrn'] == record_hrn:
                     found = True
-                break
+                    break
             
         elif type == 'node':
             login_base = get_leaf(get_authority(record_hrn))
             nodename = Xrn.unescape(get_leaf(record_hrn))
-            print "type: node :  nodename %s" %(nodename)
-            for node in nodes_dict.values():
+            for node in nodes_dict:
                 if node['hostname'] == nodename :
                     found = True
                     break 
-                    
+                
+        elif type == 'slice':
+            for person in ldap_person_list:
+                if person['hrn']+'_slice' == record_hrn:
+                    found = True
+                    break           
         else:
             continue 
         
         if not found:
             record_object = existing_records[(record_hrn, type)]
-            print "\t\t NOT FOUND ! "
+            print "\t\t  NOT FOUND ! ", record_hrn
             delete_record(record_hrn, type) 
     
 if __name__ == "__main__":
-    main()    
\ No newline at end of file
+    main()