Implementing a minimal, but useful CLI.

Change-Id: I8181cc2395ae1aad6a324ec65395ebc62455f29b
This commit is contained in:
jakedahn
2012-01-18 01:17:57 -08:00
parent d1171195e7
commit cbe1f82931
2 changed files with 256 additions and 20 deletions

View File

@@ -55,31 +55,31 @@ class OpenStackIdentityShell(object):
action='store_true',
help=argparse.SUPPRESS)
parser.add_argument('--username',
parser.add_argument('--os-username',
default=env('OS_USERNAME'),
help='Defaults to env[OS_USERNAME].')
parser.add_argument('--password',
parser.add_argument('--os-password',
default=env('OS_PASSWORD'),
help='Defaults to env[OS_PASSWORD].')
parser.add_argument('--tenant_name',
parser.add_argument('--os-tenant_name',
default=env('OS_TENANT_NAME'),
help='Defaults to env[OS_TENANT_NAME].')
parser.add_argument('--tenant_id',
parser.add_argument('--os-tenant_id',
default=env('OS_TENANT_ID'),
help='Defaults to env[OS_TENANT_ID].')
parser.add_argument('--url',
parser.add_argument('--os-auth-url',
default=env('OS_AUTH_URL'),
help='Defaults to env[OS_AUTH_URL].')
parser.add_argument('--region_name',
parser.add_argument('--os-region_name',
default=env('KEYSTONE_REGION_NAME'),
help='Defaults to env[KEYSTONE_REGION_NAME].')
parser.add_argument('--version',
parser.add_argument('--os-version',
default=env('KEYSTONE_VERSION'),
help='Accepts 1.0 or 1.1, defaults to env[KEYSTONE_VERSION].')
@@ -133,7 +133,7 @@ class OpenStackIdentityShell(object):
(options, args) = parser.parse_known_args(argv)
# build available subcommands based on version
subcommand_parser = self.get_subcommand_parser(options.version)
subcommand_parser = self.get_subcommand_parser(options.os_version)
self.parser = subcommand_parser
# Parse args again and call whatever callback was selected
@@ -151,24 +151,25 @@ class OpenStackIdentityShell(object):
#FIXME(usrleon): Here should be restrict for project id same as
# for username or apikey but for compatibility it is not.
if not args.username:
if not args.os_username:
raise exc.CommandError("You must provide a username:"
"via --username or env[OS_USERNAME]")
if not args.password:
if not args.os_password:
raise exc.CommandError("You must provide a password, either"
"via --password or env[OS_PASSWORD]")
if not args.url:
if not args.os_auth_url:
raise exc.CommandError("You must provide a auth url, either"
"via --auth_url or via"
"env[OS_AUTH_URL")
"via --os-auth_url or via"
"env[OS_AUTH_URL]")
self.cs = self.get_api_class(options.version)(username=args.username,
tenant_name=args.tenant_name,
tenant_id=args.tenant_id,
password=args.password,
auth_url=args.auth_url,
region_name=args.region_name)
self.cs = self.get_api_class(options.os_version)(
username=args.os_username,
tenant_name=args.os_tenant_name,
tenant_id=args.os_tenant_id,
password=args.os_password,
auth_url=args.os_auth_url,
region_name=args.os_region_name)
try:
self.cs.authenticate()
@@ -188,7 +189,7 @@ class OpenStackIdentityShell(object):
return shell_v2_0.CLIENT_CLASS
@utils.arg('command', metavar='<subcommand>', nargs='?',
help='Display help for <subcommand>')
help='Display help for <subcommand>')
def do_help(self, args):
"""
Display help about this program or one of its subcommands.

235
keystoneclient/v2_0/shell.py Normal file → Executable file
View File

@@ -16,5 +16,240 @@
# under the License.
from keystoneclient.v2_0 import client
from keystoneclient import utils
CLIENT_CLASS = client.Client
@utils.arg('tenant',
metavar='<tenant_id>',
help='ID of Tenant. (Optional)',
nargs='?',
default=None)
def do_user_list(kc, args):
users = kc.users.list(tenant_id=args.tenant)
utils.print_list(users, ['id', 'enabled', 'email', 'name', 'tenantId'])
@utils.arg('--username', metavar='<username>', nargs='?',
help='Desired username. (unique)')
@utils.arg('--password', metavar='<password>', nargs='?',
help='Desired password.')
@utils.arg('--email', metavar='<email>', nargs='?',
help='Desired email address. (unique)')
@utils.arg('--default-tenant', metavar='<default_tenant>', nargs='?',
help='User will join the default tenant as a Member.')
@utils.arg('--enabled', metavar='<enabled>', nargs='?', default=True,
help='Enable user immediately (Optional, default True)')
def do_user_create(kc, args):
user = kc.users.create(args.username, args.password, args.email,
tenant_id=args.default_tenant, enabled=args.enabled)
utils.print_dict(user._info)
@utils.arg('id', metavar='<user_id>', nargs='?',
help='User ID to update email.')
@utils.arg('email', metavar='<email>', nargs='?',
help='New desired email address.')
def do_user_update_email(kc, args):
user = kc.users.update_email(args.id, args.email)
utils.print_dict(user._info)
@utils.arg('id', metavar='<user_id>', nargs='?', help='User ID to enable.')
def do_user_enable(kc, args):
try:
kc.users.update_enabled(args.id, True)
print 'User has been enabled.'
except:
'Unable to enable user.'
@utils.arg('id', metavar='<user_id>', nargs='?', help='User ID to disable.')
def do_user_disable(kc, args):
try:
kc.users.update_enabled(args.id, False)
print 'User has been disabled.'
except:
'Unable to disable user.'
@utils.arg('id', metavar='<user_id>', nargs='?', help='User ID to update.')
@utils.arg('password', metavar='<password>', nargs='?',
help='New desired password.')
def do_user_update_password(kc, args):
try:
kc.users.update_password(args.id, args.password)
print 'User password has been udpated.'
except:
'Unable to update users password.'
@utils.arg('id', metavar='<user_id>', nargs='?', help='User ID to delete.')
def do_user_delete(kc, args):
try:
kc.users.delete(args.id)
print 'User has been deleted.'
except:
'Unable to delete user.'
@utils.arg('--tenant-name', metavar='<tenant_name>', nargs='?',
help='Desired name of new tenant.')
@utils.arg('--description', metavar='<description>', nargs='?', default=None,
help='Useful description of new tenant (optional, default is None)')
@utils.arg('--enabled', metavar='<enabled>', nargs='?', default=True,
help='Enable user immediately (Optional, default True)')
def do_tenant_create(kc, args):
tenant = kc.tenants.create(args.tenant_name,
description=args.description,
enabled=args.enabled)
utils.print_dict(tenant._info)
@utils.arg('id', metavar='<tenant_id>', nargs='?', help='Tenant ID to enable.')
def do_tenant_enable(kc, args):
try:
kc.tenants.update(args.id, enabled=True)
print 'Tenant has been enabled.'
except:
'Unable to enable tenant.'
@utils.arg('id', metavar='<tenant_id>', nargs='?', help='Tenant ID to disable')
def do_tenant_disable(kc, args):
try:
kc.tenants.update_enabled(args.id, enabled=False)
print 'Tenant has been disabled.'
except:
'Unable to disable tenant.'
@utils.arg('id', metavar='<tenant_id>', nargs='?', help='Tenant ID to delete')
def do_tenant_delete(kc, args):
try:
kc.tenants.delete(args.id)
print 'Tenant has been deleted.'
except:
'Unable to delete tenant.'
@utils.arg('--service-name', metavar='<service_name>', nargs='?',
help='Desired name of service. (unique)')
# TODO(jakedahn): add service type examples to helptext.
@utils.arg('--service-type', metavar='<service_type>', nargs='?',
help='Possible service types: identity, compute, network, \
image, or object-store.')
@utils.arg('--description', metavar='<service_description>', nargs='?',
help='Useful description of service.')
def do_service_create(kc, args):
service = kc.services.create(args.service_name,
args.service_type,
args.description)
utils.print_dict(service._info)
def do_service_list(kc, args):
services = kc.services.list()
utils.print_list(services, ['id', 'name', 'type', 'description'])
@utils.arg('id',
metavar='<service_id>',
help='ID of Service to retrieve.',
nargs='?')
def do_service_get(kc, args):
service = kc.services.get(args.id)
utils.print_dict(service._info)
@utils.arg('id',
metavar='<service_id>',
help='ID of Service to delete',
nargs='?')
def do_service_get(kc, args):
try:
kc.services.delete(args.id)
print 'Service has been deleted'
except:
print 'Unable to delete service.'
def do_role_list(kc, args):
roles = kc.roles.list()
utils.print_list(roles, ['id', 'name'])
@utils.arg('id', metavar='<role_id>', help='ID of Role to fetch.', nargs='?')
def do_role_get(kc, args):
role = kc.roles.get(args.id)
utils.print_dict(role._info)
@utils.arg('role-name', metavar='<role_name>', nargs='?',
help='Desired name of new role.')
def do_role_create(kc, args):
role = kc.roles.create(args.role_name)
utils.print_dict(role._info)
@utils.arg('id', metavar='<role_id>', help='ID of Role to delete.', nargs='?')
def do_role_delete(kc, args):
try:
kc.roles.delete(args.id)
print 'Role has been deleted.'
except:
print 'Unable to delete role.'
@utils.arg('id', metavar='<user_id>', help='ID of User', nargs='?')
def do_user_roles(kc, args):
roles = kc.roles.get_user_role_refs(args.id)
for role in roles:
try:
role.tenant = kc.tenants.get(role.tenantId).name
except Exception, e:
role.tenant = 'n/a'
role.name = kc.roles.get(role.roleId).name
utils.print_list(roles, ['tenant', 'name'])
# TODO(jakedahn): refactor this to allow role, user, and tenant names.
@utils.arg('tenant_id', metavar='<tenant_id>', help='ID of Tenant', nargs='?')
@utils.arg('user_id', metavar='<user_id>', help='ID of User', nargs='?')
@utils.arg('role_id', metavar='<role_id>', help='ID of Role', nargs='?')
def do_user_add_tenant_role(kc, args):
kc.roles.add_user_to_tenant(args.tenant_id, args.user_id, args.role_id)
# TODO(jakedahn): refactor this to allow role, user, and tenant names.
@utils.arg('tenant_id', metavar='<tenant_id>', help='ID of Tenant', nargs='?')
@utils.arg('user_id', metavar='<user_id>', help='ID of User', nargs='?')
@utils.arg('role_id', metavar='<role_id>', help='ID of Role', nargs='?')
def do_user_remove_tenant_role(kc, args):
kc.roles.remove_user_to_tenant(args.tenant_id, args.user_id, args.role_id)
@utils.arg('tenant_id', metavar='<tenant_id>', help='ID of Tenant', nargs='?')
@utils.arg('user_id', metavar='<user_id>', help='ID of User', nargs='?')
def do_ec2_create_credentials(kc, args):
credentials = kc.ec2.create(args.user_id, args.tenant_id)
utils.print_dict(credentials._info)
@utils.arg('user_id', metavar='<user_id>', help='ID of User', nargs='?')
def do_ec2_list_credentials(kc, args):
credentials = kc.ec2.list(args.user_id)
for cred in credentials:
cred.tenant = kc.tenants.get(cred.tenant_id).name
utils.print_list(credentials, ['tenant', 'key', 'secret'])
@utils.arg('user_id', metavar='<user_id>', help='ID of User', nargs='?')
@utils.arg('key', metavar='<access_key>', help='Access Key', nargs='?')
def do_ec2_delete_credentials(kc, args):
try:
kc.ec2.delete(args.user_id, args.key)
print 'Deleted EC2 Credentials.'
except:
print 'Unable to delete EC2 Credentials.'