--- /dev/null
+
+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
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
# 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())
# 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)
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']: