from sqlalchemy.orm.collections import InstrumentedList
### historical note -- april 2014
-# the myslice chaps rightfully complained about the following discrepency
+# the myslice chaps rightfully complained about the following discrepancy
# they found that
-# * read operations (resolve) expose stuff like e.g. 'reg-researchers', but that
-# * write operations (register, update) need e.g. 'researcher' to be set - it ignores 'reg-researchers'
+# * read operations (resolve) expose stuff like e.g.
+# 'reg-researchers', or 'reg-pis', but that
+# * write operations (register, update) need e.g.
+# 'researcher' or 'pi' to be set - reg-* are just ignored
#
-# the 'normalize' helper functions below aim at ironing this out
-# however in order to break as few as possible we essentially make sure that *both* fields are set
-# upon entering the write methods (so again register and update) because some driver code
+# the '_normalize_input' helper functions below aim at ironing this out
+# however in order to break as few code as possible we essentially make sure that *both* fields are set
+# upon entering the write methods (so again register and update) for legacy, as some driver code
# might depend on the presence of, say, 'researcher'
-# registry calls this 'reg-researchers'
-# some drivers call this 'researcher'
-# this is even more confusing as people might use 'researchers'
-def normalize_input_researcher (record):
- # this aims at detecting a mispelled input
- if 'researchers' in record and 'researcher' not in record:
- record['researcher']=record['researchers']
- del record['researchers']
+# normalize an input record to a write method - register or update
+# e.g. registry calls this 'reg-researchers'
+# while some drivers call this 'researcher'
+# we need to make sure that both keys appear and are the same
+def _normalize_input (record, reg_key, driver_key):
# this looks right, use this for both keys
- if 'reg-researchers' in record:
- # and issue a warning if they were both set as we're overwriting some user data here
- if 'researcher' in record:
- logger.warning ("normalize_input_researcher: incoming record has both values, using reg-researchers")
- record['researcher']=record['reg-researchers']
+ if reg_key in record:
+ # and issue a warning if they were both set and different
+ # as we're overwriting some user data here
+ if driver_key in record:
+ logger.warning ("normalize_input: incoming record has both values, using %s"%reg_key)
+ record[driver_key]=record[reg_key]
# we only have one key set, duplicate for the other one
- elif 'researcher' in record:
- logger.warning ("normalize_input_researcher: you should use 'reg-researchers' instead ot 'researcher'")
- record['reg-researchers']=record['researcher']
- # if at this point we still have 'researchers' it's going to be ignored and that might be confusing
- if 'researchers' in record:
- logger.warning ("normalize_input_researcher: incoming record has confusing 'researchers' key - ignored - use 'reg-researchers' instead")
+ elif driver_key in record:
+ logger.warning ("normalize_input: you should use '%s' instead of '%s'"%(reg_key,driver_key))
+ record[reg_key]=record[driver_key]
def normalize_input_record (record):
- normalize_input_researcher (record)
+ _normalize_input (record, 'reg-researchers','researcher')
+ _normalize_input (record, 'reg-pis','pi')
+ _normalize_input (record, 'reg-keys','keys')
+ # xxx the keys thing could use a little bit more attention:
+ # some parts of the code are using 'keys' while they should use 'reg-keys'
+ # but I run out of time for now
+ if 'reg-keys' in record: record['keys']=record['reg-keys']
return record
class RegistryManager:
if hrn != api.hrn])
xrn=Xrn(api.hrn,type='authority')
return version_core({'interface':'registry',
- 'sfa': 2,
- 'geni_api': 2,
+ 'sfa': 3,
'hrn':xrn.get_hrn(),
'urn':xrn.get_urn(),
'peers':peers})
return records
- def List (self, api, xrn, origin_hrn=None, options={}):
+ def List (self, api, xrn, origin_hrn=None, options=None):
+ if options is None: options={}
dbsession=api.dbsession()
# load all know registry names into a prefix tree and attempt to find
# the longest matching prefix
return record_dicts
-
def CreateGid(self, api, xrn, cert):
# get the authority
authority = Xrn(xrn=xrn).get_authority_hrn()
else:
certificate = Certificate(string=cert)
pkey = certificate.get_pubkey()
- gid = api.auth.hierarchy.create_gid(xrn, create_uuid(), pkey)
+
+ # Add the email of the user to SubjectAltName in the GID
+ email = None
+ hrn = Xrn(xrn).get_hrn()
+ dbsession=api.dbsession()
+ record=dbsession.query(RegUser).filter_by(hrn=hrn).first()
+ if record:
+ email=getattr(record,'email',None)
+ gid = api.auth.hierarchy.create_gid(xrn, create_uuid(), pkey, email = email)
return gid.save_to_string(save_parents=True)
####################
if not record.gid:
uuid = create_uuid()
pkey = Keypair(create=True)
- if getattr(record,'keys',None):
- pub_key=record.keys
+ pub_key=getattr(record,'reg-keys',None)
+ if pub_key is not None:
# use only first key in record
- if isinstance(record.keys, types.ListType):
- pub_key = record.keys[0]
+ if pub_key and isinstance(pub_key, types.ListType): pub_key = pub_key[0]
pkey = convert_public_key(pub_key)
- gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey)
+ email=getattr(record,'email',None)
+ gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey, email = email)
gid = gid_object.save_to_string(save_parents=True)
record.gid = gid
record.gid=gid.save_to_string(save_parents=True)
# locate objects for relationships
- pi_hrns = getattr(record,'pi',None)
+ pi_hrns = getattr(record,'reg-pis',None)
if pi_hrns is not None: record.update_pis (pi_hrns, dbsession)
elif isinstance (record, RegSlice):
elif isinstance (record, RegUser):
# create RegKey objects for incoming keys
- if hasattr(record,'keys'):
- logger.debug ("creating %d keys for user %s"%(len(record.keys),record.hrn))
- record.reg_keys = [ RegKey (key) for key in record.keys ]
+ if hasattr(record,'reg-keys'):
+ keys=getattr(record,'reg-keys')
+ # some people send the key as a string instead of a list of strings
+ if isinstance(keys,types.StringTypes): keys=[keys]
+ logger.debug ("creating %d keys for user %s"%(len(keys),record.hrn))
+ record.reg_keys = [ RegKey (key) for key in keys ]
# update testbed-specific data if needed
pointer = api.driver.register (record.__dict__, hrn, pub_key)
# Use the pointer from the existing record, not the one that the user
# gave us. This prevents the user from inserting a forged pointer
pointer = record.pointer
-
+
# is there a change in keys ?
new_key=None
if type=='user':
pkey = convert_public_key(new_key)
uuid = create_uuid()
urn = hrn_to_urn(hrn,type)
- gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey)
+
+ email=getattr(new_record,'email',None)
+ if email is None:
+ email=getattr(record,'email',None)
+ gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey, email = email)
gid = gid_object.save_to_string(save_parents=True)
# xxx should do side effects from new_record to record
if researcher_hrns is not None: record.update_researchers (researcher_hrns, dbsession)
elif isinstance (record, RegAuthority):
- pi_hrns = getattr(new_record,'pi',None)
+ pi_hrns = getattr(new_record,'reg-pis',None)
if pi_hrns is not None: record.update_pis (pi_hrns, dbsession)
# update the PLC information that was specified with the record
uuid = create_uuid()
pkey = Keypair(create=True)
urn = hrn_to_urn(record.hrn, record.type)
- gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey)
+
+ email=getattr(record,'email',None)
+ gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey, email)
gid = gid_object.save_to_string(save_parents=True)
record.gid = gid