From: Tony Mack Date: Thu, 22 Jul 2010 19:23:55 +0000 (+0000) Subject: -a --aggregate option sends request directly to the aggregate (bypass the slice manag... X-Git-Tag: sfa-1.0-0~139 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=f17017e1cde2f43bc4f9b97e8e3590b9119baab1;p=sfa.git -a --aggregate option sends request directly to the aggregate (bypass the slice manager). Previous implementation needed to get aggregate's addres from the slicemanager, but thats no longer necessary; user will specify address. Refactored --- diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 8592ec1a..8c7704c8 100755 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -23,6 +23,8 @@ import sfa.util.xmlrpcprotocol as xmlrpcprotocol from sfa.util.config import Config import zlib +AGGREGATE_PORT=12346 +CM_PORT=12346 # utility methods here # display methods @@ -171,12 +173,12 @@ class Sfi: parser.add_option("-f", "--format", dest="format", type="choice", help="display format ([xml]|dns|ip)", default="xml", choices=("xml", "dns", "ip")) + + if command in ("resources", "slices", "create", "delete", "start", "stop", "get_ticket"): parser.add_option("-a", "--aggregate", dest="aggregate", - default=None, help="aggregate hrn") - - if command in ("create", "get_ticket"): - parser.add_option("-a", "--aggregate", dest="aggregate", default=None, - help="aggregate hrn") + default=None, help="aggregate host") + parser.add_option("-p", "--port", dest="port", + default=AGGREGATE_PORT, help="aggregate port") if command in ("start", "stop", "reset", "delete", "slices"): parser.add_option("-c", "--component", dest="component", default=None, @@ -203,7 +205,7 @@ class Sfi: help="delegate user credential") parser.add_option("-s", "--slice", dest="delegate_slice", help="delegate slice credential", metavar="HRN", default=None) - + return parser @@ -538,15 +540,22 @@ class Sfi: if not records: print "No such component:", opts.component record = records[0] - cm_port = "12346" - url = "https://%s:%s" % (record['hostname'], cm_port) - return xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) - - # + + return self.get_server(record['hostname'], CM_PORT, self.key_file, \ + self.cert_file, self.options.debug) + + def get_server(self, host, port, keyfile, certfile, debug): + """ + Return an instnace of an xmlrpc server connection + """ + url = "http://%s:%s" % (host, port) + return xmlrpcprotocol.get_server(url, keyfile, certfile, debug) + + #========================================================================== # Following functions implement the commands # # Registry-related commands - # + #========================================================================== def dispatch(self, command, cmd_opts, cmd_args): getattr(self, command)(cmd_opts, cmd_args) @@ -761,16 +770,21 @@ class Sfi: return - # + # ================================================================== # Slice-related commands - # + # ================================================================== - # list available nodes -- use 'resources' w/ no argument instead # 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) @@ -783,13 +797,8 @@ class Sfi: user_cred = self.get_user_cred().save_to_string(save_parents=True) server = self.slicemgr if opts.aggregate: - agg_hrn = opts.aggregate - aggregates = self.registry.get_aggregates(user_cred, agg_hrn) - if not aggregates: - raise Exception, "No such aggregate %s" % agg_hrn - aggregate = aggregates[0] - url = "http://%s:%s" % (aggregate['addr'], aggregate['port']) - server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) + server = self.get_server(opts.aggregate, opts.port, self.key_file, \ + self.cert_file, self.options.debug) if args: cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) hrn = args[0] @@ -816,13 +825,11 @@ class Sfi: rspec_file = self.get_rspec_file(args[1]) rspec = open(rspec_file).read() server = self.slicemgr + if opts.aggregate: - aggregates = self.registry.get_aggregates(user_cred, opts.aggregate) - if not aggregates: - raise Exception, "No such aggregate %s" % opts.aggregate - aggregate = aggregates[0] - url = "http://%s:%s" % (aggregate['addr'], aggregate['port']) - server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) + server = self.get_server(opts.aggregate, opts.port, self.key_file, \ + self.cert_file, self.options.debug) + return server.create_slice(slice_cred, slice_hrn, rspec) # get a ticket for the specified slice @@ -834,12 +841,8 @@ class Sfi: rspec = open(rspec_file).read() server = self.slicemgr if opts.aggregate: - aggregates = self.registry.get_aggregates(user_cred, opts.aggregate) - if not aggregates: - raise Exception, "No such aggregate %s" % opts.aggregate - aggregate = aggregates[0] - url = "http://%s:%s" % (aggregate['addr'], aggregate['port']) - server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) + 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) file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket") print "writing ticket to ", file @@ -853,7 +856,7 @@ class Sfi: # use this to get the right slice credential ticket = SfaTicket(filename=ticket_file) ticket.decode() - slice_hrn = ticket.gidObject.get_hrn() + slice_hrn = ticket.gidObject.get_hrn() #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) @@ -868,28 +871,28 @@ class Sfi: connections = {} for hostname in hostnames: try: - cm_port = "12346" - url = "https://%(hostname)s:%(cm_port)s" % locals() - print "Calling redeem_ticket at %(url)s " % locals(), - cm = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug) - cm.redeem_ticket(slice_cred, ticket.save_to_string(save_parents=True)) + 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)) print "Success" except socket.gaierror: print "Failed:", print "Componet Manager not accepting requests" except Exception, e: print "Failed:", e.message - return # 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_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) return server.delete_slice(slice_cred, slice_hrn) @@ -897,10 +900,12 @@ class Sfi: def start(self, opts, args): slice_hrn = args[0] server = self.slicemgr - # direct connection to the nodes component manager interface + # 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_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) return server.start_slice(slice_cred, slice_hrn) @@ -908,10 +913,13 @@ class Sfi: 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_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) return server.stop_slice(slice_cred, slice_hrn) @@ -926,7 +934,9 @@ class Sfi: return server.reset_slice(slice_cred, slice_hrn) + # ===================================================================== # GENI AM related calls + # ===================================================================== def GetVersion(self, opts, args): server = self.geni_am