Merge branch 'master' into senslab2
authorSandrine Avakian <sandrine.avakian@inria.fr>
Thu, 12 Jul 2012 12:27:07 +0000 (14:27 +0200)
committerSandrine Avakian <sandrine.avakian@inria.fr>
Thu, 12 Jul 2012 12:27:07 +0000 (14:27 +0200)
1  2 
sfa/client/sfi.py
sfa/util/xrn.py

diff --combined sfa/client/sfi.py
@@@ -40,6 -40,7 +40,7 @@@ from sfa.client.sfaclientlib import Sfa
  from sfa.client.sfaserverproxy import SfaServerProxy, ServerException
  from sfa.client.client_helper import pg_users_arg, sfa_users_arg
  from sfa.client.return_value import ReturnValue
+ from sfa.client.candidates import Candidates
  
  CM_PORT=12346
  
@@@ -112,6 -113,21 +113,21 @@@ def filter_records(type, records)
      return filtered_records
  
  
+ def credential_printable (credential_string):
+     credential=Credential(string=credential_string)
+     result=""
+     result += credential.get_summary_tostring()
+     result += "\n"
+     rights = credential.get_privileges()
+     result += "rights=%s"%rights
+     result += "\n"
+     return result
+ def show_credentials (cred_s):
+     if not isinstance (cred_s,list): cred_s = [cred_s]
+     for cred in cred_s:
+         print "Using Credential %s"%credential_printable(cred)
  # save methods
  def save_raw_to_file(var, filename, format="text", banner=None):
      if filename == "-":
@@@ -278,8 -294,8 +294,8 @@@ class Sfi
          ("get_ticket", "slice_hrn rspec"),
          ("redeem_ticket", "ticket"),
          ("delegate", "name"),
-         ("create_gid", "[name]"),
-         ("get_trusted_certs", "cred"),
+         ("gid", "[name]"),
+         ("trusted", "cred"),
          ("config", ""),
          ]
  
                               help="Include a credential delegated to the user's root"+\
                                    "authority in set of credentials for this call")
  
