X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfi.py;h=8971435365970fc1b1d5b26f47811b773e38ab95;hb=02a4a59a4a49183ec8c631cc03243b97f4602d50;hp=8b02ccd059937c3a3e7704570c4d3493865016e5;hpb=6fcf1a82fb3613889f54572217c81e94af965a88;p=sfa.git diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 8b02ccd0..89714353 100644 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -1,5 +1,8 @@ - -# xxx NOTE this will soon be reviewed to take advantage of sfaclientlib +# +# sfi.py - basic SFA command-line client +# the actual binary in sfa/clientbin essentially runs main() +# this module is used in sfascan +# import sys sys.path.append('.') @@ -12,6 +15,7 @@ import pickle from lxml import etree from StringIO import StringIO from optparse import OptionParser +from pprint import PrettyPrinter from sfa.trust.certificate import Keypair, Certificate from sfa.trust.gid import GID @@ -336,8 +340,6 @@ class Sfi: parser.add_option("-D", "--debug", action="store_true", dest="debug", default=False, help="Debug (xml-rpc) protocol messages") - parser.add_option("-p", "--protocol", dest="protocol", default="xmlrpc", - help="RPC protocol (xmlrpc or soap)") # would it make sense to use ~/.ssh/id_rsa as a default here ? parser.add_option("-k", "--private-key", action="store", dest="user_private_key", default=None, @@ -605,9 +607,21 @@ class Sfi: return result ### ois = options if supported + # to be used in something like serverproxy.Method (arg1, arg2, *self.ois(api_options)) def ois (self, server, option_dict): - if self.server_supports_options_arg (server) : return [option_dict] - else: return [] + if self.server_supports_options_arg (server): + return [option_dict] + elif self.server_supports_call_id_arg (server): + return [ unique_call_id () ] + else: + return [] + + ### cis = call_id if supported - like ois + def cis (self, server): + if self.server_supports_call_id_arg (server): + return [ unique_call_id ] + else: + return [] ######################################## miscell utilities def get_rspec_file(self, rspec): @@ -653,8 +667,8 @@ or version information about sfi itself server = self.sliceapi() result = server.GetVersion() version = ReturnValue.get_value(result) - for (k,v) in version.iteritems(): - print "%-20s: %s"%(k,v) + pprinter = PrettyPrinter(indent=4) + pprinter.pprint(version) if options.file: save_variable_to_file(version, options.file, options.fileformat) @@ -772,19 +786,15 @@ or version information about sfi itself def slices(self, options, args): "list instantiated slices (ListSlices) - returns urn's" server = self.sliceapi() - call_args = [] + # creds creds = [self.my_credential_string] if options.delegate: delegated_cred = self.delegate_cred(self.my_credential_string, get_authority(self.authority)) creds.append(delegated_cred) - call_args.append(creds) - if self.server_supports_options_arg(server): - api_options = {} - api_options ['call_id'] = unique_call_id() - args.append(api_options) - elif self.server_supports_call_id_arg(server): - args.append(unique_call_id()) - result = server.ListSlices(*call_args) + # options and call_id when supported + api_options = {} + api_options['call_id']=unique_call_id() + result = server.ListSlices(creds, *self.ois(server,api_options)) value = ReturnValue.get_value(result) display_list(value) return @@ -792,25 +802,23 @@ or version information about sfi itself # show rspec for named slice def resources(self, options, args): """ - with no arg, discover available resources, -or currently provisioned resources (ListResources) + with no arg, discover available resources, (ListResources) +or with an slice hrn, shows currently provisioned resources """ server = self.sliceapi() - call_args = [] - creds = [] # set creds + creds = [] if args: creds.append(self.slice_credential_string(args[0])) else: creds.append(self.my_credential_string) if options.delegate: creds.append(self.delegate_cred(cred, get_authority(self.authority))) - call_args.append(creds) - # set options and callid - print self.server_supports_options_arg(server) + # V2 API if self.server_supports_options_arg(server): + # with v2 everything goes in options inclusing the subject slice api_options = {} if args: hrn = args[0] @@ -830,14 +838,18 @@ or currently provisioned resources (ListResources) else: api_options['geni_rspec_version'] = {'type': 'geni', 'version': '3.0'} api_options ['call_id'] = unique_call_id() - call_args.append(api_options) + # the V2 form + result = server.ListResources (creds, api_options) + # V1 else: + # with an argument if args: hrn = args[0] - call_args.append(hrn) - if self.server_supports_call_id_arg(server): - call_args.append(unique_call_id) - result = server.ListResources(*call_args) + # xxx looks like we can pass a hrn and not a urn here ?? + # last arg. is a raw call_id when supported + result = server.ListResources (creds, hrn, *self.cis(server)) + else: + result = server.ListResources (creds, *self.cis(server)) value = ReturnValue.get_value(result) if options.file is None: display_rspec(value, options.format) @@ -850,14 +862,14 @@ or currently provisioned resources (ListResources) create or update named slice with given rspec """ server = self.sliceapi() - call_args = [] - # set slice urn + + # xxx do we need to check usage (len(args)) ? + # slice urn slice_hrn = args[0] slice_urn = hrn_to_urn(slice_hrn, 'slice') - call_args.append(slice_urn) - # set credentials + + # credentials creds = [self.slice_credential_string(slice_hrn)] - call_args.append(creds) delegated_cred = None server_version = self.get_cached_server_version(server) if server_version.get('interface') == 'slicemgr': @@ -869,10 +881,11 @@ or currently provisioned resources (ListResources) #elif server_version.get('urn'): # delegated_cred = self.delegate_cred(slice_cred, urn_to_hrn(server_version['urn'])) - # set rspec + # rspec rspec_file = self.get_rspec_file(args[1]) rspec = open(rspec_file).read() - # set users + + # users # need to pass along user keys to the aggregate. # users = [ # { urn: urn:publicid:IDN+emulab.net+user+alice @@ -892,20 +905,19 @@ or currently provisioned resources (ListResources) 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) - call_args.append(rspec) - call_args.append(users) # do not append users, keys, or slice tags. Anything # not contained in this request will be removed from the slice # CreateSliver has supported the options argument for a while now so it should - # be safe to assume this server support it + # be safe to assume this server support it api_options = {} api_options ['append'] = False api_options ['call_id'] = unique_call_id() - call_args.append(api_options) - result = server.CreateSliver(*call_args) + + result = server.CreateSliver(slice_urn, creds, rspec, users, *self.ois(server, api_options)) value = ReturnValue.get_value(result) if options.file is None: print value @@ -918,51 +930,46 @@ or currently provisioned resources (ListResources) delete named slice (DeleteSliver) """ server = self.sliceapi() - call_args = [] - # set slice urn + + # slice urn slice_hrn = args[0] slice_urn = hrn_to_urn(slice_hrn, 'slice') - call_args.append(slice_urn) - # set creds + + # creds slice_cred = self.slice_credential_string(slice_hrn) creds = [slice_cred] if options.delegate: delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) creds.append(delegated_cred) - call_args.append(creds) - if self.server_supports_options_arg(server): - api_options = {} - api_options ['call_id'] = unique_call_id() - call_args.append(api_options) - elif self.server_supports_call_id_arg(server): - call_args.append(unique_call_id()) - return server.DeleteSliver(*call_args) + + # options and call_id when supported + api_options = {} + api_options ['call_id'] = unique_call_id() + result = server.DeleteSliver(slice_urn, creds, *self.ois(server, api_options ) ) + # xxx no ReturnValue ?? + return result def status(self, options, args): """ retrieve slice status (SliverStatus) """ server = self.sliceapi() - call_args = [] - # set slice urn + + # slice urn slice_hrn = args[0] slice_urn = hrn_to_urn(slice_hrn, 'slice') - call_args.append(slice_urn) - # set creds + + # creds slice_cred = self.slice_credential_string(slice_hrn) creds = [slice_cred] if options.delegate: delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) creds.append(delegated_cred) - call_args.append(creds) - # set options and call id - if self.server_supports_options_arg(server): - api_options = {} - api_options ['call_id'] = unique_call_id() - call_args.append(api_options) - elif self.server_supports_call_id_arg(server): - call_args.append(unique_call_id()) - result = server.SliverStatus(*call_args) + + # options and call_id when supported + api_options = {} + api_options['call_id']=unique_call_id() + result = server.SliverStatus(slice_urn, creds, *self.ois(server,api_options)) value = ReturnValue.get_value(result) print value if options.file: @@ -973,11 +980,12 @@ or currently provisioned resources (ListResources) start named slice (Start) """ server = self.sliceapi() - call_args = [] - # set the slice urn + + # the slice urn slice_hrn = args[0] slice_urn = hrn_to_urn(slice_hrn, 'slice') - call_args.append(slice_urn) + + # cred slice_cred = self.slice_credential_string(args[0]) creds = [slice_cred] if options.delegate: @@ -990,14 +998,16 @@ or currently provisioned resources (ListResources) """ stop named slice (Stop) """ + server = self.sliceapi() + # slice urn slice_hrn = args[0] slice_urn = hrn_to_urn(slice_hrn, 'slice') + # cred slice_cred = self.slice_credential_string(args[0]) creds = [slice_cred] if options.delegate: delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) creds.append(delegated_cred) - server = self.sliceapi() return server.Stop(slice_urn, creds) # reset named slice @@ -1005,9 +1015,11 @@ or currently provisioned resources (ListResources) """ reset named slice (reset_slice) """ + server = self.sliceapi() + # slice urn slice_hrn = args[0] slice_urn = hrn_to_urn(slice_hrn, 'slice') - server = self.sliceapi() + # cred slice_cred = self.slice_credential_string(args[0]) creds = [slice_cred] if options.delegate: @@ -1020,27 +1032,21 @@ or currently provisioned resources (ListResources) renew slice (RenewSliver) """ server = self.sliceapi() - call_args = [] - # set the slice urn + # slice urn slice_hrn = args[0] slice_urn = hrn_to_urn(slice_hrn, 'slice') - call_args.append(slice_urn) - # set the creds + # creds slice_cred = self.slice_credential_string(args[0]) creds = [slice_cred] if options.delegate: delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) creds.append(delegated_cred) - call_args.append(creds) + # time time = args[1] - call_args.append(time) - if self.server_supports_options_arg(server): - api_options = {} - api_options ['call_id'] = unique_call_id() - call_args.append(api_options) - elif self.server_supports_call_id_arg(server): - call_args.append(unique_call_id()) - result = server.RenewSliver(*call_args) + # options and call_id when supported + api_options = {} + api_options['call_id']=unique_call_id() + result = server.RenewSliver(slice_urn, creds, time, *self.ois(server,api_options)) value = ReturnValue.get_value(result) return value @@ -1049,14 +1055,16 @@ or currently provisioned resources (ListResources) """ shutdown named slice (Shutdown) """ + server = self.sliceapi() + # slice urn slice_hrn = args[0] slice_urn = hrn_to_urn(slice_hrn, 'slice') + # creds slice_cred = self.slice_credential_string(slice_hrn) creds = [slice_cred] if options.delegate: delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) creds.append(delegated_cred) - server = self.sliceapi() return server.Shutdown(slice_urn, creds) @@ -1064,17 +1072,25 @@ or currently provisioned resources (ListResources) """ get a ticket for the specified slice """ + server = self.sliceapi() + # slice urn slice_hrn, rspec_path = args[0], args[1] slice_urn = hrn_to_urn(slice_hrn, 'slice') + # creds slice_cred = self.slice_credential_string(slice_hrn) creds = [slice_cred] if options.delegate: delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) creds.append(delegated_cred) + # rspec rspec_file = self.get_rspec_file(rspec_path) rspec = open(rspec_file).read() - server = self.sliceapi() - ticket_string = server.GetTicket(slice_urn, creds, rspec, []) + # options and call_id when supported + api_options = {} + api_options['call_id']=unique_call_id() + # get ticket at the server + ticket_string = server.GetTicket(slice_urn, creds, rspec, *self.ois(server,api_options)) + # save file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket") self.logger.info("writing ticket to %s"%file) ticket = SfaTicket(string=ticket_string) @@ -1091,6 +1107,8 @@ or currently provisioned resources (ListResources) # use this to get the right slice credential ticket = SfaTicket(filename=ticket_file) ticket.decode() + ticket_string = ticket.save_to_string(save_parents=True) + slice_hrn = ticket.gidObject.get_hrn() slice_urn = hrn_to_urn(slice_hrn, 'slice') #slice_hrn = ticket.attributes['slivers'][0]['hrn'] @@ -1107,12 +1125,14 @@ or currently provisioned resources (ListResources) for hostname in hostnames: try: self.logger.info("Calling redeem_ticket at %(hostname)s " % locals()) - server = self.server_proxy(hostname, CM_PORT, self.private_key, \ - self.my_gid, verbose=self.options.debug) - server.RedeemTicket(ticket.save_to_string(save_parents=True), slice_cred) + cm_url="http://%s:%s/"%(hostname,CM_PORT) + server = SfaServerProxy(cm_url, self.private_key, self.my_gid) + server = self.server_proxy(hostname, CM_PORT, self.private_key, + timeout=self.options.timeout, verbose=self.options.debug) + server.RedeemTicket(ticket_string, slice_cred) self.logger.info("Success") except socket.gaierror: - self.logger.error("redeem_ticket failed: Component Manager not accepting requests") + self.logger.error("redeem_ticket failed on %s: Component Manager not accepting requests"%hostname) except Exception, e: self.logger.log_exc(e.message) return