From b2a42f71fe90c10ea2d3571f66e0d37d46f27791 Mon Sep 17 00:00:00 2001 From: Maxime Cottret Date: Thu, 25 Aug 2016 10:11:09 +0200 Subject: [PATCH] Fix CLI auth user interface This patch fixes how auth options are checked in CLI. Use either: - tenant-id or tenant-name - project-id and user-domain (id or name) - project-name and project-domain (id or name) and user-domain (id or name) For consistency, the same checking is used in the client authentication plugin. Change-Id: I2210d8bf21bba5d1faf72dfbe38756078d8bc0c1 Closes-Bug: #1616468 --- cloudkittyclient/client.py | 7 ++++++- cloudkittyclient/shell.py | 29 ++++++++++++++++------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/cloudkittyclient/client.py b/cloudkittyclient/client.py index 01e58be..ad90c60 100644 --- a/cloudkittyclient/client.py +++ b/cloudkittyclient/client.py @@ -208,8 +208,13 @@ class AuthPlugin(auth.BaseAuthPlugin): """ has_token = self.opts.get('token') or self.opts.get('auth_token') no_auth = has_token and self.opts.get('endpoint') + has_project = (self.opts.get('project_id') + or (self.opts.get('project_name') + and (self.opts.get('user_domain_name') + or self.opts.get('user_domain_id')))) has_tenant = self.opts.get('tenant_id') or self.opts.get('tenant_name') - has_credential = (self.opts.get('username') and has_tenant + has_credential = (self.opts.get('username') + and (has_project or has_tenant) and self.opts.get('password') and self.opts.get('auth_url')) missing = not (no_auth or has_credential) diff --git a/cloudkittyclient/shell.py b/cloudkittyclient/shell.py index 1d8e2bd..132ece9 100644 --- a/cloudkittyclient/shell.py +++ b/cloudkittyclient/shell.py @@ -198,12 +198,11 @@ class CloudkittyShell(object): @staticmethod def no_project_and_domain_set(args): - if not (args.os_project_id or (args.os_project_name and - (args.os_user_domain_name or args.os_user_domain_id)) or - (args.os_tenant_id or args.os_tenant_name)): - return True - else: - return False + return not (((args.os_project_id or (args.os_project_name and + (args.os_project_domain_name or + args.os_project_domain_id))) + and (args.os_user_domain_name or args.os_user_domain_id)) + or (args.os_tenant_id or args.os_tenant_name)) def main(self, argv): parsed = self.parse_args(argv) @@ -242,13 +241,17 @@ class CloudkittyShell(object): "env[OS_USER_DOMAIN_NAME] or " "a domain_id via either " "--os-user-domain-id or via " - "env[OS_USER_DOMAIN_ID]") - - if not (self.auth_plugin.opts['tenant_id'] - or self.auth_plugin.opts['tenant_name']): - raise exc.CommandError("You must provide a tenant_id via " - "either --os-tenant-id or via " - "env[OS_TENANT_ID]") + "env[OS_USER_DOMAIN_ID]\n\n" + "As an alternative to project_id, " + "you can provide a project_name via " + "either --os-project-name or via " + "env[OS_PROJECT_NAME] and " + "a project_domain_name via either " + "--os-project-domain-name or via " + "env[OS_PROJECT_DOMAIN_NAME] or " + "a project_domain_id via either " + "--os-project-domain-id or via " + "env[OS_PROJECT_DOMAIN_ID]") if not self.auth_plugin.opts['auth_url']: raise exc.CommandError("You must provide an auth url via "