X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfi.py;h=dd3a5f69688aaf1ad2a8c84c58fabf6008843e41;hb=dcddf6cd52b7e8220d619bf528b13afcfeb6707a;hp=b817ea098af6da1d99e404d052a76f37900676ae;hpb=d84a326cd63b302a528a6fe70531f32f84a537a5;p=sfa.git diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index b817ea09..dd3a5f69 100755 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -117,7 +117,6 @@ def load_record_from_file(filename): class Sfi: - geni_am = None slicemgr = None registry = None user = None @@ -133,10 +132,10 @@ class Sfi: "update": "record", "aggregates": "[name]", "registries": "[name]", + "get_trusted_certs": "cred", "slices": "", "resources": "[name]", "create": "name rspec", - "get_trusted_certs": "cred", "get_ticket": "name rspec", "redeem_ticket": "ticket", "delete": "name", @@ -144,14 +143,10 @@ class Sfi: "start": "name", "stop": "name", "delegate": "name", - "GetVersion": "name", - "ListResources": "name", - "CreateSliver": "name", - "get_geni_aggregates": "name", - "DeleteSliver": "name", - "SliverStatus": "name", - "RenewSliver": "name", - "Shutdown": "name" + "status": "name", + "renew": "name", + "shutdown": "name", + "version": "", } if additional_cmdargs: @@ -183,7 +178,6 @@ class Sfi: help="type filter ([all]|user|slice|authority|node|aggregate)", choices=("all", "user", "slice", "authority", "node", "aggregate"), default="all") - # display formats if command in ("resources"): parser.add_option("-f", "--format", dest="format", type="choice", @@ -214,8 +208,6 @@ class Sfi: # Generate command line parser parser = OptionParser(usage="sfi [options] command [command_options] [command_args]", description="Commands: gid,list,show,remove,add,update,nodes,slices,resources,create,delete,start,stop,reset") - parser.add_option("-g", "--geni_am", dest="geni_am", - help="geni am", metavar="URL", default=None) parser.add_option("-r", "--registry", dest="registry", help="root registry", metavar="URL", default=None) parser.add_option("-s", "--slicemgr", dest="sm", @@ -281,11 +273,6 @@ class Sfi: errors += 1 - if (self.options.geni_am is not None): - geni_am_url = self.options.geni_am - elif hasattr(config, "SFI_GENI_AM"): - geni_am_url = config.SFI_GENI_AM - # Set user HRN if (self.options.user is not None): self.user = self.options.user @@ -321,7 +308,6 @@ class Sfi: # Establish connection to server(s) self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file, self.options.debug) self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file, self.options.debug) - self.geni_am = xmlrpcprotocol.get_server(geni_am_url, key_file, cert_file, self.options.debug) return @@ -462,7 +448,7 @@ class Sfi: def get_component_server_from_hrn(self, hrn): # direct connection to the nodes component manager interface user_cred = self.get_user_cred().save_to_string(save_parents=True) - records = self.registry.resolve(user_cred, hrn) + records = self.registry.Resolve(hrn, user_cred) records = filter_records('node', records) if not records: print "No such component:", opts.component @@ -507,7 +493,7 @@ class Sfi: user_cred = self.get_user_cred().save_to_string(save_parents=True) hrn = args[0] try: - list = self.registry.list(user_cred, hrn) + list = self.registry.List(hrn, user_cred) except IndexError: raise Exception, "Not enough parameters for the 'list' command" @@ -527,7 +513,7 @@ class Sfi: def show(self, opts, args): user_cred = self.get_user_cred().save_to_string(save_parents=True) hrn = args[0] - records = self.registry.resolve(user_cred, hrn) + records = self.registry.Resolve(hrn, user_cred) records = filter_records(opts.type, records) if not records: print "No record of type", opts.type @@ -555,60 +541,46 @@ class Sfi: return def delegate(self, opts, args): - user_cred = self.get_user_cred() - if opts.delegate_user: - object_cred = user_cred - elif opts.delegate_slice: - object_cred = self.get_slice_cred(opts.delegate_slice) - else: - print "Must specify either --user or --slice " - return + user_cred = self.get_user_cred() + if opts.delegate_user: + object_cred = user_cred + elif opts.delegate_slice: + object_cred = self.get_slice_cred(opts.delegate_slice) + else: + print "Must specify either --user or --slice " + return - # the gid and hrn of the object we are delegating - object_gid = object_cred.get_gid_object() - object_hrn = object_gid.get_hrn() + # the gid and hrn of the object we are delegating + object_gid = object_cred.get_gid_object() + object_hrn = object_gid.get_hrn() - if not object_cred.get_privileges().get_all_delegate(): - print "Error: Object credential", object_hrn, "does not have delegate bit set" - return + if not object_cred.get_privileges().get_all_delegate(): + print "Error: Object credential", object_hrn, "does not have delegate bit set" + return - records = self.registry.resolve(user_cred.save_to_string(save_parents=True), args[0]) - records = filter_records("user", records) + records = self.registry.Resolve(args[0], user_cred.save_to_string(save_parents=True)) + records = filter_records("user", records) - if not records: - print "Error: Didn't find a user record for", args[0] - return + if not records: + print "Error: Didn't find a user record for", args[0] + return - # the gid of the user who will be delegated to - delegee_gid = GID(string=records[0]['gid']) - delegee_hrn = delegee_gid.get_hrn() + # the gid of the user who will be delegated to + delegee_gid = GID(string=records[0]['gid']) + delegee_hrn = delegee_gid.get_hrn() - # the key and hrn of the user who will be delegating - user_key = Keypair(filename=self.get_key_file()) - user_hrn = user_cred.get_gid_caller().get_hrn() - subject_string = "%s delegated to %s" % (object_hrn, delegee_hrn) - dcred = Credential(subject=subject_string) - dcred.set_gid_caller(delegee_gid) - dcred.set_gid_object(object_gid) - privs = object_cred.get_privileges() - dcred.set_privileges(object_cred.get_privileges()) - dcred.get_privileges().delegate_all_privileges(True) - dcred.set_pubkey(object_gid.get_pubkey()) - dcred.set_issuer(user_key, user_hrn) - dcred.set_parent(object_cred) - dcred.encode() - dcred.sign() - - if opts.delegate_user: - dest_fn = os.path.join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_" + dcred = object_cred.delegate(delegee_gid, self.get_key_file()) + + if opts.delegate_user: + dest_fn = os.path.join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_" + get_leaf(object_hrn) + ".cred") - elif opts.delegate_slice: - dest_fn = os.path_join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_slice_" + elif opts.delegate_slice: + dest_fn = os.path_join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_slice_" + get_leaf(object_hrn) + ".cred") - dcred.save_to_file(dest_fn, save_parents=True) + dcred.save_to_file(dest_fn, save_parents=True) - print "delegated credential for", object_hrn, "to", delegee_hrn, "and wrote to", dest_fn + print "delegated credential for", object_hrn, "to", delegee_hrn, "and wrote to", dest_fn # removed named registry record # - have to first retrieve the record to be removed @@ -618,7 +590,7 @@ class Sfi: type = opts.type if type in ['all']: type = '*' - return self.registry.remove(auth_cred, type, hrn) + return self.registry.Remove(hrn, auth_cred, type) # add named registry record def add(self, opts, args): @@ -626,7 +598,7 @@ class Sfi: record_filepath = args[0] rec_file = self.get_record_file(record_filepath) record = load_record_from_file(rec_file).as_dict() - return self.registry.register(auth_cred, record) + return self.registry.Register(record, auth_cred) # update named registry entry def update(self, opts, args): @@ -655,11 +627,11 @@ class Sfi: else: raise "unknown record type" + record.get_type() record = record.as_dict() - return self.registry.update(cred, record) + return self.registry.Update(record, cred) def get_trusted_certs(self, opts, args): """ - return the trusted certs at this interface + return uhe trusted certs at this interface """ trusted_certs = self.registry.get_trusted_certs() for trusted_cert in trusted_certs: @@ -680,20 +652,6 @@ class Sfi: display_list(result) return - def get_geni_aggregates(self, opts, args): - """ - return a list of details about known aggregates - """ - user_cred = self.get_user_cred().save_to_string(save_parents=True) - hrn = None - if args: - hrn = args[0] - - result = self.registry.get_geni_aggregates(user_cred, hrn) - display_list(result) - return - - def registries(self, opts, args): """ return a list of details about known registries @@ -712,20 +670,19 @@ class Sfi: # ================================================================== + def version(self, opts, args): + server = self.get_server_from_opts(opts) + + print server.GetVersion() + # list instantiated slices def slices(self, opts, args): """ list instantiated slices """ user_cred = self.get_user_cred().save_to_string(save_parents=True) - server = self.slicemgr - if opts.aggregate: - server = self.get_server(opts.aggregate, opts.port, self.key_file, \ - self.cert_file, self.options.debug) - # direct connection to the nodes component manager interface - if opts.component: - server = self.get_component_server_from_hrn(opts.component) - results = server.get_slices(user_cred) + server = self.get_server_from_opts(opts) + results = server.ListSlices([user_cred]) display_list(results) return @@ -733,19 +690,19 @@ class Sfi: def resources(self, opts, args): user_cred = self.get_user_cred().save_to_string(save_parents=True) server = self.slicemgr - if opts.aggregate: - server = self.get_server(opts.aggregate, opts.port, self.key_file, \ - self.cert_file, self.options.debug) + call_options = {} + server = self.get_server_from_opts(opts) + if args: cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) hrn = args[0] + call_options = {'geni_slice_urn': hrn_to_urn(hrn, 'slice')} else: cred = user_cred hrn = None - - result = server.get_resources(cred, hrn) + + result = server.ListResources([cred], call_options) format = opts.format - display_rspec(result, format) if (opts.file is not None): file = opts.file @@ -757,32 +714,26 @@ class Sfi: # created named slice with given rspec def create(self, opts, args): slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') user_cred = self.get_user_cred() slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) rspec_file = self.get_rspec_file(args[1]) rspec = open(rspec_file).read() - server = self.slicemgr - - if opts.aggregate: - server = self.get_server(opts.aggregate, opts.port, self.key_file, \ - self.cert_file, self.options.debug) - - result = server.create_slice(slice_cred, slice_hrn, rspec) + server = self.get_server_from_opts(opts) + result = server.CreateSliver(slice_urn, [slice_cred], rspec, []) print result return result # get a ticket for the specified slice def get_ticket(self, opts, args): slice_hrn, rspec_path = args[0], args[1] + slice_urn = hrn_to_urn(slice_hrn, 'slice') user_cred = self.get_user_cred() slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) rspec_file = self.get_rspec_file(rspec_path) rspec = open(rspec_file).read() - server = self.slicemgr - if opts.aggregate: - server = self.get_server(opts.aggregate, opts.port, self.key_file, \ - self.cert_file, self.options.debug) - ticket_string = server.get_ticket(slice_cred, slice_hrn, rspec) + server = self.get_server_from_opts(opts) + ticket_string = server.GetTicket(slice_urn, [slice_cred], rspec, []) file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket") print "writing ticket to ", file ticket = SfaTicket(string=ticket_string) @@ -796,6 +747,7 @@ class Sfi: ticket = SfaTicket(filename=ticket_file) ticket.decode() slice_hrn = ticket.gidObject.get_hrn() + slice_urn = hrn_to_urn(slice_hrn, 'slice') #slice_hrn = ticket.attributes['slivers'][0]['hrn'] user_cred = self.get_user_cred() slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) @@ -813,7 +765,7 @@ class Sfi: print "Calling redeem_ticket at %(hostname)s " % locals(), server = self.get_server(hostname, CM_PORT, self.key_file, \ self.cert_file, self.options.debug) - server.redeem_ticket(slice_cred, ticket.save_to_string(save_parents=True)) + server.RedeemTicket(ticket.save_to_string(save_parents=True), slice_cred) print "Success" except socket.gaierror: print "Failed:", @@ -825,111 +777,58 @@ class Sfi: # delete named slice def delete(self, opts, args): slice_hrn = args[0] - server = self.slicemgr - if opts.aggregate: - server = self.get_server(opts.aggregate, opts.port, self.key_file, \ - self.cert_file, self.options.debug) - # direct connection to the nodes component manager interface - if opts.component: - server = self.get_component_server_from_hrn(opts.component) + slice_urn = hrn_to_urn(slice_hrn, 'slice') slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) - return server.delete_slice(slice_cred, slice_hrn) + server = self.get_server_from_opts(opts) + return server.DeleteSliver(slice_urn, [slice_cred]) # start named slice def start(self, opts, args): slice_hrn = args[0] - server = self.slicemgr - # direct connection to an aggregagte - if opts.aggregate: - server = self.get_server(opts.aggregate, opts.port, self.key_file, \ - self.cert_file, self.options.debug) - if opts.component: - server = self.get_component_server_from_hrn(opts.component) + slice_urn = hrn_to_urn(slice_hrn, 'slice') slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) - return server.start_slice(slice_cred, slice_hrn) + server = self.get_server_from_opts(opts) + return server.Start(slice_urn, [slice_cred]) # stop named slice def stop(self, opts, args): slice_hrn = args[0] - server = self.slicemgr - # direct connection to an aggregate - if opts.aggregate: - server = self.get_server(opts.aggregate, opts.port, self.key_file, \ - self.cert_file, self.options.debug) - # direct connection to the nodes component manager interface - if opts.component: - server = self.get_component_server_from_hrn(opts.component) + slice_urn = hrn_to_urn(slice_hrn, 'slice') slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) - return server.stop_slice(slice_cred, slice_hrn) + server = self.get_server_from_opts(opts) + return server.Stop(slice_urn, [slice_cred]) # reset named slice def reset(self, opts, args): slice_hrn = args[0] - server = self.slicemgr - # direct connection to the nodes component manager interface - if opts.component: - server = self.get_component_server_from_hrn(opts.component) + slice_urn = hrn_to_urn(slice_hrn, 'slice') + server = self.get_server_from_opts(opts) slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) - return server.reset_slice(slice_cred, slice_hrn) + return server.reset_slice(slice_cred, slice_urn) + def renew(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + server = self.get_server_from_opts(opts) + slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) + time = args[1] + return server.RenewSliver(slice_urn, [slice_cred], time) - # ===================================================================== - # GENI AM related calls - # ===================================================================== - def GetVersion(self, opts, args): + def status(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) server = self.get_server_from_opts(opts) - print server.GetVersion() + print server.SliverStatus(slice_urn, [slice_cred]) - def ListResources(self, opts, args): - user_cred = self.get_user_cred().save_to_string(save_parents=True) - server = self.geni_am - call_options = {'geni_compressed': True} - xrn = None - cred = user_cred - if args: - xrn = args[0] - cred = self.get_slice_cred(xrn).save_to_string(save_parents=True) - if xrn: - call_options['geni_slice_urn'] = xrn - - rspec = server.ListResources([cred], call_options) - rspec = zlib.decompress(rspec.decode('base64')) - print rspec - - def CreateSliver(self, opts, args): - slice_xrn = args[0] - slice_cred = self.get_slice_cred(slice_xrn).save_to_string(save_parents=True) - rspec_file = self.get_rspec_file(args[1]) - rspec = open(rspec_file).read() - server = self.geni_am - return server.CreateSliver(slice_xrn, [slice_cred], rspec, []) - - def DeleteSliver(self, opts, args): - slice_xrn = args[0] - slice_cred = self.get_slice_cred(slice_xrn).save_to_string(save_parents=True) - server = self.geni_am - return server.DeleteSliver(slice_xrn, [slice_cred]) - - def SliverStatus(self, opts, args): - slice_xrn = args[0] - slice_cred = self.get_slice_cred(slice_xrn).save_to_string(save_parents=True) - server = self.geni_am - print server.SliverStatus(slice_xrn, [slice_cred]) - - def RenewSliver(self, opts, args): - slice_xrn = args[0] - slice_cred = self.get_slice_cred(slice_xrn).save_to_string(save_parents=True) - time = args[1] - server = self.geni_am - return server.RenewSliver(slice_xrn, [slice_cred], time) - - def Shutdown(self, opts, args): - slice_xrn = args[0] - slice_cred = self.get_slice_cred(slice_xrn).save_to_string(save_parents=True) - server = self.geni_am - return server.Shutdown(slice_xrn, [slice_cred]) + def shutdown(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) + server = self.get_server_from_opts(opts) + return server.Shutdown(slice_urn, [slice_cred]) # # Main: parse arguments and dispatch to command