X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfi.py;h=3a61bffa0c099f48e449d95ae0950eb0cfc10556;hb=d2ad391e985e62a693ecd0e2c3cc65ef0b97b27b;hp=a77f258f0aea51ec7c6792b070d331d071b5c818;hpb=5b82b6b9ec6cd3f9ce39b26a9802268789d2f56d;p=sfa.git diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index a77f258f..3a61bffa 100644 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -31,6 +31,7 @@ from sfa.util.xrn import get_leaf, get_authority, hrn_to_urn, Xrn from sfa.util.config import Config from sfa.util.version import version_core from sfa.util.cache import Cache +from sfa.util.printable import printable from sfa.storage.record import Record @@ -203,8 +204,8 @@ def load_record_from_opts(options): record_dict['keys'] = [pubkey] if hasattr(options, 'slices') and options.slices: record_dict['slices'] = options.slices - if hasattr(options, 'researchers') and options.researchers: - record_dict['researcher'] = options.researchers + if hasattr(options, 'reg_researchers') and options.reg_researchers is not None: + record_dict['reg-researchers'] = options.reg_researchers if hasattr(options, 'email') and options.email: record_dict['email'] = options.email if hasattr(options, 'pis') and options.pis: @@ -241,7 +242,7 @@ from functools import wraps commands_list=[] commands_dict={} -def register_command (args_string, example,aliases=None): +def declare_command (args_string, example,aliases=None): def wrap(m): name=getattr(m,'__name__') doc=getattr(m,'__doc__',"-- missing doc --") @@ -298,8 +299,8 @@ class Sfi: ### suitable if no reasonable command has been provided def print_commands_help (self, options): verbose=getattr(options,'verbose') - format3="%10s %-30s %s" - format3offset=42 + format3="%10s %-35s %s" + format3offset=47 line=80*'-' if not verbose: print format3%("command","cmd_args","description") @@ -391,7 +392,7 @@ class Sfi: sys.exit(2) # retrieve args_string - (_, args_string, __,___) = commands_dict[command] + (_, args_string, __,canonical) = commands_dict[command] parser = OptionParser(add_help_option=False, usage="sfi [sfi_options] %s [cmd_options] %s" @@ -399,21 +400,21 @@ class Sfi: parser.add_option ("-h","--help",dest='help',action='store_true',default=False, help="Summary of one command usage") - if command in ("config"): + if canonical in ("config"): parser.add_option('-m', '--myslice', dest='myslice', action='store_true', default=False, help='how myslice config variables as well') - if command in ("version"): + if canonical in ("version"): parser.add_option("-l","--local", action="store_true", dest="version_local", default=False, help="display version of the local client") - if command in ("version", "trusted"): + if canonical in ("version", "trusted"): parser.add_option("-R","--registry_interface", action="store_true", dest="registry_interface", default=False, help="target the registry interface instead of slice interface") - if command in ("register", "update"): + if canonical in ("register", "update"): parser.add_option('-x', '--xrn', dest='xrn', metavar='', help='object hrn/urn (mandatory)') parser.add_option('-t', '--type', dest='type', metavar='', help='object type', default=None) parser.add_option('-e', '--email', dest='email', default="", help="email (mandatory for users)") @@ -421,8 +422,8 @@ class Sfi: default=None) parser.add_option('-s', '--slices', dest='slices', metavar='', help='Set/replace slice xrns', default='', type="str", action='callback', callback=optparse_listvalue_callback) - parser.add_option('-r', '--researchers', dest='researchers', metavar='', - help='Set/replace slice researchers', default='', type="str", action='callback', + parser.add_option('-r', '--researchers', dest='reg_researchers', metavar='', + help='Set/replace slice researchers - use -r none to reset', default=None, type="str", action='callback', callback=optparse_listvalue_callback) parser.add_option('-p', '--pis', dest='pis', metavar='', help='Set/replace Principal Investigators/Project Managers', default='', type="str", action='callback', callback=optparse_listvalue_callback) @@ -431,7 +432,7 @@ class Sfi: help="set extra/testbed-dependent flags, e.g. --extra enabled=true") # user specifies remote aggregate/sm/component - if command in ("resources", "describe", "allocate", "provision", "delete", "allocate", "provision", + if canonical in ("resources", "describe", "allocate", "provision", "delete", "allocate", "provision", "action", "shutdown", "renew", "status"): parser.add_option("-d", "--delegate", dest="delegate", default=None, action="store_true", @@ -439,19 +440,21 @@ class Sfi: "authority in set of credentials for this call") # show_credential option - if command in ("list","resources", "describe", "provision", "allocate", "register","update","remove","delete","status","renew"): + if canonical in ("list","resources", "describe", "provision", "allocate", "register","update","remove","delete","status","renew"): parser.add_option("-C","--credential",dest='show_credential',action='store_true',default=False, help="show credential(s) used in human-readable form") # registy filter option - if command in ("list", "show", "remove"): + if canonical in ("list", "show", "remove"): parser.add_option("-t", "--type", dest="type", type="choice", help="type filter ([all]|user|slice|authority|node|aggregate)", choices=("all", "user", "slice", "authority", "node", "aggregate"), default="all") - if command in ("show"): + if canonical in ("show"): parser.add_option("-k","--key",dest="keys",action="append",default=[], help="specify specific keys to be displayed from record") - if command in ("resources", "describe"): + parser.add_option("-n","--no-details",dest="no_details",action="store_true",default=False, + help="call Resolve without the 'details' option") + if canonical in ("resources", "describe"): # rspec version parser.add_option("-r", "--rspec-version", dest="rspec_version", default="GENI 3", help="schema type and version of resulting RSpec") @@ -472,11 +475,11 @@ class Sfi: choices=("all", "resources", "leases"), default="resources") - if command in ("resources", "describe", "allocate", "provision", "show", "list", "gid"): + if canonical in ("resources", "describe", "allocate", "provision", "show", "list", "gid"): parser.add_option("-o", "--output", dest="file", help="output XML to file", metavar="FILE", default=None) - if command in ("show", "list"): + if canonical in ("show", "list"): parser.add_option("-f", "--format", dest="format", type="choice", help="display format ([text]|xml)", default="text", choices=("text", "xml")) @@ -484,12 +487,12 @@ class Sfi: parser.add_option("-F", "--fileformat", dest="fileformat", type="choice", help="output file format ([xml]|xmllist|hrnlist)", default="xml", choices=("xml", "xmllist", "hrnlist")) - if command == 'list': + if canonical == 'list': parser.add_option("-r", "--recursive", dest="recursive", action='store_true', help="list all child records", default=False) parser.add_option("-v", "--verbose", dest="verbose", action='store_true', help="gives details, like user keys", default=False) - if command in ("delegate"): + if canonical in ("delegate"): parser.add_option("-u", "--user", action="store_true", dest="delegate_user", default=False, help="delegate your own credentials; default if no other option is provided") @@ -504,7 +507,7 @@ class Sfi: help="""by default the mandatory argument is expected to be a user, use this if you mean an authority instead""") - if command in ("myslice"): + if canonical in ("myslice"): parser.add_option("-p","--password",dest='password',action='store',default=None, help="specify mainfold password on the command line") parser.add_option("-s", "--slice", dest="delegate_slices",action='append',default=[], @@ -521,10 +524,11 @@ use this if you mean an authority instead""") # Main: parse arguments and dispatch to command # def dispatch(self, command, command_options, command_args): - method=getattr(self, command, None) + (doc, args_string, example, canonical) = commands_dict[command] + method=getattr(self, canonical, None) if not method: - print "Unknown command %s"%command - return + print "sfi: unknown command %s"%command + raise SystemExit,"Unknown command %s"%command return method(command_options, command_args) def main(self): @@ -864,7 +868,7 @@ use this if you mean an authority instead""") # Registry-related commands #========================================================================== - @register_command("","") + @declare_command("","") def config (self, options, args): "Display contents of current config" print "# From configuration file %s"%self.config_file @@ -888,7 +892,7 @@ use this if you mean an authority instead""") value=getattr(self.config_instance,varname) print "%-20s = %s"%(name,value) - @register_command("","") + @declare_command("","") def version(self, options, args): """ display an SFA server version (GetVersion) @@ -909,7 +913,7 @@ use this if you mean an authority instead""") pprinter = PrettyPrinter(indent=4) pprinter.pprint(version) - @register_command("authority","") + @declare_command("authority","") def list(self, options, args): """ list entries in named authority registry (List) @@ -937,7 +941,7 @@ use this if you mean an authority instead""") save_records_to_file(options.file, list, options.fileformat) return - @register_command("name","") + @declare_command("name","") def show(self, options, args): """ show details about named registry record (Resolve) @@ -947,7 +951,9 @@ use this if you mean an authority instead""") sys.exit(1) hrn = args[0] # explicitly require Resolve to run in details mode - record_dicts = self.registry().Resolve(hrn, self.my_credential_string, {'details':True}) + resolve_options={} + if not options.no_details: resolve_options['details']=True + record_dicts = self.registry().Resolve(hrn, self.my_credential_string, resolve_options) record_dicts = filter_records(options.type, record_dicts) if not record_dicts: self.logger.error("No record of type %s"% options.type) @@ -970,7 +976,7 @@ use this if you mean an authority instead""") return # this historically was named 'add', it is now 'register' with an alias for legacy - @register_command("[xml-filename]","",['add']) + @declare_command("[xml-filename]","",['add']) def register(self, options, args): """create new record in registry (Register) from command line options (recommended) @@ -1006,7 +1012,7 @@ use this if you mean an authority instead""") record_dict['last_name'] = record_dict['hrn'] return self.registry().Register(record_dict, auth_cred) - @register_command("[xml-filename]","") + @declare_command("[xml-filename]","") def update(self, options, args): """update record into registry (Update) from command line options (recommended) @@ -1050,7 +1056,7 @@ use this if you mean an authority instead""") show_credentials(cred) return self.registry().Update(record_dict, cred) - @register_command("hrn","") + @declare_command("hrn","") def remove(self, options, args): "remove registry record by name (Remove)" auth_cred = self.my_authority_credential_string() @@ -1070,7 +1076,7 @@ use this if you mean an authority instead""") # ================================================================== # show rspec for named slice - @register_command("","") + @declare_command("","") def resources(self, options, args): """ discover available resources (ListResources) @@ -1121,7 +1127,7 @@ use this if you mean an authority instead""") return - @register_command("slice_hrn","") + @declare_command("slice_hrn","") def describe(self, options, args): """ shows currently allocated/provisioned resources @@ -1165,7 +1171,7 @@ use this if you mean an authority instead""") return - @register_command("slice_hrn [...]","") + @declare_command("slice_hrn [...]","") def delete(self, options, args): """ de-allocate and de-provision all or named slivers of the named slice (Delete) @@ -1200,7 +1206,7 @@ use this if you mean an authority instead""") print value return value - @register_command("slice_hrn rspec","") + @declare_command("slice_hrn rspec","") def allocate(self, options, args): """ allocate resources to the named slice (Allocate) @@ -1257,7 +1263,7 @@ use this if you mean an authority instead""") return value - @register_command("slice_hrn [...]","") + @declare_command("slice_hrn [...]","") def provision(self, options, args): """ provision all or named already allocated slivers of the named slice (Provision) @@ -1322,7 +1328,7 @@ use this if you mean an authority instead""") print value return value - @register_command("slice_hrn","") + @declare_command("slice_hrn","") def status(self, options, args): """ retrieve the status of the slivers belonging to the named slice (Status) @@ -1351,7 +1357,7 @@ use this if you mean an authority instead""") # Thierry: seemed to be missing return value - @register_command("slice_hrn [...] action","") + @declare_command("slice_hrn [...] action","") def action(self, options, args): """ Perform the named operational action on all or named slivers of the named slice @@ -1383,7 +1389,7 @@ use this if you mean an authority instead""") print value return value - @register_command("slice_hrn [...] time","") + @declare_command("slice_hrn [...] time","") def renew(self, options, args): """ renew slice (Renew) @@ -1421,7 +1427,7 @@ use this if you mean an authority instead""") return value - @register_command("slice_hrn","") + @declare_command("slice_hrn","") def shutdown(self, options, args): """ shutdown named slice (Shutdown) @@ -1442,7 +1448,7 @@ use this if you mean an authority instead""") return value - @register_command("[name]","") + @declare_command("[name]","") def gid(self, options, args): """ Create a GID (CreateGid) @@ -1461,7 +1467,7 @@ use this if you mean an authority instead""") GID(string=gid).save_to_file(filename) #################### - @register_command("to_hrn","""$ sfi delegate -u -p -s ple.inria.heartbeat -s ple.inria.omftest ple.upmc.slicebrowser + @declare_command("to_hrn","""$ sfi delegate -u -p -s ple.inria.heartbeat -s ple.inria.omftest ple.upmc.slicebrowser will locally create a set of delegated credentials for the benefit of ple.upmc.slicebrowser the set of credentials in the scope for this call would be @@ -1523,7 +1529,7 @@ use this if you mean an authority instead""") self.logger.info("delegated credential for %s to %s and wrote to %s"%(message,to_hrn,filename)) #################### - @register_command("","""$ less +/myslice sfi_config + @declare_command("","""$ less +/myslice sfi_config [myslice] backend = http://manifold.pl.sophia.inria.fr:7080 # the HRN that myslice uses, so that we are delegating to @@ -1547,7 +1553,7 @@ $ sfi m -b http://mymanifold.foo.com:7080/ is synonym to sfi myslice as no other command starts with an 'm' and uses a custom backend for this one call """ -) # register_command +) # declare_command def myslice (self, options, args): """ This helper is for refreshing your credentials at myslice; it will @@ -1661,7 +1667,7 @@ $ sfi m -b http://mymanifold.foo.com:7080/ if count_success != count_all: sys.exit(1) return - @register_command("cred","") + @declare_command("cred","") def trusted(self, options, args): """ return the trusted certs at this interface (get_trusted_certs)