From: Josh Karlin Date: Tue, 4 May 2010 13:15:30 +0000 (+0000) Subject: Merged in trunk -r 17849:17901 X-Git-Tag: geni-apiv1-totrunk~26 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=09a79d33c8e56eaee8c93d46357645f7069be34c;p=sfa.git Merged in trunk -r 17849:17901 --- diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 110256f8..5b792471 100755 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -238,6 +238,9 @@ class Sfi: parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help="verbose mode") + parser.add_option("-D", "--debug", + action="store_true", dest="debug", default=False, + help="Debug (xml-rpc) protocol messages") parser.add_option("-p", "--protocol", dest="protocol", default="xmlrpc", help="RPC protocol (xmlrpc or soap)") @@ -323,9 +326,10 @@ class Sfi: self.cert_file = cert_file self.cert = Certificate(filename=cert_file) # Establish connection to server(s) - self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file) - self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file) - self.geni_am = xmlrpcprotocol.get_server(geni_am_url, key_file, cert_file) + self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file, self.options.debug) + self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file, self.options.debug) + self.geni_am = xmlrpcprotocol.get_server(geni_am_url, key_file, cert_file, self.options.debug) + return # @@ -545,7 +549,7 @@ class Sfi: record = records[0] cm_port = "12346" url = "https://%s:%s" % (record['hostname'], cm_port) - return xmlrpcprotocol.get_server(url, self.key_file, self.cert_file) + return xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) # # Following functions implement the commands @@ -794,7 +798,7 @@ class Sfi: raise Exception, "No such aggregate %s" % agg_hrn aggregate = aggregates[0] url = "http://%s:%s" % (aggregate['addr'], aggregate['port']) - server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file) + server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) if args: cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) hrn = args[0] @@ -827,7 +831,7 @@ class Sfi: raise Exception, "No such aggregate %s" % opts.aggregate aggregate = aggregates[0] url = "http://%s:%s" % (aggregate['addr'], aggregate['port']) - server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.protocol) + server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) return server.create_slice(slice_cred, slice_hrn, rspec) # get a ticket for the specified slice @@ -844,7 +848,7 @@ class Sfi: raise Exception, "No such aggregate %s" % opts.aggregate aggregate = aggregates[0] url = "http://%s:%s" % (aggregate['addr'], aggregate['port']) - server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.protocol) + server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) ticket_string = server.get_ticket(slice_cred, slice_hrn, rspec) file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket") print "writing ticket to ", file @@ -877,7 +881,7 @@ class Sfi: cm_port = "12346" url = "https://%(hostname)s:%(cm_port)s" % locals() print "Calling redeem_ticket at %(url)s " % locals(), - cm = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file) + cm = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) cm.redeem_ticket(slice_cred, ticket.save_to_string(save_parents=True)) print "Success" except socket.gaierror: diff --git a/sfa/plc/api.py b/sfa/plc/api.py index 3f5a0346..0f5cb011 100644 --- a/sfa/plc/api.py +++ b/sfa/plc/api.py @@ -21,6 +21,7 @@ from sfa.util.namespace import * from sfa.util.api import * from sfa.util.nodemanager import NodeManager from sfa.util.sfalogging import * +from collections import defaultdict def list_to_dict(recs, key): """ @@ -363,6 +364,10 @@ class SfaAPI(BaseAPI): return records def fill_record_sfa_info(self, records): + + def startswith(prefix, values): + return [value for value in values if value.startswith(prefix)] + # get person ids person_ids = [] site_ids = [] @@ -398,7 +403,12 @@ class SfaAPI(BaseAPI): table = self.SfaTable() person_list, persons = [], {} person_list = table.find({'type': 'user', 'pointer': person_ids}) - persons = list_to_dict(person_list, 'pointer') + # create a hrns keyed on the sfa record's pointer. + # Its possible for multiple records to have the same pointer so + # the dict's value will be a list of hrns. + persons = defaultdict(list) + for person in person_list: + persons[person['pointer']].append(person) # get the pl records pl_person_list, pl_persons = [], {} @@ -413,32 +423,36 @@ class SfaAPI(BaseAPI): sfa_info = {} type = record['type'] if (type == "slice"): - # slice users - researchers = [persons[person_id]['hrn'] for person_id in record['person_ids'] \ - if person_id in persons] - sfa_info['researcher'] = researchers + # all slice users are researchers + record['PI'] = [] + record['researchers'] = [] + for person_id in record['person_ids']: + hrns = [person['hrn'] for person in persons[person_id]] + record['researchers'].extend(hrns) + # pis at the slice's site pl_pis = site_pis[record['site_id']] - pi_ids = [pi['person_id'] for pi in pl_pis] - sfa_info['PI'] = [persons[person_id]['hrn'] for person_id in pi_ids] + pi_ids = [pi['person_id'] for pi in pl_pis] + for person_id in pi_ids: + hrns = [person['hrn'] for person in persons[person_id]] + record['PI'].extend(hrns) elif (type == "authority"): - pis, techs, admins = [], [], [] + record['PI'] = [] + record['operator'] = [] + record['owner'] = [] for pointer in record['person_ids']: if pointer not in persons or pointer not in pl_persons: # this means there is not sfa or pl record for this user continue - hrn = persons[pointer]['hrn'] + hrns = [person['hrn'] for person in persons[pointer]] roles = pl_persons[pointer]['roles'] if 'pi' in roles: - pis.append(hrn) + record['PI'].extend(hrns) if 'tech' in roles: - techs.append(hrn) + record['operator'].extend(hrns) if 'admin' in roles: - admins.append(hrn) - sfa_info['PI'] = pis - sfa_info['operator'] = techs - sfa_info['owner'] = admins + record['owner'].extend(hrns) # xxx TODO: OrganizationName elif (type == "node"): sfa_info['dns'] = record.get("hostname", "") diff --git a/sfa/util/xmlrpcprotocol.py b/sfa/util/xmlrpcprotocol.py index be44f082..11a4317d 100644 --- a/sfa/util/xmlrpcprotocol.py +++ b/sfa/util/xmlrpcprotocol.py @@ -45,10 +45,10 @@ class XMLRPCTransport(xmlrpclib.Transport): parser = xmlrpclib.ExpatParser(unmarshaller) return parser, unmarshaller -def get_server(url, key_file, cert_file): +def get_server(url, key_file, cert_file, debug=False): transport = XMLRPCTransport() transport.key_file = key_file transport.cert_file = cert_file - return xmlrpclib.ServerProxy(url, transport, allow_none=True) + return xmlrpclib.ServerProxy(url, transport, allow_none=True, verbose=debug)