X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfi.py;h=0b447263721f06a659517a8a209368b093c330f0;hb=1e95f8a388325499564df5f8eb6eb1fd10ca2d42;hp=3aaae801d55605b78df9dc5982879e152ae9b77d;hpb=a25070387782e1ea97b6cc28f8ed99da77d96c4e;p=sfa.git diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 3aaae801..0b447263 100755 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -6,30 +6,28 @@ import sys sys.path.append('.') import os, os.path import tempfile -import traceback import socket -import random import datetime -import zlib import codecs +import pickle 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 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.trust.sfaticket import SfaTicket from sfa.util.record import SfaRecord, UserRecord, SliceRecord, NodeRecord, AuthorityRecord -from sfa.util.xrn import Xrn, get_leaf, get_authority, hrn_to_urn +from sfa.rspecs.rspec import RSpec +from sfa.rspecs.rspec_converter import RSpecConverter +from sfa.util.xrn import 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 @@ -80,6 +78,17 @@ def filter_records(type, records): # save methods +def save_variable_to_file(var, filename, format="text"): + f = open(filename, "w") + if format == "text": + f.write(str(var)) + elif format == "pickled": + f.write(pickle.dumps(var)) + else: + # this should never happen + print "unknown output format", format + + def save_rspec_to_file(rspec, filename): if not filename.endswith(".rspec"): filename = filename + ".rspec" @@ -103,7 +112,7 @@ def save_records_to_file(filename, recordList, format="xml"): for record in recordList: record = SfaRecord(dict=record) f.write('\n') - f.write("\n"); + f.write("\n") f.close() elif format == "hrnlist": f = open(filename, "w") @@ -257,6 +266,13 @@ class Sfi: help="output file format ([xml]|xmllist|hrnlist)", default="xml", choices=("xml", "xmllist", "hrnlist")) + if command in ("status", "version"): + parser.add_option("-o", "--output", dest="file", + help="output dictionary to file", metavar="FILE", default=None) + parser.add_option("-F", "--fileformat", dest="fileformat", type="choice", + help="output file format ([text]|pickled)", default="text", + choices=("text","pickled")) + if command in ("delegate"): parser.add_option("-u", "--user", action="store_true", dest="delegate_user", default=False, @@ -418,7 +434,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("-") @@ -517,7 +533,6 @@ class Sfi: hrn = self.user gidfile = os.path.join(self.options.sfi_dir, hrn + ".gid") - print gidfile gid = self.get_cached_gid(gidfile) if not gid: user_cred = self.get_user_cred() @@ -900,6 +915,8 @@ class Sfi: version=server.GetVersion() for (k,v) in version.iteritems(): print "%-20s: %s"%(k,v) + if opts.file: + save_variable_to_file(version, opts.file, opts.fileformat) # list instantiated slices def slices(self, opts, args): @@ -937,14 +954,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 @@ -958,63 +976,48 @@ class Sfi: else: save_rspec_to_file(result, opts.file) return - + # created named slice with given rspec def create(self, opts, args): server = self.get_server_from_opts(opts) server_version = self.get_cached_server_version(server) slice_hrn = args[0] - slice_urn = hrn_to_urn(slice_hrn, 'slice') + slice_urn = hrn_to_urn(slice_hrn, 'slice') user_cred = self.get_user_cred() slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) - creds = [slice_cred] - if opts.delegate: - delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) - creds.append(delegated_cred) + # delegate the cred to the callers root authority + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)+'.slicemanager') + #delegated_cred = self.delegate_cred(slice_cred, get_authority(slice_hrn)) + #creds.append(delegated_cred) rspec_file = self.get_rspec_file(args[1]) rspec = open(rspec_file).read() - # need to pass along user keys to the aggregate. + # need to pass along user keys to the aggregate. # users = [ # { urn: urn:publicid:IDN+emulab.net+user+alice - # keys: [, ] + # 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 + if 'sfa' not in server_version: + 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') + creds = [slice_cred] + else: + users = sfa_users_arg(user_records, slice_record) + creds = [slice_cred, delegated_cred] 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 @@ -1156,7 +1159,10 @@ class Sfi: call_args = [slice_urn, creds] if self.server_supports_call_id_arg(server): call_args.append(unique_call_id()) - print server.SliverStatus(*call_args) + result = server.SliverStatus(*call_args) + print result + if opts.file: + save_variable_to_file(result, opts.file, opts.fileformat) def shutdown(self, opts, args):