fewer import * for certificate
[sfa.git] / geni / methods / register.py
index e103fea..11a4229 100644 (file)
@@ -1,5 +1,11 @@
+### $Id$
+### $URL$
+
+from geni.trust.certificate import Keypair, convert_public_key
+from geni.trust.gid import *
+
 from geni.util.faults import *
-from geni.util.excep import *
+from geni.util.misc import *
 from geni.util.method import Method
 from geni.util.parameter import Parameter, Mixed
 from geni.util.auth import Auth
@@ -28,23 +34,31 @@ class register(Method):
     returns = Parameter(int, "String representation of gid object")
     
     def call(self, cred, record_dict):
-        self.decode_authentication(cred, "register")
+        self.api.auth.check(cred, "register")
         record = GeniRecord(dict = record_dict)
         type = record.get_type()
         name = record.get_name()
+        self.api.auth.verify_object_permission(name)
         auth_name = self.api.auth.get_authority(name)
-        self.api.auth.verify_object_permission(auth_name)
         auth_info = self.api.auth.get_auth_info(auth_name)
         table = self.api.auth.get_auth_table(auth_name)
-        pkey = None
+        
+        # make sure record has a gid
+        if 'gid' not in record:
+            uuid = create_uuid()
+            pkey = Keypair(create=True)
+            if 'keys' in record and record['keys']:
+                pkey = convert_public_key(record['keys'][0])
+            
+            gid_object = self.api.auth.hierarchy.create_gid(name, uuid, pkey)
+            gid = gid_object.save_to_string(save_parents=True)
+            record['gid'] = gid
+            record.set_gid(gid)
 
         # check if record already exists
         existing_records = table.resolve(type, name)
         if existing_records:
             raise ExistingRecord(name)
-
-        geni_fields = record.get_geni_info()
-        pl_fields = record.get_pl_info()
         
         if (type == "sa") or (type=="ma"):
             # update the tree
@@ -71,26 +85,35 @@ class register(Method):
                 print >> log, "linking ma and sa to the same plc site"
                 pointer = other_rec[0].get_pointer()
             else:
-                self.api.geni_fields_to_pl_fields(type, name, geni_fields, pl_fields)
-                print >> log, "adding site with fields", pl_fields
-                pointer = self.api.plshell.AddSite(self.api.plauth, pl_fields)
+                pl_record = self.api.geni_fields_to_pl_fields(type, name, record)
+                print >> log, "adding site with fields", pl_record
+                pointer = self.api.plshell.AddSite(self.api.plauth, pl_record)
 
             record.set_pointer(pointer)
 
         elif (type == "slice"):
-            self.api.geni_fields_to_pl_fields(type, name, geni_fields, pl_fields)
-            pointer = self.api.plshell.AddSlice(self.api.plauth, pl_fields)
+            pl_record = self.api.geni_fields_to_pl_fields(type, name, record)
+            pointer = self.api.plshell.AddSlice(self.api.plauth, pl_record)
             record.set_pointer(pointer)
 
         elif (type == "user"):
-            self.api.geni_fields_to_pl_fields(type, name, geni_fields, pl_fields)
-            pointer = self.api.plshell.AddPerson(self.api.plauth, pl_fields)
+            pointer = self.api.plshell.AddPerson(self.api.plauth, dict(record))
+            if 'enabled' in record and record['enabled']:
+                self.api.plshell.UpdatePerson(self.api.plauth, pointer, {'enabled': record['enabled']})
+            login_base = get_leaf(auth_info.hrn)
+            self.api.plshell.AddPersonToSite(self.api.plauth, pointer, login_base)
+            # What roles should this user have?
+            self.api.plshell.AddRoleToPerson(self.api.plauth, 'user', pointer) 
             record.set_pointer(pointer)
+           
+           # Add the user's key
+            if record['keys']:
+               self.api.plshell.AddPersonKey(self.api.plauth, pointer, {'key_type' : 'ssh', 'key' : record['keys'][0]})
 
         elif (type == "node"):
-            self.api.geni_fields_to_pl_fields(type, name, geni_fields, pl_fields)
-            login_base = self.api.hrn_to_pl_login_base(auth_name)
-            pointer = self.api.plshell.AddNode(self.api.plauth, login_base, pl_fields)
+            pl_record = self.api.geni_fields_to_pl_fields(type, name, record)
+            login_base = hrn_to_pl_login_base(auth_name)
+            pointer = self.api.plshell.AddNode(self.api.plauth, login_base, pl_record)
             record.set_pointer(pointer)
 
         else: