X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfi.py;h=0b447263721f06a659517a8a209368b093c330f0;hb=1e95f8a388325499564df5f8eb6eb1fd10ca2d42;hp=cfa1cefc4831136621a00c2990245f2b4073c2a7;hpb=6782d10152e23427bb71966548cd9b72b0751169;p=sfa.git diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index cfa1cefc..0b447263 100755 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -6,26 +6,23 @@ 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, sfa_to_pg_users_arg +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.rspecs.rspec import RSpec from sfa.rspecs.rspec_converter import RSpecConverter -from sfa.util.xrn import Xrn, get_leaf, get_authority, hrn_to_urn +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 @@ -81,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" @@ -104,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") @@ -258,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, @@ -518,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() @@ -901,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): @@ -960,26 +976,26 @@ 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 = [] slice_records = self.registry.Resolve(slice_urn, [user_cred.save_to_string(save_parents=True)]) @@ -988,18 +1004,20 @@ class Sfi: 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)]) - + 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 @@ -1141,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):