From 1335e4c2ea5a9edac23d00a235016d88887fb701 Mon Sep 17 00:00:00 2001 From: termie Date: Mon, 14 Nov 2011 15:50:46 -0800 Subject: [PATCH] cli for adding users, tenants, extras --- bin/keystone | 5 +-- bin/ksl | 75 ++++++++++++++++++++++++++++++++++++++++- etc/default.conf | 7 ++-- keystonelight/client.py | 7 ++-- 4 files changed, 85 insertions(+), 9 deletions(-) diff --git a/bin/keystone b/bin/keystone index 8347fe227c..f902c31b1d 100755 --- a/bin/keystone +++ b/bin/keystone @@ -28,7 +28,8 @@ if __name__ == '__main__': conf = len(sys.argv) > 1 and sys.argv[1] or default_conf app = deploy.loadapp('config:%s' % conf) + options = deploy.appconfig('config:%s' % conf) server = wsgi.Server() - server.start(app, int(app.options['public_port'])) - server.start(app, int(app.options['admin_port'])) + server.start(app, int(options['public_port'])) + server.start(app, int(options['admin_port'])) server.wait() diff --git a/bin/ksl b/bin/ksl index e8f2587a4a..46b8913690 100755 --- a/bin/ksl +++ b/bin/ksl @@ -5,9 +5,16 @@ import sys import cli.app import cli.log +from keystonelight import client + DEFAULT_PARAMS = ( - (('--url',), {'dest': 'url', 'action': 'store'}), + (('--config',), {'dest': 'configfile', + 'action': 'store', + 'default': './etc/default.conf'}), + (('--url',), {'dest': 'url', + 'action': 'store', + 'default': 'http://localhost:5000'}), (('--token',), {'dest': 'token', 'action': 'store'}), ) @@ -21,6 +28,20 @@ class BaseApp(cli.log.LoggingApp): for args, kw in DEFAULT_PARAMS: self.add_param(*args, **kw) + def _parse_keyvalues(self, args): + kv = {} + for x in args: + key, value = x.split('=', 1) + # make lists if there are multiple values + if key in kv: + if type(kv) is type(tuple()): + kv[key] = kv[key] + (value,) + else: + kv[key] = (kv[key], value) + else: + kv[key] = value + return kv + class LoadData(BaseApp): def __init__(self, *args, **kw): @@ -33,7 +54,59 @@ class LoadData(BaseApp): pass +class CrudCommands(BaseApp): + ACTION_MAP = {} + + def __init__(self, *args, **kw): + super(CrudCommands, self).__init__(*args, **kw) + self.add_default_params() + self.add_param('action') + self.add_param('keyvalues', nargs='+') + + def main(self): + """Given some keyvalues create the appropriate data in Keystone Light.""" + c = client.HttpClient(self.params.url, token=self.params.token) + action_name = self.ACTION_MAP[self.params.action] + kv = self._parse_keyvalues(self.params.keyvalues) + resp = getattr(c, action_name)(**kv) + print resp + + +class UserCommands(CrudCommands): + ACTION_MAP = {'add': 'create_user', + 'create': 'create_user',} + + +class TenantCommands(CrudCommands): + ACTION_MAP = {'add': 'create_tenant', + 'create': 'create_tenant',} + + +class ExtrasCommands(CrudCommands): + ACTION_MAP = {'add': 'create_extras', + 'create': 'create_extras',} + + +class Auth(BaseApp): + def __init__(self, *args, **kw): + super(Auth, self).__init__(*args, **kw) + self.add_default_params() + self.add_param('keyvalues', nargs='+') + + def main(self): + """Attempt to authenticate against the Keystone Light API.""" + c = client.HttpClient(self.params.url, token=self.params.token) + kv = self._parse_keyvalues(self.params.keyvalues) + resp = c.authenticate(**kv) + print resp + + + CMDS = {'loaddata': LoadData, + 'user': UserCommands, + 'tenant': TenantCommands, + 'extras': ExtrasCommands, + 'auth': Auth, } diff --git a/etc/default.conf b/etc/default.conf index dc5575d90a..176836dd1e 100644 --- a/etc/default.conf +++ b/etc/default.conf @@ -3,19 +3,20 @@ catalog_driver = keystonelight.backends.kvs.KvsCatalog identity_driver = keystonelight.backends.kvs.KvsIdentity token_driver = keystonelight.backends.kvs.KvsToken public_port = 5000 +admin_port = 5001 admin_token = ADMIN [filter:debug] paste.filter_factory = keystonelight.wsgi:Debug.factory [filter:token_auth] -paste.filter_factory = keystonelight.service:TokenAuthMiddleware.factory +paste.filter_factory = keystonelight.middleware:TokenAuthMiddleware.factory [filter:admin_token_auth] -paste.filter_factory = keystonelight.service:AdminTokenAuthMiddleware.factory +paste.filter_factory = keystonelight.middleware:AdminTokenAuthMiddleware.factory [filter:json_body] -paste.filter_factory = keystonelight.service:JsonBodyMiddleware.factory +paste.filter_factory = keystonelight.middleware:JsonBodyMiddleware.factory [app:keystonelight] paste.app_factory = keystonelight.service:app_factory diff --git a/keystonelight/client.py b/keystonelight/client.py index 25128ba33f..f5a78c5bbd 100644 --- a/keystonelight/client.py +++ b/keystonelight/client.py @@ -77,9 +77,10 @@ class HttpClient(Client): if type(body) is type({}): body = json.dumps(body) headers = self._build_headers(headers) - h = httplib.Http() - resp, content = h.request(path, method=method, headers=headers, body=body) - return webob.Response(content, status=resp.status, headerlist=resp.headers) + h = httplib2.Http() + url = '%s%s' % (self.endpoint, path) + resp, content = h.request(url, method=method, headers=headers, body=body) + return webob.Response(content, status=resp.status, headerlist=resp.items()) class TestClient(Client):