use sfa.client.client_helper to generate users list in CreateSliver
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Mon, 10 Oct 2011 19:46:46 +0000 (15:46 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Mon, 10 Oct 2011 19:46:46 +0000 (15:46 -0400)
sfa/client/client_helper.py [new file with mode: 0644]
sfa/client/sfi.py
sfa/managers/slice_manager_pl.py
sfa/rspecs/sfa_rspec_converter.py

diff --git a/sfa/client/client_helper.py b/sfa/client/client_helper.py
new file mode 100644 (file)
index 0000000..64c8b43
--- /dev/null
@@ -0,0 +1,37 @@
+
+def pg_users_arg(records):
+    users = []  
+    for record in records:
+        if record['type'] != 'user': 
+            continue
+        user = {'urn': record['geni_urn'],
+                'keys': record['keys']}
+        users.append(user)
+    return users    
+
+def sfa_users_arg(records, slice_record):
+    users = []
+    for record in records:
+        if record['type'] != 'user': 
+            continue
+        user = {'urn': record['geni_urn'], #
+                'keys': record['keys'],
+                'email': record['email'], #  needed for MyPLC
+                'person_id': record['person_id'], # needed for MyPLC
+                'first_name': record['first_name'], # needed for MyPLC
+                'last_name': record['last_name'], # needed for MyPLC
+                'slice_record': slice_record, # needed for legacy refresh peer
+                'key_ids': record['key_ids'] # needed for legacy refresh peer
+                }         
+        users.append(user)
+    return users        
+
+def sfa_to_pg_users_arg(users):
+
+    new_users = []
+    fields = ['urn', 'keys']
+    for user in users:
+        new_user = dict([item for item in user.items() \
+          if item[0] in fields])
+        new_users.append(new_user)
+    return new_users        
index 838b291..384d6f1 100755 (executable)
@@ -16,7 +16,7 @@ from lxml import etree
 from StringIO import StringIO
 from types import StringTypes, ListType
 from optparse import OptionParser
-
+from sfa.client.client_helper import pg_users_arg, sfa_users_arg, sfa_to_pg_users_arg 
 from sfa.util.sfalogging import sfi_logger
 from sfa.trust.certificate import Keypair, Certificate
 from sfa.trust.gid import GID
@@ -980,37 +980,17 @@ class Sfi:
         #    keys: [<ssh key A>, <ssh key B>] 
         #  }]
         users = []
-        all_keys = []
-        all_key_ids = []
         slice_records = self.registry.Resolve(slice_urn, [user_cred.save_to_string(save_parents=True)])
         if slice_records and 'researcher' in slice_records[0] and slice_records[0]['researcher']!=[]:
             slice_record = slice_records[0]
             user_hrns = slice_record['researcher']
             user_urns = [hrn_to_urn(hrn, 'user') for hrn in user_hrns]
             user_records = self.registry.Resolve(user_urns, [user_cred.save_to_string(save_parents=True)])
-            for user_record in user_records:
-                if user_record['type'] != 'user':
-                    continue
-                #user = {'urn': user_cred.get_gid_caller().get_urn(),'keys': []}
-                user = {'urn': user_cred.get_gid_caller().get_urn(), #
-                        'keys': user_record['keys'],
-                        'email': user_record['email'], #  needed for MyPLC
-                        'person_id': user_record['person_id'], # needed for MyPLC
-                        'first_name': user_record['first_name'], # needed for MyPLC
-                        'last_name': user_record['last_name'], # needed for MyPLC
-                        'slice_record': slice_record, # needed for legacy refresh peer
-                        'key_ids': user_record['key_ids'] # needed for legacy refresh peer
-                } 
-                users.append(user)
-                all_keys.extend(user_record['keys'])
-                all_key_ids.extend(user_record['key_ids'])
-            # ProtoGeni Aggregates will only install the keys of the user that is issuing the
-            # request. So we will add all to the current caller's list of keys
+            
             if 'sfa' not in server_version:
-                for user in users:
-                    if user['urn'] == user_cred.get_gid_caller().get_urn():
-                        user['keys'] = all_keys  
-
+                users = pg_users_arg(user_records)
+            else:
+                users = sfa_users_arg(user_records, slice_record)
         call_args = [slice_urn, creds, rspec, users]
         if self.server_supports_call_id_arg(server):
             call_args.append(unique_call_id())
index 6ad7888..f41f8de 100644 (file)
@@ -194,12 +194,13 @@ def CreateSliver(api, xrn, creds, rspec_str, users, call_id):
             # Need to call GetVersion at an aggregate to determine the supported
             # rspec type/format beofre calling CreateSliver at an Aggregate.
             server_version = api.get_cached_server_version(server)
+            requested_users = users
             if 'sfa' not in server_version and 'geni_api' in server_version:
                 # sfa aggregtes support both sfa and pg rspecs, no need to convert
                 # if aggregate supports sfa rspecs. otherwise convert to pg rspec
                 rspec = RSpecConverter.to_pg_rspec(rspec, 'request')
-                raise
-            args = [xrn, credential, rspec, users]
+                requested_users = sfa_to_pg_users(users)
+            args = [xrn, credential, rspec, requested_users]
             if _call_id_supported(api, server):
                 args.append(call_id)
             rspec = server.CreateSliver(*args)
index 29581e2..368ce6b 100755 (executable)
@@ -35,20 +35,33 @@ class SfaRSpecConverter:
                 node_attrs = {}
                 node_attrs['exclusive'] = 'false'
                 if 'component_manager_id' in sfa_node_element.attrib:
-                    component_manager_id = sfa_node_element.attrib['component_manager_id']
+                    node_attrs['component_manager_id'] = sfa_node_element.attrib['component_manager_id']
                 else:
-                    component_manager_id = hrn_to_urn(network, 'authority+cm')
-                node_attrs['component_manager_id'] = component_manager_id
+                    node_attrs['component_manager_id'] = hrn_to_urn(network, 'authority+cm')
+
+                if 'component_id' in sfa_node_element.attrib:
+                    node_attrs['compoenent_id'] = sfa_node_element.attrib['component_id']
+
                 if sfa_node_element.find('hostname') != None:
-                    node_attrs['component_name'] = sfa_node_element.find('hostname').text
-                if sfa_node_element.find('urn') != None:
-                    node_attrs['component_id'] = sfa_node_element.find('urn').text
+                    hostname = sfa_node_element.find('hostname').text
+                    node_attrs['component_name'] = hostname
+                    node_attrs['client_id'] = hostname
                 node_element = pg_rspec.xml.add_element('node', node_attrs)    
             
                 if content_type == 'request':
                     sliver_element = sfa_node_element.find('sliver')
+                    sliver_type_elements = sfa_node_element.xpath('./sliver_type', namespaces=sfa_rspec.namespaces)
+                    available_sliver_types = [element.attrib['name'] for element in sliver_type_elements]
+                    valid_sliver_types = ['emulab-openvz', 'raw-pc']
+                   
+                    # determine sliver type 
+                    requested_sliver_type = 'emulab-openvz'
+                    for available_sliver_type in available_sliver_types:
+                        if available_sliver_type in valid_sliver_types:
+                            requested_sliver_type = available_sliver_type
+                                
                     if sliver_element != None:
-                        pg_rspec.xml.add_element('sliver_type', {'name': 'planetlab-vnode'}, parent=node_element) 
+                        pg_rspec.xml.add_element('sliver_type', {'name': requested_sliver_type}, parent=node_element) 
                 else:
                     # create node_type element
                     for hw_type in ['plab-pc', 'pc']: