X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfi.py;h=6bb41c9cb6761f62c8455d02fa653702483a5e9d;hb=8a72ea951407d90bdeb05e27976197b330db4247;hp=d6f2fee14deb8b09accf300e580d79c3409c4c60;hpb=5c1d6fc7677f607761d0dff824017235cfc4b0fe;p=sfa.git diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index d6f2fee1..6bb41c9c 100644 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -138,7 +138,7 @@ def save_rspec_to_file(rspec, filename): if not filename.endswith(".rspec"): filename = filename + ".rspec" f = open(filename, 'w') - f.write(rspec) + f.write("%s"%rspec) f.close() return @@ -387,13 +387,16 @@ class Sfi: help='how myslice config variables as well') if command in ("version"): - parser.add_option("-R","--registry-version", - action="store_true", dest="version_registry", default=False, - help="probe registry version instead of sliceapi") 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"): + parser.add_option("-I", "--interface", dest="interface", type="choice", + help="Select the SFA interface the call should target (Slice Interface (sm) | Registry Interface (registry))", + choices=("sm", "registry"), + default="sm") + if command in ("add", "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) @@ -434,7 +437,7 @@ class Sfi: help="specify specific keys to be displayed from record") if command in ("resources", "describe"): # rspec version - parser.add_option("-r", "--rspec-version", dest="rspec_version", default="SFA 1", + parser.add_option("-r", "--rspec-version", dest="rspec_version", default="GENI 3", help="schema type and version of resulting RSpec") # disable/enable cached rspecs parser.add_option("-c", "--current", dest="current", default=False, @@ -492,6 +495,8 @@ use this if you mean an authority instead""") metavar="slice_hrn", help="delegate cred. for slice HRN") parser.add_option("-a", "--auths", dest='delegate_auths',action='append',default=[], metavar='auth_hrn', help="delegate PI cred for auth HRN") + parser.add_option('-d', '--delegate', dest='delegate', help="Override 'delegate' from the config file") + parser.add_option('-b', '--backend', dest='backend', help="Override 'backend' from the config file") return parser @@ -876,7 +881,7 @@ use this if you mean an authority instead""") if options.version_local: version=version_core() else: - if options.version_registry: + if options.interface == "registry": server=self.registry() else: server = self.sliceapi() @@ -1134,7 +1139,7 @@ use this if you mean an authority instead""") if self.options.raw: save_raw_to_file(result, self.options.raw, self.options.rawformat, self.options.rawbanner) if options.file is not None: - save_rspec_to_file(value, options.file) + save_rspec_to_file(value['geni_rspec'], options.file) if (self.options.raw is None) and (options.file is None): display_rspec(value, options.format) @@ -1219,7 +1224,7 @@ use this if you mean an authority instead""") if self.options.raw: save_raw_to_file(result, self.options.raw, self.options.rawformat, self.options.rawbanner) if options.file is not None: - save_rspec_to_file (value, options.file) + save_rspec_to_file (value['geni_rspec'], options.file) if (self.options.raw is None) and (options.file is None): print value return value @@ -1279,7 +1284,7 @@ use this if you mean an authority instead""") if self.options.raw: save_raw_to_file(result, self.options.raw, self.options.rawformat, self.options.rawbanner) if options.file is not None: - save_rspec_to_file (value, options.file) + save_rspec_to_file (value['geni_rspec'], options.file) if (self.options.raw is None) and (options.file is None): print value return value @@ -1491,8 +1496,9 @@ $ sfi myslice $ sfi -v myslice -- or sfi -vv myslice same but with more and more verbosity -$ sfi m +$ 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 def myslice (self, options, args): @@ -1508,21 +1514,31 @@ $ sfi m if len(args)>0: self.print_help() sys.exit(1) + # enable info by default + self.logger.setLevelFromOptVerbose(self.options.verbose+1) ### the rough sketch goes like this + # (0) produce a p12 file + self.client_bootstrap.my_pkcs12() + # (a) rain check for sufficient config in sfi_config - # we don't allow to override these settings for now myslice_dict={} - myslice_keys=['backend', 'delegate', 'platform', 'username'] + myslice_keys=[ 'backend', 'delegate', 'platform', 'username'] for key in myslice_keys: - full_key="MYSLICE_" + key.upper() - value=getattr(self.config_instance,full_key,None) + value=None + # oct 2013 - I'm finding myself juggling with config files + # so a couple of command-line options can now override config + if hasattr(options,key) and getattr(options,key) is not None: + value=getattr(options,key) + else: + full_key="MYSLICE_" + key.upper() + value=getattr(self.config_instance,full_key,None) if value: myslice_dict[key]=value else: print "Unsufficient config, missing key %s in [myslice] section of sfi_config"%key if len(myslice_dict) != len(myslice_keys): sys.exit(1) # (b) figure whether we are PI for the authority where we belong - self.logger.info("Resolving our own id") + self.logger.info("Resolving our own id %s"%self.user) my_records=self.registry().Resolve(self.user,self.my_credential_string) if len(my_records)!=1: print "Cannot Resolve %s -- exiting"%self.user; sys.exit(1) my_record=my_records[0] @@ -1533,18 +1549,18 @@ $ sfi m my_auths = my_auths_all if options.delegate_auths: my_auths = list(set(my_auths_all).intersection(set(options.delegate_auths))) + self.logger.debug("Restricted to user-provided auths"%(my_auths)) - self.logger.info("Delegate PI creds for authorities: %s"%my_auths ) # (c) get the set of slices that we are in my_slices_all=my_record['reg-slices'] self.logger.info("Found %d slices that we are member of"%len(my_slices_all)) self.logger.debug("They are: %s"%(my_slices_all)) my_slices = my_slices_all + # if user provided slices, deal only with these - if they are found if options.delegate_slices: my_slices = list(set(my_slices_all).intersection(set(options.delegate_slices))) - - self.logger.info("Delegate slice creds for slices: %s"%my_slices) + self.logger.debug("Restricted to user-provided slices: %s"%(my_slices)) # (d) make sure we have *valid* credentials for all these hrn_credentials=[] @@ -1562,11 +1578,18 @@ $ sfi m hrn_delegated_credentials = [] for (hrn, htype, credential) in hrn_credentials: delegated_credential = self.client_bootstrap.delegate_credential_string (credential, delegatee_hrn, delegatee_type) - hrn_delegated_credentials.append ((hrn, htype, delegated_credential, )) + # save these so user can monitor what she's uploaded + filename = os.path.join ( self.options.sfi_dir, + "%s.%s_for_%s.%s.cred"%(hrn,htype,delegatee_hrn,delegatee_type)) + with file(filename,'w') as f: + f.write(delegated_credential) + self.logger.debug("(Over)wrote %s"%filename) + hrn_delegated_credentials.append ((hrn, htype, delegated_credential, filename, )) # (f) and finally upload them to manifold server # xxx todo add an option so the password can be set on the command line # (but *NOT* in the config file) so other apps can leverage this + self.logger.info("Uploading on backend at %s"%myslice_dict['backend']) uploader = ManifoldUploader (logger=self.logger, url=myslice_dict['backend'], platform=myslice_dict['platform'], @@ -1574,7 +1597,7 @@ $ sfi m password=options.password) uploader.prompt_all() (count_all,count_success)=(0,0) - for (hrn,htype,delegated_credential) in hrn_delegated_credentials: + for (hrn,htype,delegated_credential,filename) in hrn_delegated_credentials: # inspect inspect=Credential(string=delegated_credential) expire_datetime=inspect.get_expiration() @@ -1582,8 +1605,8 @@ $ sfi m if uploader.upload(delegated_credential,message=message): count_success+=1 count_all+=1 - self.logger.info("Successfully uploaded %d/%d credentials"%(count_success,count_all)) + # at first I thought we would want to save these, # like 'sfi delegate does' but on second thought # it is probably not helpful as people would not @@ -1596,7 +1619,15 @@ $ sfi m """ return the trusted certs at this interface (get_trusted_certs) """ - trusted_certs = self.registry().get_trusted_certs() + if options.interface == "registry": + server=self.registry() + else: + server = self.sliceapi() + cred = self.my_authority_credential_string() + trusted_certs = server.get_trusted_certs(cred) + if options.interface != "registry": + trusted_certs = ReturnValue.get_value(trusted_certs) + for trusted_cert in trusted_certs: print "\n===========================================================\n" gid = GID(string=trusted_cert)