Merged in trunk -r 17849:17901
authorJosh Karlin <jkarlin@bbn.com>
Tue, 4 May 2010 13:15:30 +0000 (13:15 +0000)
committerJosh Karlin <jkarlin@bbn.com>
Tue, 4 May 2010 13:15:30 +0000 (13:15 +0000)
sfa/client/sfi.py
sfa/plc/api.py
sfa/util/xmlrpcprotocol.py

index 110256f..5b79247 100755 (executable)
@@ -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:
index 3f5a034..0f5cb01 100644 (file)
@@ -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", "")
index be44f08..11a4317 100644 (file)
@@ -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)