cli for adding users, tenants, extras

This commit is contained in:
termie 2011-11-14 15:50:46 -08:00
parent 9d99821152
commit 1335e4c2ea
4 changed files with 85 additions and 9 deletions

View File

@ -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()

75
bin/ksl
View File

@ -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,
}

View File

@ -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

View File

@ -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):