X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfi.py;h=cfa1cefc4831136621a00c2990245f2b4073c2a7;hb=6782d10152e23427bb71966548cd9b72b0751169;hp=726138f84ceb10bfe6c513d08443e4aff75f042a;hpb=d3bd7ebad0c47a1bb04e83770ac0350a54f70c1f;p=sfa.git diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py old mode 100644 new mode 100755 index 726138f8..cfa1cefc --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -16,20 +16,21 @@ 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 from sfa.trust.credential import Credential from sfa.util.sfaticket import SfaTicket from sfa.util.record import SfaRecord, UserRecord, SliceRecord, NodeRecord, AuthorityRecord +from sfa.rspecs.rspec import RSpec +from sfa.rspecs.rspec_converter import RSpecConverter from sfa.util.xrn import Xrn, get_leaf, get_authority, hrn_to_urn import sfa.util.xmlrpcprotocol as xmlrpcprotocol from sfa.util.config import Config from sfa.util.version import version_core from sfa.util.cache import Cache -from sfa.rspecs.rspec_version import RSpecVersion -from sfa.rspecs.pg_rspec import pg_rspec_request_version +from sfa.rspecs.version_manager import VersionManager AGGREGATE_PORT=12346 CM_PORT=12346 @@ -88,14 +89,32 @@ def save_rspec_to_file(rspec, filename): f.close() return -def save_records_to_file(filename, recordList): - index = 0 - for record in recordList: - if index > 0: - save_record_to_file(filename + "." + str(index), record) - else: - save_record_to_file(filename, record) - index = index + 1 +def save_records_to_file(filename, recordList, format="xml"): + if format == "xml": + index = 0 + for record in recordList: + if index > 0: + save_record_to_file(filename + "." + str(index), record) + else: + save_record_to_file(filename, record) + index = index + 1 + elif format == "xmllist": + f = open(filename, "w") + f.write("\n") + for record in recordList: + record = SfaRecord(dict=record) + f.write('\n') + f.write("\n"); + f.close() + elif format == "hrnlist": + f = open(filename, "w") + for record in recordList: + record = SfaRecord(dict=record) + f.write(record.get_name() + "\n") + f.close() + else: + # this should never happen + print "unknown output format", format def save_record_to_file(filename, record): if record['type'] in ['user']: @@ -229,12 +248,16 @@ class Sfi: if command in ("resources", "show", "list", "create_gid", 'create'): parser.add_option("-o", "--output", dest="file", help="output XML to file", metavar="FILE", default=None) - + if command in ("show", "list"): parser.add_option("-f", "--format", dest="format", type="choice", help="display format ([text]|xml)", default="text", choices=("text", "xml")) + parser.add_option("-F", "--fileformat", dest="fileformat", type="choice", + help="output file format ([xml]|xmllist|hrnlist)", default="xml", + choices=("xml", "xmllist", "hrnlist")) + if command in ("delegate"): parser.add_option("-u", "--user", action="store_true", dest="delegate_user", default=False, @@ -396,7 +419,7 @@ class Sfi: Returns true if server support the optional call_id arg, false otherwise. """ server_version = self.get_cached_server_version(server) - if 'sfa' in server_version: + if 'sfa' in server_version and 'code_tag' in server_version: code_tag = server_version['code_tag'] code_tag_parts = code_tag.split("-") @@ -681,14 +704,14 @@ class Sfi: list = self.registry.List(hrn, user_cred) except IndexError: raise Exception, "Not enough parameters for the 'list' command" - - # filter on person, slice, site, node, etc. + + # filter on person, slice, site, node, etc. # THis really should be in the self.filter_records funct def comment... list = filter_records(opts.type, list) for record in list: - print "%s (%s)" % (record['hrn'], record['type']) + print "%s (%s)" % (record['hrn'], record['type']) if opts.file: - save_records_to_file(opts.file, list) + save_records_to_file(opts.file, list, opts.fileformat) return # show named registry record @@ -699,7 +722,6 @@ class Sfi: hrn = args[0] user_cred = self.get_user_cred().save_to_string(save_parents=True) records = self.registry.Resolve(hrn, user_cred) - print records records = filter_records(opts.type, records) if not records: print "No record of type", opts.type @@ -719,7 +741,7 @@ class Sfi: else: print record.save_to_string() if opts.file: - save_records_to_file(opts.file, records) + save_records_to_file(opts.file, records, opts.fileformat) return def delegate(self, opts, args): @@ -916,14 +938,15 @@ class Sfi: delegated_cred = self.delegate_cred(cred, get_authority(self.authority)) creds.append(delegated_cred) if opts.rspec_version: + version_manager = VersionManager() server_version = self.get_cached_server_version(server) if 'sfa' in server_version: # just request the version the client wants - call_options['rspec_version'] = dict(RSpecVersion(opts.rspec_version)) + call_options['rspec_version'] = version_manager.get_version(opts.rspec_version).to_dict() else: # this must be a protogeni aggregate. We should request a v2 ad rspec # regardless of what the client user requested - call_options['rspec_version'] = dict(pg_rspec_request_version) + call_options['rspec_version'] = version_manager.get_version('ProtoGENI 2').to_dict() #panos add info options if opts.info: call_options['info'] = opts.info @@ -959,41 +982,24 @@ class Sfi: # keys: [, ] # }] 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) + rspec = RSpec(rspec) + rspec.filter({'component_manager_id': server_version['urn']}) + rspec = RSpecConverter.to_pg_rspec(rspec.toxml(), content_type='request') + 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()) - + result = server.CreateSliver(*call_args) if opts.file is None: print result