X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfi.py;h=73d009976fbaa50aab4c66a1f4a8ae6956faf551;hb=e67041c37b86490c71d2f0b4d4b9c27b283141de;hp=8b02ccd059937c3a3e7704570c4d3493865016e5;hpb=6fcf1a82fb3613889f54572217c81e94af965a88;p=sfa.git diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 8b02ccd0..73d00997 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,52 +802,43 @@ 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) - if self.server_supports_options_arg(server): - api_options = {} - if args: - hrn = args[0] - api_options['geni_slice_urn'] = hrn_to_urn(hrn, 'slice') - if options.info: - api_options['info'] = options.info - if options.rspec_version: - version_manager = VersionManager() - server_version = self.get_cached_server_version(server) - if 'sfa' in server_version: - # just request the version the client wants - api_options['geni_rspec_version'] = version_manager.get_version(options.rspec_version).to_dict() - else: - # this must be a protogeni aggregate. We should request a v2 ad rspec - # regardless of what the client user requested - api_options['geni_rspec_version'] = version_manager.get_version('ProtoGENI 2').to_dict() + + # no need to check if server accepts the options argument since the options has + # been a required argument since v1 API + api_options = {} + # always send call_id to v2 servers + api_options ['call_id'] = unique_call_id() + # ask for cached value if available + api_options ['cached'] = True + if args: + hrn = args[0] + api_options['geni_slice_urn'] = hrn_to_urn(hrn, 'slice') + if options.info: + api_options['info'] = options.info + if options.rspec_version: + version_manager = VersionManager() + server_version = self.get_cached_server_version(server) + if 'sfa' in server_version: + # just request the version the client wants + api_options['geni_rspec_version'] = version_manager.get_version(options.rspec_version).to_dict() else: api_options['geni_rspec_version'] = {'type': 'geni', 'version': '3.0'} - api_options ['call_id'] = unique_call_id() - call_args.append(api_options) else: - 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) + api_options['geni_rspec_version'] = {'type': 'geni', 'version': '3.0'} + result = server.ListResources (creds, api_options) value = ReturnValue.get_value(result) if options.file is None: display_rspec(value, options.format) @@ -850,14 +851,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 +870,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 @@ -894,18 +896,16 @@ or currently provisioned resources (ListResources) else: 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 +918,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 +968,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 +986,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 +1003,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 +1020,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 +1043,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 +1060,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 +1095,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 +1113,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