Implementing a minimal, but useful CLI.
Change-Id: I8181cc2395ae1aad6a324ec65395ebc62455f29b
This commit is contained in:
@@ -55,31 +55,31 @@ class OpenStackIdentityShell(object):
|
|||||||
action='store_true',
|
action='store_true',
|
||||||
help=argparse.SUPPRESS)
|
help=argparse.SUPPRESS)
|
||||||
|
|
||||||
parser.add_argument('--username',
|
parser.add_argument('--os-username',
|
||||||
default=env('OS_USERNAME'),
|
default=env('OS_USERNAME'),
|
||||||
help='Defaults to env[OS_USERNAME].')
|
help='Defaults to env[OS_USERNAME].')
|
||||||
|
|
||||||
parser.add_argument('--password',
|
parser.add_argument('--os-password',
|
||||||
default=env('OS_PASSWORD'),
|
default=env('OS_PASSWORD'),
|
||||||
help='Defaults to 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'),
|
default=env('OS_TENANT_NAME'),
|
||||||
help='Defaults to 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'),
|
default=env('OS_TENANT_ID'),
|
||||||
help='Defaults to 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'),
|
default=env('OS_AUTH_URL'),
|
||||||
help='Defaults to 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'),
|
default=env('KEYSTONE_REGION_NAME'),
|
||||||
help='Defaults to env[KEYSTONE_REGION_NAME].')
|
help='Defaults to env[KEYSTONE_REGION_NAME].')
|
||||||
|
|
||||||
parser.add_argument('--version',
|
parser.add_argument('--os-version',
|
||||||
default=env('KEYSTONE_VERSION'),
|
default=env('KEYSTONE_VERSION'),
|
||||||
help='Accepts 1.0 or 1.1, defaults to 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)
|
(options, args) = parser.parse_known_args(argv)
|
||||||
|
|
||||||
# build available subcommands based on version
|
# 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
|
self.parser = subcommand_parser
|
||||||
|
|
||||||
# Parse args again and call whatever callback was selected
|
# 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
|
#FIXME(usrleon): Here should be restrict for project id same as
|
||||||
# for username or apikey but for compatibility it is not.
|
# 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:"
|
raise exc.CommandError("You must provide a username:"
|
||||||
"via --username or env[OS_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"
|
raise exc.CommandError("You must provide a password, either"
|
||||||
"via --password or env[OS_PASSWORD]")
|
"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"
|
raise exc.CommandError("You must provide a auth url, either"
|
||||||
"via --auth_url or via"
|
"via --os-auth_url or via"
|
||||||
"env[OS_AUTH_URL")
|
"env[OS_AUTH_URL]")
|
||||||
|
|
||||||
self.cs = self.get_api_class(options.version)(username=args.username,
|
self.cs = self.get_api_class(options.os_version)(
|
||||||
tenant_name=args.tenant_name,
|
username=args.os_username,
|
||||||
tenant_id=args.tenant_id,
|
tenant_name=args.os_tenant_name,
|
||||||
password=args.password,
|
tenant_id=args.os_tenant_id,
|
||||||
auth_url=args.auth_url,
|
password=args.os_password,
|
||||||
region_name=args.region_name)
|
auth_url=args.os_auth_url,
|
||||||
|
region_name=args.os_region_name)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.cs.authenticate()
|
self.cs.authenticate()
|
||||||
|
235
keystoneclient/v2_0/shell.py
Normal file → Executable file
235
keystoneclient/v2_0/shell.py
Normal file → Executable file
@@ -16,5 +16,240 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from keystoneclient.v2_0 import client
|
from keystoneclient.v2_0 import client
|
||||||
|
from keystoneclient import utils
|
||||||
|
|
||||||
CLIENT_CLASS = client.Client
|
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.'
|
||||||
|
Reference in New Issue
Block a user