Change CLIAuth arg names
Change the argument names used for common Keystone authentication per the updated http://wiki.openstack.org/CLIAuth: --auth_url -> --os_auth_url --password -> --os_password --username -> --os_username --tenant_id -> os_tenant_id --tenant_name -> os_tenant_name --region -> os_region_name All old args are depricated but available for backward compatibility. Fixes bug 954532 Change-Id: I26f8e0cf491549f5836c4079ff86e4823c0ef9a7
This commit is contained in:
35
README.rst
35
README.rst
@@ -41,15 +41,15 @@ Command-line API
|
||||
Installing this package gets you a shell command, ``keystone``, that you
|
||||
can use to interact with Keystone's Identity API.
|
||||
|
||||
You'll need to provide your OpenStack tenant, username and password. You can do this
|
||||
with the ``tenant_name``, ``--username`` and ``--password`` params, but it's
|
||||
easier to just set them as environment variables::
|
||||
You'll need to provide your OpenStack tenant, username and password. You can
|
||||
do this with the ``--os_tenant_name``, ``--os_username`` and ``--os_password``
|
||||
params, but it's easier to just set them as environment variables::
|
||||
|
||||
export OS_TENANT_NAME=project
|
||||
export OS_USERNAME=user
|
||||
export OS_PASSWORD=pass
|
||||
|
||||
You will also need to define the authentication url with ``--auth_url`` and the
|
||||
You will also need to define the authentication url with ``--os_auth_url`` and the
|
||||
version of the API with ``--identity_api_version``. Or set them as an environment
|
||||
variables as well::
|
||||
|
||||
@@ -73,9 +73,10 @@ can specify the one you want with ``--region_name`` (or
|
||||
You'll find complete documentation on the shell by running
|
||||
``keystone help``::
|
||||
|
||||
usage: keystone [--username USERNAME] [--password PASSWORD]
|
||||
[--tenant_name TENANT_NAME] [--tenant_id TENANT_ID]
|
||||
[--auth_url AUTH_URL] [--region_name REGION_NAME]
|
||||
usage: keystone [--os_username OS_USERNAME] [--os_password OS_PASSWORD]
|
||||
[--os_tenant_name OS_TENANT_NAME]
|
||||
[--os_tenant_id OS_TENANT_ID] [--os_auth_url OS_AUTH_URL]
|
||||
[--os_region_name OS_REGION_NAME]
|
||||
[--identity_api_version IDENTITY_API_VERSION] [--token TOKEN]
|
||||
[--endpoint ENDPOINT]
|
||||
<subcommand> ...
|
||||
@@ -89,10 +90,15 @@ You'll find complete documentation on the shell by running
|
||||
Create EC2-compatibile credentials for user per tenant
|
||||
ec2-credentials-delete
|
||||
Delete EC2-compatibile credentials
|
||||
ec2-credentials-get
|
||||
Display EC2-compatibile credentials
|
||||
ec2-credentials-list
|
||||
List EC2-compatibile credentials for a user
|
||||
endpoint-create Create a new endpoint associated with a service
|
||||
endpoint-delete Delete a service endpoint
|
||||
endpoint-get Find endpoint filtered by a specific attribute or
|
||||
service type
|
||||
endpoint-list List configured service endpoints
|
||||
role-create Create new role
|
||||
role-delete Delete role
|
||||
role-get Display role details
|
||||
@@ -121,14 +127,17 @@ You'll find complete documentation on the shell by running
|
||||
subcommands.
|
||||
|
||||
Optional arguments:
|
||||
--username USERNAME Defaults to env[OS_USERNAME]
|
||||
--password PASSWORD Defaults to env[OS_PASSWORD]
|
||||
--tenant_name TENANT_NAME
|
||||
--os_username OS_USERNAME
|
||||
Defaults to env[OS_USERNAME]
|
||||
--os_password OS_PASSWORD
|
||||
Defaults to env[OS_PASSWORD]
|
||||
--os_tenant_name OS_TENANT_NAME
|
||||
Defaults to env[OS_TENANT_NAME]
|
||||
--tenant_id TENANT_ID
|
||||
--os_tenant_id OS_TENANT_ID
|
||||
Defaults to env[OS_TENANT_ID]
|
||||
--auth_url AUTH_URL Defaults to env[OS_AUTH_URL]
|
||||
--region_name REGION_NAME
|
||||
--os_auth_url OS_AUTH_URL
|
||||
Defaults to env[OS_AUTH_URL]
|
||||
--os_region_name OS_REGION_NAME
|
||||
Defaults to env[OS_REGION_NAME]
|
||||
--identity_api_version IDENTITY_API_VERSION
|
||||
Defaults to env[OS_IDENTITY_API_VERSION] or 2.0
|
||||
|
@@ -16,8 +16,8 @@ First, you'll need an OpenStack Keystone account. You get this by using the
|
||||
`keystone-manage` command in OpenStack Keystone.
|
||||
|
||||
You'll need to provide :program:`keystone` with your OpenStack username and
|
||||
password. You can do this with the :option:`--username`, :option:`--password`.
|
||||
You can optionally specify a :option:`--tenant_id` or :option:`--tenant_name`,
|
||||
password. You can do this with the :option:`--os_username`, :option:`--os_password`.
|
||||
You can optionally specify a :option:`--os_tenant_id` or :option:`--os_tenant_name`,
|
||||
to scope your token to a specific tenant. If you don't specify a tenant, you
|
||||
will be scoped to your default tenant if you have one. Instead of using
|
||||
options, it is easier to just set them as environment variables:
|
||||
|
@@ -66,42 +66,64 @@ class OpenStackIdentityShell(object):
|
||||
action='store_true',
|
||||
help=argparse.SUPPRESS)
|
||||
|
||||
parser.add_argument('--username',
|
||||
parser.add_argument('--os_username', metavar='<auth-user-name>',
|
||||
default=env('OS_USERNAME'),
|
||||
help='Defaults to env[OS_USERNAME]')
|
||||
|
||||
parser.add_argument('--password',
|
||||
parser.add_argument('--os_password', metavar='<auth-password>',
|
||||
default=env('OS_PASSWORD'),
|
||||
help='Defaults to env[OS_PASSWORD]')
|
||||
|
||||
parser.add_argument('--tenant_name',
|
||||
parser.add_argument('--os_tenant_name', metavar='<auth-tenant-name>',
|
||||
default=env('OS_TENANT_NAME'),
|
||||
help='Defaults to env[OS_TENANT_NAME]')
|
||||
|
||||
parser.add_argument('--tenant_id',
|
||||
default=env('OS_TENANT_ID'), dest='os_tenant_id',
|
||||
parser.add_argument('--os_tenant_id', metavar='<tenant-id>',
|
||||
default=env('OS_TENANT_ID'),
|
||||
help='Defaults to env[OS_TENANT_ID]')
|
||||
|
||||
parser.add_argument('--auth_url',
|
||||
parser.add_argument('--os_auth_url', metavar='<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', metavar='<region-name>',
|
||||
default=env('OS_REGION_NAME'),
|
||||
help='Defaults to env[OS_REGION_NAME]')
|
||||
|
||||
parser.add_argument('--identity_api_version',
|
||||
parser.add_argument('--os_identity_api_version',
|
||||
metavar='<identity-api-version>',
|
||||
default=env('OS_IDENTITY_API_VERSION', 'KEYSTONE_VERSION'),
|
||||
help='Defaults to env[OS_IDENTITY_API_VERSION] or 2.0')
|
||||
|
||||
parser.add_argument('--token',
|
||||
parser.add_argument('--token', metavar='<service-token>',
|
||||
default=env('SERVICE_TOKEN'),
|
||||
help='Defaults to env[SERVICE_TOKEN]')
|
||||
|
||||
parser.add_argument('--endpoint',
|
||||
parser.add_argument('--endpoint', metavar='<service-endpoint>',
|
||||
default=env('SERVICE_ENDPOINT'),
|
||||
help='Defaults to env[SERVICE_ENDPOINT]')
|
||||
|
||||
# FIXME(dtroyer): The args below are here for diablo compatibility,
|
||||
# remove them in folsum cycle
|
||||
|
||||
parser.add_argument('--username', metavar='<auth-user-name>',
|
||||
help='Deprecated')
|
||||
|
||||
parser.add_argument('--password', metavar='<auth-password>',
|
||||
help='Deprecated')
|
||||
|
||||
parser.add_argument('--tenant_name', metavar='<tenant-name>',
|
||||
help='Deprecated')
|
||||
|
||||
parser.add_argument('--tenant_id', metavar='<tenant-id>',
|
||||
help='Deprecated')
|
||||
|
||||
parser.add_argument('--auth_url', metavar='<auth-url>',
|
||||
help='Deprecated')
|
||||
|
||||
parser.add_argument('--region_name', metavar='<region-name>',
|
||||
help='Deprecated')
|
||||
|
||||
return parser
|
||||
|
||||
def get_subcommand_parser(self, version):
|
||||
@@ -153,7 +175,7 @@ class OpenStackIdentityShell(object):
|
||||
(options, args) = parser.parse_known_args(argv)
|
||||
|
||||
# build available subcommands based on version
|
||||
api_version = options.identity_api_version
|
||||
api_version = options.os_identity_api_version
|
||||
subcommand_parser = self.get_subcommand_parser(api_version)
|
||||
self.parser = subcommand_parser
|
||||
|
||||
@@ -180,36 +202,57 @@ class OpenStackIdentityShell(object):
|
||||
|
||||
if not utils.isunauthenticated(args.func):
|
||||
if not (args.token and args.endpoint):
|
||||
if not args.os_username:
|
||||
if not args.username:
|
||||
raise exc.CommandError("You must provide a username "
|
||||
"via either --username or env[OS_USERNAME]")
|
||||
"via either --os_username or env[OS_USERNAME]")
|
||||
else:
|
||||
args.os_username = args.username
|
||||
|
||||
if not args.os_password:
|
||||
if not args.password:
|
||||
raise exc.CommandError("You must provide a password "
|
||||
"via either --password or env[OS_PASSWORD]")
|
||||
"via either --os_password or env[OS_PASSWORD]")
|
||||
else:
|
||||
args.os_password = args.password
|
||||
|
||||
if not args.os_auth_url:
|
||||
if not args.auth_url:
|
||||
raise exc.CommandError("You must provide an auth url "
|
||||
"via either --auth_url or via env[OS_AUTH_URL]")
|
||||
"via either --os_auth_url or via "
|
||||
"env[OS_AUTH_URL]")
|
||||
else:
|
||||
args.os_auth_url = args.auth_url
|
||||
|
||||
if not args.os_tenant_name and args.tenant_name:
|
||||
args.os_tenant_name = args.tenant_name
|
||||
|
||||
if not args.os_tenant_id and args.tenant_id:
|
||||
args.os_tenant_id = args.tenant_id
|
||||
|
||||
if not args.os_region_name and args.region_name:
|
||||
args.os_region_name = args.region_name
|
||||
|
||||
if utils.isunauthenticated(args.func):
|
||||
self.cs = shell_generic.CLIENT_CLASS(endpoint=args.auth_url)
|
||||
if not args.os_auth_url and args.auth_url:
|
||||
args.os_auth_url = args.auth_url
|
||||
self.cs = shell_generic.CLIENT_CLASS(endpoint=args.os_auth_url)
|
||||
else:
|
||||
token = None
|
||||
endpoint = None
|
||||
if args.token and args.endpoint:
|
||||
token = args.token
|
||||
endpoint = args.endpoint
|
||||
api_version = options.identity_api_version
|
||||
api_version = options.os_identity_api_version
|
||||
self.cs = self.get_api_class(api_version)(
|
||||
username=args.username,
|
||||
tenant_name=args.tenant_name,
|
||||
username=args.os_username,
|
||||
tenant_name=args.os_tenant_name,
|
||||
tenant_id=args.os_tenant_id,
|
||||
token=token,
|
||||
endpoint=endpoint,
|
||||
password=args.password,
|
||||
auth_url=args.auth_url,
|
||||
region_name=args.region_name)
|
||||
password=args.os_password,
|
||||
auth_url=args.os_auth_url,
|
||||
region_name=args.os_region_name)
|
||||
|
||||
try:
|
||||
args.func(self.cs, args)
|
||||
|
@@ -54,17 +54,20 @@ class ShellTest(utils.TestCase):
|
||||
shell('user-list')
|
||||
assert do_tenant_mock.called
|
||||
((a, b), c) = do_tenant_mock.call_args
|
||||
assert (b.auth_url, b.password, b.os_tenant_id,
|
||||
b.tenant_name, b.username, b.identity_api_version) == \
|
||||
assert (b.os_auth_url, b.os_password, b.os_tenant_id,
|
||||
b.os_tenant_name, b.os_username,
|
||||
b.os_identity_api_version) == \
|
||||
(DEFAULT_AUTH_URL, DEFAULT_PASSWORD, DEFAULT_TENANT_ID,
|
||||
DEFAULT_TENANT_NAME, DEFAULT_USERNAME, '')
|
||||
shell('--auth_url http://0.0.0.0:5000/ --password xyzpdq '
|
||||
'--tenant_id 1234 --tenant_name fred --username barney '
|
||||
'--identity_api_version 2.0 user-list')
|
||||
shell('--os_auth_url http://0.0.0.0:5000/ --os_password xyzpdq '
|
||||
'--os_tenant_id 1234 --os_tenant_name fred '
|
||||
'--os_username barney '
|
||||
'--os_identity_api_version 2.0 user-list')
|
||||
assert do_tenant_mock.called
|
||||
((a, b), c) = do_tenant_mock.call_args
|
||||
assert (b.auth_url, b.password, b.os_tenant_id,
|
||||
b.tenant_name, b.username, b.identity_api_version) == \
|
||||
assert (b.os_auth_url, b.os_password, b.os_tenant_id,
|
||||
b.os_tenant_name, b.os_username,
|
||||
b.os_identity_api_version) == \
|
||||
('http://0.0.0.0:5000/', 'xyzpdq', '1234',
|
||||
'fred', 'barney', '2.0')
|
||||
|
||||
@@ -82,23 +85,23 @@ class ShellTest(utils.TestCase):
|
||||
'--pass=secrete --tenant_id=barrr --enabled=true')
|
||||
assert do_uc_mock.called
|
||||
((a, b), c) = do_uc_mock.call_args
|
||||
# restore os_tenant_id when review 4295 is merged
|
||||
assert (b.auth_url, b.password, # b.os_tenant_id,
|
||||
b.tenant_name, b.username, b.identity_api_version) == \
|
||||
(DEFAULT_AUTH_URL, DEFAULT_PASSWORD, # DEFAULT_TENANT_ID,
|
||||
assert (b.os_auth_url, b.os_password, b.os_tenant_id,
|
||||
b.os_tenant_name, b.os_username,
|
||||
b.os_identity_api_version) == \
|
||||
(DEFAULT_AUTH_URL, DEFAULT_PASSWORD, DEFAULT_TENANT_ID,
|
||||
DEFAULT_TENANT_NAME, DEFAULT_USERNAME, '')
|
||||
assert (b.tenant_id, b.name, b.passwd, b.enabled) == \
|
||||
('barrr', 'FOO', 'secrete', 'true')
|
||||
|
||||
# Test case with two --tenant_id args present
|
||||
shell('--tenant_id=os-tenant user-create --name=FOO '
|
||||
# Test case with --os_tenant_id and --tenant_id args present
|
||||
shell('--os_tenant_id=os-tenant user-create --name=FOO '
|
||||
'--pass=secrete --tenant_id=barrr --enabled=true')
|
||||
assert do_uc_mock.called
|
||||
((a, b), c) = do_uc_mock.call_args
|
||||
# restore os_tenant_id when review 4295 is merged
|
||||
assert (b.auth_url, b.password, # b.os_tenant_id,
|
||||
b.tenant_name, b.username, b.identity_api_version) == \
|
||||
(DEFAULT_AUTH_URL, DEFAULT_PASSWORD, # 'os-tenant',
|
||||
assert (b.os_auth_url, b.os_password, b.os_tenant_id,
|
||||
b.os_tenant_name, b.os_username,
|
||||
b.os_identity_api_version) == \
|
||||
(DEFAULT_AUTH_URL, DEFAULT_PASSWORD, 'os-tenant',
|
||||
DEFAULT_TENANT_NAME, DEFAULT_USERNAME, '')
|
||||
assert (b.tenant_id, b.name, b.passwd, b.enabled) == \
|
||||
('barrr', 'FOO', 'secrete', 'true')
|
||||
@@ -136,19 +139,21 @@ class ShellTest(utils.TestCase):
|
||||
'--tenant_id=ec2-tenant --user=ec2-user')
|
||||
assert do_ec2_mock.called
|
||||
((a, b), c) = do_ec2_mock.call_args
|
||||
assert (b.auth_url, b.password, b.os_tenant_id,
|
||||
b.tenant_name, b.username, b.identity_api_version) == \
|
||||
assert (b.os_auth_url, b.os_password, b.os_tenant_id,
|
||||
b.os_tenant_name, b.os_username,
|
||||
b.os_identity_api_version) == \
|
||||
(DEFAULT_AUTH_URL, DEFAULT_PASSWORD, DEFAULT_TENANT_ID,
|
||||
DEFAULT_TENANT_NAME, DEFAULT_USERNAME, '')
|
||||
assert (b.tenant_id, b.user) == ('ec2-tenant', 'ec2-user')
|
||||
|
||||
# Test case with two --tenant_id args present
|
||||
shell('--tenant_id=os-tenant ec2-credentials-create '
|
||||
shell('--os_tenant_id=os-tenant ec2-credentials-create '
|
||||
'--tenant_id=ec2-tenant --user=ec2-user')
|
||||
assert do_ec2_mock.called
|
||||
((a, b), c) = do_ec2_mock.call_args
|
||||
assert (b.auth_url, b.password, b.os_tenant_id,
|
||||
b.tenant_name, b.username, b.identity_api_version) == \
|
||||
assert (b.os_auth_url, b.os_password, b.os_tenant_id,
|
||||
b.os_tenant_name, b.os_username,
|
||||
b.os_identity_api_version) == \
|
||||
(DEFAULT_AUTH_URL, DEFAULT_PASSWORD, 'os-tenant',
|
||||
DEFAULT_TENANT_NAME, DEFAULT_USERNAME, '')
|
||||
assert (b.tenant_id, b.user) == ('ec2-tenant', 'ec2-user')
|
||||
@@ -190,8 +195,9 @@ class ShellTest(utils.TestCase):
|
||||
'--adminurl=http://example.com:9876/adm')
|
||||
assert do_shell_mock.called
|
||||
((a, b), c) = do_shell_mock.call_args
|
||||
assert (b.auth_url, b.password, b.os_tenant_id,
|
||||
b.tenant_name, b.username, b.identity_api_version) == \
|
||||
assert (b.os_auth_url, b.os_password, b.os_tenant_id,
|
||||
b.os_tenant_name, b.os_username,
|
||||
b.os_identity_api_version) == \
|
||||
(DEFAULT_AUTH_URL, DEFAULT_PASSWORD, DEFAULT_TENANT_ID,
|
||||
DEFAULT_TENANT_NAME, DEFAULT_USERNAME, '')
|
||||
assert (b.service_id, b.publicurl, b.adminurl) == ('2',
|
||||
|
Reference in New Issue
Block a user