diff options
author | termie <github@anarkystic.com> | 2012-01-24 23:01:51 -0800 |
---|---|---|
committer | termie <github@anarkystic.com> | 2012-01-24 23:01:51 -0800 |
commit | d4f2bf5fdefca433ee81075dd28be6f1b7387b50 (patch) | |
tree | 38da349f91cf0f4fd02ab4c6030f364cb17455df /keystone/cli.py | |
parent | 608b9a270bf2bdc017e02d2575669ec62d0645e7 (diff) | |
download | keystone-d4f2bf5fdefca433ee81075dd28be6f1b7387b50.tar.gz keystone-d4f2bf5fdefca433ee81075dd28be6f1b7387b50.tar.xz keystone-d4f2bf5fdefca433ee81075dd28be6f1b7387b50.zip |
add a bunch of basic tests for the cli
Diffstat (limited to 'keystone/cli.py')
-rw-r--r-- | keystone/cli.py | 146 |
1 files changed, 144 insertions, 2 deletions
diff --git a/keystone/cli.py b/keystone/cli.py index 814ef513..0469ab3a 100644 --- a/keystone/cli.py +++ b/keystone/cli.py @@ -1,8 +1,10 @@ from __future__ import absolute_import +import json import logging import os import sys +import StringIO import textwrap import cli.app @@ -19,7 +21,7 @@ config.register_cli_str('endpoint', default='http://localhost:$admin_port/v2.0', #group='ks', conf=CONF) -config.register_cli_str('auth_token', +config.register_cli_str('auth-token', default='$admin_token', #group='ks', help='asdasd', @@ -113,7 +115,29 @@ class ClientCommand(BaseApp): if CONF.id_only and getattr(resp, 'id'): print resp.id return - print resp + + if resp is None: + return + + # NOTE(termie): this is ugly but it is mostly because the keystoneclient + # code doesn't give us very serializable instance objects + if type(resp) in [type(list()), type(tuple())]: + o = [] + for r in resp: + d = {} + for k, v in sorted(r.__dict__.iteritems()): + if k[0] == '_' or k == 'manager': + continue + d[k] = v + o.append(d) + else: + o = {} + for k, v in sorted(resp.__dict__.iteritems()): + if k[0] == '_' or k == 'manager': + continue + o[k] = v + + print json.dumps(o) def print_help(self): CONF.set_usage(CONF.usage.replace( @@ -175,6 +199,122 @@ CMDS = {'db_sync': DbSync, } +class CommandLineGenerator(object): + """A keystoneclient lookalike to generate keystone-manage commands. + + One would use it like so: + + >>> gen = CommandLineGenerator(id_only=None) + >>> cl = gen.ec2.create(user_id='foo', tenant_id='foo') + >>> cl.to_argv() + ... ['keystone-manage', + '--id-only', + 'ec2', + 'create', + 'user_id=foo', + 'tenant_id=foo'] + + """ + + cmd = 'keystone-manage' + + def __init__(self, cmd=None, execute=False, **kw): + if cmd: + self.cmd = cmd + self.flags = kw + self.execute = execute + + def __getattr__(self, key): + return _Manager(self, key) + + +class _Manager(object): + def __init__(self, parent, name): + self.parent = parent + self.name = name + + def __getattr__(self, key): + return _CommandLine(cmd=self.parent.cmd, + flags=self.parent.flags, + manager=self.name, + method=key, + execute=self.parent.execute) + + +class _CommandLine(object): + def __init__(self, cmd, flags, manager, method, execute=False): + self.cmd = cmd + self.flags = flags + self.manager = manager + self.method = method + self.execute = execute + self.kw = {} + + def __call__(self, **kw): + self.kw = kw + if self.execute: + logging.debug('generated cli: %s', str(self)) + out = StringIO.StringIO() + old_out = sys.stdout + sys.stdout = out + try: + main(self.to_argv()) + except SystemExit as e: + pass + finally: + sys.stdout = old_out + rv = out.getvalue().strip().split('\n')[-1] + try: + loaded = json.loads(rv) + if type(loaded) in [type(list()), type(tuple())]: + return [DictWrapper(**x) for x in loaded] + elif type(loaded) is type(dict()): + return DictWrapper(**loaded) + except Exception: + logging.exception('Could not parse JSON: %s', rv) + return rv + return self + + def __flags(self): + o = [] + for k, v in self.flags.iteritems(): + k = k.replace('_', '-') + if v is None: + o.append('--%s' % k) + else: + o.append('--%s=%s' % (k, str(v))) + return o + + def __manager(self): + if self.manager.endswith('s'): + return self.manager[:-1] + return self.manager + + def __kw(self): + o = [] + for k, v in self.kw.iteritems(): + o.append('%s=%s' % (k, str(v))) + return o + + def to_argv(self): + return ([self.cmd] + + self.__flags() + + [self.__manager(), self.method] + + self.__kw()) + + def __str__(self): + args = self.to_argv() + return ' '.join(args[:1] + ['"%s"' % x for x in args[1:]]) + + +class DictWrapper(dict): + def __getattr__(self, key): + try: + return self[key] + except KeyError: + raise AttributeError(key) + + def print_commands(cmds): print print "Available commands:" @@ -195,7 +335,9 @@ def run(cmd, args): def main(argv=None, config_files=None): + CONF.reset() args = CONF(config_files=config_files, args=argv) + if len(args) < 2: CONF.print_help() print_commands(CMDS) |