+
+
+def make_record_xml(xml_str):
+ xml = XML(xml_str)
+ xml_dict = xml.todict()
+ logger.info("load from xml, keys=%s" % xml_dict.keys())
+ return make_record_dict(xml_dict)
+
+####################
+# augment local records with data from builtin relationships
+# expose related objects as a list of hrns
+# we pick names that clearly won't conflict with the ones used in the old approach,
+# were the relationships data came from the testbed side
+# for each type, a dict of the form {<field-name-exposed-in-record>:<alchemy_accessor_name>}
+# so after that, an 'authority' record will e.g. have a 'reg-pis' field
+# with the hrns of its pi-users
+augment_map = {'authority': {'reg-pis': 'reg_pis', },
+ 'slice': {'reg-researchers': 'reg_researchers', },
+ 'user': {'reg-pi-authorities': 'reg_authorities_as_pi',
+ 'reg-slices': 'reg_slices_as_researcher', },
+ }
+
+
+# xxx mystery
+# the way we use sqlalchemy might be a little wrong
+# in any case what has been observed is that (Reg)Records as returned by an sqlalchemy
+# query not always have their __dict__ properly adjusted
+# typically a RegAuthority object would have its object.name set properly, but
+# object.__dict__ has no 'name' key
+# which is an issue because we rely on __dict__ for many things, in particular this
+# is what gets exposed to the drivers (this is historical and dates back before sqlalchemy)
+# so it is recommended to always run this function that will make sure
+# that such built-in fields are properly set in __dict__ too
+#
+def augment_with_sfa_builtins(local_record):
+ # don't ruin the import of that file in a client world
+ from sfa.util.xrn import Xrn
+ # add a 'urn' field
+ setattr(local_record, 'reg-urn',
+ Xrn(xrn=local_record.hrn, type=local_record.type).urn)
+ # users have keys and this is needed to synthesize 'users' sent over to
+ # CreateSliver
+ fields_to_check = []
+ if local_record.type == 'user':
+ user_keys = [key.key for key in local_record.reg_keys]
+ setattr(local_record, 'reg-keys', user_keys)
+ fields_to_check = ['email']
+ elif local_record.type == 'authority':
+ fields_to_check = ['name']
+ for field in fields_to_check:
+ if not field in local_record.__dict__:
+ logger.debug("augment_with_sfa_builtins: hotfixing missing '{}' in {}"
+ .format(field, local_record.hrn))
+ local_record.__dict__[field] = getattr(local_record, field)
+ # search in map according to record type
+ type_map = augment_map.get(local_record.type, {})
+ # use type-dep. map to do the job
+ for (field_name, attribute) in type_map.items():
+ # get related objects
+ related_records = getattr(local_record, attribute, [])
+ hrns = [r.hrn for r in related_records]
+ setattr(local_record, field_name, hrns)