+         # show_credential option
+         if command in ("list","resources","create","add","update","remove","slices","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"):
              parser.add_option("-t", "--type", dest="type", type="choice",
  
  
          # 'create' does return the new rspec, makes sense to save that too
-         if command in ("resources", "show", "list", "create_gid", 'create'):
+         if command in ("resources", "show", "list", "gid", 'create'):
             parser.add_option("-o", "--output", dest="file",
                              help="output XML to file", metavar="FILE", default=None)
  
              self.print_command_help(options)
              return -1
      
-         command = args[0]
+         # complete / find unique match with command set
+         command_candidates = Candidates (self.available_names)
+         input = args[0]
+         command = command_candidates.only_match(input)
+         if not command:
+             self.print_command_help(options)
+             sys.exit(1)
+         # second pass options parsing
          self.command_parser = self.create_command_parser(command)
          (command_options, command_args) = self.command_parser.parse_args(args[1:])
          self.command_options = command_options
  
          self.read_config () 
          self.bootstrap ()
-         self.logger.info("Command=%s" % command)
+         self.logger.debug("Command=%s" % command)
  
          try:
              self.dispatch(command, command_options, command_args)
      
      # init self-signed cert, user credentials and gid
      def bootstrap (self):
-         client_bootstrap = SfaClientBootstrap (self.user, self.reg_url, self.options.sfi_dir)
+         client_bootstrap = SfaClientBootstrap (self.user, self.reg_url, self.options.sfi_dir,
+                                                logger=self.logger)
          # if -k is provided, use this to initialize private key
          if self.options.user_private_key:
              client_bootstrap.init_private_key_if_missing (self.options.user_private_key)
@@@ -802,6 -830,8 +830,8 @@@ or version information about sfi itsel
          if options.recursive:
              opts['recursive'] = options.recursive
          
+         if options.show_credential:
+             show_credentials(self.my_credential_string)
          try:
              list = self.registry().List(hrn, self.my_credential_string, options)
          except IndexError:
      def add(self, options, args):
          "add record into registry from xml file (Register)"
          auth_cred = self.my_authority_credential_string()
+         if options.show_credential:
+             show_credentials(auth_cred)
          record_dict = {}
          if len(args) > 0:
              record_filepath = args[0]
              cred = self.my_authority_credential_string()
          else:
              raise "unknown record type" + record_dict['type']
+         if options.show_credential:
+             show_credentials(cred)
          return self.registry().Update(record_dict, cred)
    
      def remove(self, options, args):
          type = options.type 
          if type in ['all']:
              type = '*'
+         if options.show_credential:
+             show_credentials(auth_cred)
          return self.registry().Remove(hrn, auth_cred, type)
      
      # ==================================================================
          # options and call_id when supported
          api_options = {}
        api_options['call_id']=unique_call_id()
+         if options.show_credential:
+             show_credentials(creds)
          result = server.ListSlices(creds, *self.ois(server,api_options))
          value = ReturnValue.get_value(result)
          if self.options.raw:
@@@ -959,6 -997,8 +997,8 @@@ or with an slice hrn, shows currently p
              creds.append(self.my_credential_string)
          if options.delegate:
              creds.append(self.delegate_cred(cred, get_authority(self.authority)))
+         if options.show_credential:
+             show_credentials(creds)
  
          # no need to check if server accepts the options argument since the options has
          # been a required argument since v1 API
  
          # credentials
          creds = [self.slice_credential_string(slice_hrn)]
          delegated_cred = None
          server_version = self.get_cached_server_version(server)
          if server_version.get('interface') == 'slicemgr':
              #elif server_version.get('urn'):
              #    delegated_cred = self.delegate_cred(slice_cred, urn_to_hrn(server_version['urn']))
  
+         if options.show_credential:
+             show_credentials(creds)
          # rspec
          rspec_file = self.get_rspec_file(args[1])
          rspec = open(rspec_file).read()
                  rspec.filter({'component_manager_id': server_version['urn']})
                  rspec = RSpecConverter.to_pg_rspec(rspec.toxml(), content_type='request')
              else:
 +                print >>sys.stderr, "\r\n \r\n \r\n WOOOOOO"
                  users = sfa_users_arg(user_records, slice_record)
  
          # do not append users, keys, or slice tags. Anything
          # options and call_id when supported
          api_options = {}
          api_options ['call_id'] = unique_call_id()
+         if options.show_credential:
+             show_credentials(creds)
          result = server.DeleteSliver(slice_urn, creds, *self.ois(server, api_options ) )
          value = ReturnValue.get_value(result)
          if self.options.raw:
          # options and call_id when supported
          api_options = {}
          api_options['call_id']=unique_call_id()
+         if options.show_credential:
+             show_credentials(creds)
          result = server.SliverStatus(slice_urn, creds, *self.ois(server,api_options))
          value = ReturnValue.get_value(result)
          if self.options.raw:
          # options and call_id when supported
          api_options = {}
        api_options['call_id']=unique_call_id()
+         if options.show_credential:
+             show_credentials(creds)
          result =  server.RenewSliver(slice_urn, creds, input_time, *self.ois(server,api_options))
          value = ReturnValue.get_value(result)
          if self.options.raw:
                  self.logger.log_exc(e.message)
          return
  
-     def create_gid(self, options, args):
+     def gid(self, options, args):
          """
          Create a GID (CreateGid)
          """
  
          self.logger.info("delegated credential for %s to %s and wrote to %s"%(object_hrn, delegee_hrn,dest_fn))
      
-     def get_trusted_certs(self, options, args):
+     def trusted(self, options, args):
          """
          return uhe trusted certs at this interface (get_trusted_certs)
          """ 
              gid = GID(string=trusted_cert)
              gid.dump()
              cert = Certificate(string=trusted_cert)
-             self.logger.debug('Sfi.get_trusted_certs -> %r'%cert.get_subject())
+             self.logger.debug('Sfi.trusted -> %r'%cert.get_subject())
          return 
  
      def config (self, options, args):
diff --combined sfa/util/xrn.py
@@@ -22,7 -22,7 +22,7 @@@
  #----------------------------------------------------------------------
  
  import re
 -
 +import sys
  from sfa.util.faults import SfaAPIError
  
  # for convenience and smoother translation - we should get rid of these functions eventually 
@@@ -121,7 -121,6 +121,7 @@@ class Xrn
      # provide either urn, or (hrn + type)
      def __init__ (self, xrn, type=None):
          if not xrn: xrn = ""
 +       
          # user has specified xrn : guess if urn or hrn
          if Xrn.is_urn(xrn):
              self.hrn=None
          # self.authority keeps a list
          if not hasattr(self,'authority'): 
              self.authority=Xrn.hrn_auth_list(self.hrn)
 -
 +       
 +       
      def get_leaf(self):
          self._normalize()
          return self.leaf
          if self.type and self.type.startswith('authority'):
              self.authority = Xrn.hrn_auth_list(self.hrn)
              leaf = self.get_leaf() 
-             if not self.authority:
-                 self.authority = [self.hrn]
+             #if not self.authority:
+             #    self.authority = [self.hrn]
              type_parts = self.type.split("+")
              self.type = type_parts[0]
              name = 'sa'
              if len(type_parts) > 1:
                  name = type_parts[1]
-             authority_string = ":".join([self.get_authority_urn(), leaf])
+             auth_parts = [part for part in [self.get_authority_urn(), leaf] if part]  
+             authority_string = ":".join(auth_parts)
          else:
              self.authority = Xrn.hrn_auth_list(self.hrn)
              name = Xrn.hrn_leaf(self.hrn)