X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fclient%2Fsfaadmin.py;h=9f5fa0ff14104e6b76543d497fcca92361345447;hb=d8cbb0d9310db0a6dc8d9869a935d3d4c1b2ba54;hp=a19e1893fe43c8716cec80260ed20949fda6bf8c;hpb=0bb7f0d38e5060f1be02fa89bb119c19f965195e;p=sfa.git diff --git a/sfa/client/sfaadmin.py b/sfa/client/sfaadmin.py index a19e1893..9f5fa0ff 100755 --- a/sfa/client/sfaadmin.py +++ b/sfa/client/sfaadmin.py @@ -12,8 +12,15 @@ from sfa.client.sfi import save_records_to_file from sfa.trust.hierarchy import Hierarchy from sfa.trust.gid import GID +from sfa.client.candidates import Candidates + pprinter = PrettyPrinter(indent=4) +try: + help_basedir=Hierarchy().basedir +except: + help_basedir='*unable to locate Hierarchy().basedir' + def optparse_listvalue_callback(option, opt, value, parser): setattr(parser.values, option.dest, value.split(',')) @@ -25,11 +32,11 @@ def args(*args, **kwargs): class Commands(object): def _get_commands(self): - available_methods = [] + command_names = [] for attrib in dir(self): if callable(getattr(self, attrib)) and not attrib.startswith('_'): - available_methods.append(attrib) - return available_methods + command_names.append(attrib) + return command_names class RegistryCommands(Commands): @@ -170,11 +177,17 @@ class RegistryCommands(Commands): from sfa.importer import Importer importer = Importer() importer.run() + + def sync_db(self): + """Initiailize or upgrade the db""" + from sfa.storage.dbschema import DBSchema + dbschema=DBSchema() + dbschema.init_or_upgrade @args('-a', '--all', dest='all', metavar='', action='store_true', default=False, - help='Remove all registry records and all files in %s area' % Hierarchy().basedir) + help='Remove all registry records and all files in %s area' % help_basedir) @args('-c', '--certs', dest='certs', metavar='', action='store_true', default=False, - help='Remove all cached certs/gids found in %s' % Hierarchy().basedir ) + help='Remove all cached certs/gids found in %s' % help_basedir ) @args('-0', '--no-reinit', dest='reinit', metavar='', action='store_false', default=True, help='Prevents new DB schema from being installed after cleanup') def nuke(self, all=False, certs=False, reinit=True): @@ -267,65 +280,81 @@ class AggregateCommands(Commands): version = self.api.manager.GetVersion(self.api, {}) pprinter.pprint(version) - def slices(self): - """List the running slices at this Aggregate""" - print self.api.manager.ListSlices(self.api, [], {}) @args('-x', '--xrn', dest='xrn', metavar='', help='object hrn/urn (mandatory)') def status(self, xrn): """Display the status of a slice or slivers""" urn = Xrn(xrn, 'slice').get_urn() - status = self.api.manager.SliverStatus(self.api, urn, [], {}) + status = self.api.manager.SliverStatus(self.api, [urn], {}, {}) pprinter.pprint(status) - @args('-x', '--xrn', dest='xrn', metavar='', help='object hrn/urn', default=None) @args('-r', '--rspec-version', dest='rspec_version', metavar='', default='GENI', help='version/format of the resulting rspec response') - def resources(self, xrn=None, rspec_version='GENI'): - """Display the available resources at an aggregate -or the resources allocated by a slice""" + def resources(self, rspec_version='GENI'): + """Display the available resources at an aggregate""" options = {'geni_rspec_version': rspec_version} if xrn: - options['geni_slice_urn'] = xrn - resources = self.api.manager.ListResources(self.api, [], options) + options['geni_slice_urn'] = Xrn(xrn, 'slice').get_urn() + resources = self.api.manager.ListResources(self.api, {}, options) print resources - + + @args('-x', '--xrn', dest='xrn', metavar='', help='object hrn/urn', default=None) + @args('-r', '--rspec-version', dest='rspec_version', metavar='', + default='GENI', help='version/format of the resulting rspec response') + def describe(self, xrn, rspec_version='GENI'): + """Display the resources allocated by a slice or slivers""" + urn = Xrn(xrn, 'slice').get_urn() + options = {'geni_rspec_version': rspec_version} + status = self.api.manager.Describe(self.api, {}, [urn], options) + print status + @args('-x', '--xrn', dest='xrn', metavar='', help='slice hrn/urn (mandatory)') @args('-r', '--rspec', dest='rspec', metavar='', help='rspec file (mandatory)') @args('-u', '--user', dest='user', metavar='', help='hrn/urn of slice user (mandatory)') @args('-k', '--key', dest='key', metavar='', help="path to user's public key file (mandatory)") - def create(self, xrn, rspec, user, key): + def allocate(self, xrn, rspec, user, key): """Allocate slivers""" xrn = Xrn(xrn, 'slice') - slice_urn=xrn.get_urn() + urn=xrn.get_urn() rspec_string = open(rspec).read() user_xrn = Xrn(user, 'user') user_urn = user_xrn.get_urn() user_key_string = open(key).read() users = [{'urn': user_urn, 'keys': [user_key_string]}] - options={} - self.api.manager.CreateSliver(self, slice_urn, [], rspec_string, users, options) + options={'geni_users': users} + status = self.api.manager.Allocate(self.api, urn, {}, rspec_string, options) + print status + + @args('-x', '--xrn', dest='xrn', metavar='', help='slice hrn/urn (mandatory)') + def provision(self, xrns): + status = self.api.manager.Provision(self.api, [xrns], {}, {}) + print status @args('-x', '--xrn', dest='xrn', metavar='', help='slice hrn/urn (mandatory)') def delete(self, xrn): """Delete slivers""" - self.api.manager.DeleteSliver(self.api, xrn, [], {}) - + result = self.api.manager.DeleteSliver(self.api, [xrn], {}, {}) + print result + @args('-x', '--xrn', dest='xrn', metavar='', help='slice hrn/urn (mandatory)') - def start(self, xrn): + @args('-e', '--expiration', dest='expiration', metavar='', help='Expiration date (mandatory)') + def renew(self, xrn, expiration): """Start slivers""" - self.api.manager.start_slice(self.api, xrn, []) + result = self.api.manager.start_slice(self.api, xrn, {}, expiration, {}) + print result @args('-x', '--xrn', dest='xrn', metavar='', help='slice hrn/urn (mandatory)') - def stop(self, xrn): + def shutdown(self, xrn): """Stop slivers""" - self.api.manager.stop_slice(self.api, xrn, []) + result = self.api.manager.Shutdown(self.api, xrn, {}, {}) + print result @args('-x', '--xrn', dest='xrn', metavar='', help='slice hrn/urn (mandatory)') - def reset(self, xrn): + @args('-a', '--action', dest='action', metavar='', help='Action name (mandatory)') + def operation(self, xrn, action): """Reset sliver""" - self.api.manager.reset_slice(self.api, xrn) - + result = self.api.manager.PerformOperationalAction(self.api, [xrn], {}, action, {}) + print result # @args('-x', '--xrn', dest='xrn', metavar='', help='object hrn/urn', default=None) # @args('-r', '--rspec', dest='rspec', metavar='', help='request rspec', default=None) @@ -347,15 +376,14 @@ class SfaAdmin: 'aggregate': AggregateCommands, 'slicemgr': SliceManagerCommands} - def find_category (self, string): - for (k,v) in SfaAdmin.CATEGORIES.items(): - if k.startswith(string): return k - for (k,v) in SfaAdmin.CATEGORIES.items(): - if k.find(string) >=1: return k - return None + # returns (name,class) or (None,None) + def find_category (self, input): + full_name=Candidates (SfaAdmin.CATEGORIES.keys()).only_match(input) + if not full_name: return (None,None) + return (full_name,SfaAdmin.CATEGORIES[full_name]) def summary_usage (self, category=None): - print "Usage:", self.script_name + " category action []" + print "Usage:", self.script_name + " category command []" if category and category in SfaAdmin.CATEGORIES: categories=[category] else: @@ -389,33 +417,32 @@ class SfaAdmin: self.summary_usage() # ensure category is valid - category_str = argv.pop(0) - category=self.find_category (category_str) - if not category: - self.summary_usage() + category_input = argv.pop(0) + (category_name, category_class) = self.find_category (category_input) + if not category_name or not category_class: + self.summary_usage(category_name) - usage = "%%prog %s action [options]" % (category) + usage = "%%prog %s command [options]" % (category_name) parser = OptionParser(usage=usage) - command_class = SfaAdmin.CATEGORIES.get(category, None) - if not command_class: - self.summary_usage(category) # ensure command is valid - command_instance = command_class() - actions = command_instance._get_commands() + category_instance = category_class() + commands = category_instance._get_commands() if len(argv) < 1: - action = '__call__' + # xxx what is this about ? + command_name = '__call__' else: - action = argv.pop(0) + command_input = argv.pop(0) + command_name = Candidates (commands).only_match (command_input) - if hasattr(command_instance, action): - command = getattr(command_instance, action) + if command_name and hasattr(category_instance, command_name): + command = getattr(category_instance, command_name) else: - self.summary_usage(category) + self.summary_usage(category_name) # ensure options are valid options = getattr(command, 'options', []) - usage = "%%prog %s %s [options]" % (category, action) + usage = "%%prog %s %s [options]" % (category_name, command_name) parser = OptionParser(usage=usage) for arg, kwd in options: parser.add_option(*arg, **kwd) @@ -442,3 +469,4 @@ class SfaAdmin: except Exception: print "Command failed, please check log for more info" raise +