From 6e428c4614265e88bb9112fda4ae452cdaf3a6ab Mon Sep 17 00:00:00 2001 From: Joachim Barheine Date: Mon, 6 Jul 2015 16:28:35 +0000 Subject: [PATCH] support users in domains other than Default (KSv3) Closes-Bug: 1471882 Change-Id: I8574fa3d393dc7a2c9d0470cbf7b9e819a3be0cc --- README.rst | 4 ++++ monascaclient/common/http.py | 4 ++++ monascaclient/ksclient.py | 8 ++++++++ monascaclient/shell.py | 16 +++++++++++++++- monascaclient/tests/test_shell.py | 3 ++- 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 1230a5d..7bfddcc 100644 --- a/README.rst +++ b/README.rst @@ -78,10 +78,13 @@ When using Keystone to obtain the token and endpoint:: export OS_USERNAME= export OS_PASSWORD= + export OS_USER_DOMAIN_NAME= export OS_PROJECT_NAME= export OS_AUTH_URL= export OS_REGION_NAME= +When OS_USER_DOMAIN_NAME is not set, then 'Default' is assumed. Alternatively IDs can be used instead of names. + When using Vagrant Environment with middleware disabled:: export OS_AUTH_TOKEN=82510970543135 @@ -97,6 +100,7 @@ You'll find complete documentation on the shell by running [--key-file KEY_FILE] [--os-cacert OS_CACERT] [--timeout TIMEOUT] [--os-username OS_USERNAME] [--os-password OS_PASSWORD] [--os-project-id OS_PROJECT_ID] + [--os-user-domain-id OS_USER_DOMAIN_ID] [--os-user-domain-name OS_USER_DOMAIN_NAME] [--os-project-name OS_PROJECT_NAME] [--os-domain-id OS_DOMAIN_ID] [--os-domain-name OS_DOMAIN_NAME] [--os-auth-url OS_AUTH_URL] [--os-region-name OS_REGION_NAME] diff --git a/monascaclient/common/http.py b/monascaclient/common/http.py index 57752aa..029e625 100644 --- a/monascaclient/common/http.py +++ b/monascaclient/common/http.py @@ -62,6 +62,8 @@ class HTTPClient(object): self.auth_token = kwargs.get('token') self.username = kwargs.get('username') self.password = kwargs.get('password') + self.user_domain_id = kwargs.get('user_domain_id') + self.user_domain_name = kwargs.get('user_domain_name') self.region_name = kwargs.get('region_name') self.include_pass = kwargs.get('include_pass') self.endpoint_url = endpoint @@ -99,6 +101,8 @@ class HTTPClient(object): ks_args = { 'username': self.username, 'password': self.password, + 'user_domain_id': self.user_domain_id, + 'user_domain_name': self.user_domain_name, 'token': '', 'auth_url': self.auth_url, 'service_type': self.service_type, diff --git a/monascaclient/ksclient.py b/monascaclient/ksclient.py index 16229a5..530dbb1 100644 --- a/monascaclient/ksclient.py +++ b/monascaclient/ksclient.py @@ -24,11 +24,14 @@ from monascaclient import exc class KSClient(object): + def __init__(self, **kwargs): """Get an endpoint and auth token from Keystone. :param username: name of user :param password: user's password + :param user_domain_id: unique identifier of domain username resides in (optional) + :param user_domain_name: name of domain for username (optional), if user_domain_id not specified :param project_id: unique identifier of project :param project_name: name of project :param domain_name: name of domain project is in @@ -55,6 +58,11 @@ class KSClient(object): else: kc_args['username'] = kwargs.get('username') kc_args['password'] = kwargs.get('password') + # when username not in the default domain (id='default'), supply user domain (as namespace) + if kwargs.get('user_domain_name'): + kc_args['user_domain_name'] = kwargs.get('user_domain_name') + if kwargs.get('user_domain_id'): + kc_args['user_domain_id'] = kwargs.get('user_domain_id') self._kwargs = kwargs self._keystone = client.Client(**kc_args) diff --git a/monascaclient/shell.py b/monascaclient/shell.py index 095218c..28a0432 100644 --- a/monascaclient/shell.py +++ b/monascaclient/shell.py @@ -118,6 +118,14 @@ class MonascaShell(object): parser.add_argument('--os_password', help=argparse.SUPPRESS) + parser.add_argument('--os-user-domain-id', + default=utils.env('OS_USER_DOMAIN_ID'), + help='Defaults to env[OS_USER_DOMAIN_ID].') + + parser.add_argument('--os-user-domain-name', + default=utils.env('OS_USER_DOMAIN_NAME'), + help='Defaults to env[OS_USER_DOMAIN_NAME].') + parser.add_argument('--os-project-id', default=utils.env('OS_PROJECT_ID'), help='Defaults to env[OS_PROJECT_ID].') @@ -322,6 +330,8 @@ class MonascaShell(object): 'service_type': args.os_service_type, 'endpoint_type': args.os_endpoint_type, 'os_cacert': args.os_cacert, + 'user_domain_id': args.os_user_domain_id, + 'user_domain_name': args.os_user_domain_name, 'project_id': args.os_project_id, 'project_name': args.os_project_name, 'domain_id': args.os_domain_id, @@ -346,7 +356,7 @@ class MonascaShell(object): "--os-project-id or via env[OS_PROJECT_ID], " "or you must provide a project name using " "--os-project-name or via env[OS_PROJECT_NAME] " - "and a domain using --os-domain-name, via " + "and a project domain using --os-domain-name, via " "env[OS_DOMAIN_NAME], using --os-domain-id or " "via env[OS_DOMAIN_ID]") @@ -364,6 +374,10 @@ class MonascaShell(object): 'auth_url': args.os_auth_url } + if args.os_user_domain_name: + kwargs['user_domain_name'] = args.os_user_domain_name + if args.os_user_domain_id: + kwargs['user_domain_id'] = args.os_user_domain_id if args.os_region_name: kwargs['region_name'] = args.os_region_name if args.os_project_name: diff --git a/monascaclient/tests/test_shell.py b/monascaclient/tests/test_shell.py index c953e28..77e4ca4 100644 --- a/monascaclient/tests/test_shell.py +++ b/monascaclient/tests/test_shell.py @@ -31,7 +31,8 @@ from monascaclient.tests import fakes class TestCase(testtools.TestCase): def set_fake_env(self, fake_env): - client_env = ('OS_USERNAME', 'OS_PASSWORD', 'OS_PROJECT_ID', + client_env = ('OS_USERNAME', 'OS_PASSWORD', 'OS_USER_DOMAIN_ID', + 'OS_USER_DOMAIN_NAME', 'OS_PROJECT_ID', 'OS_PROJECT_NAME', 'OS_AUTH_URL', 'OS_REGION_NAME', 'OS_AUTH_TOKEN', 'OS_NO_CLIENT_AUTH', 'OS_SERVICE_TYPE', 'OS_DOMAIN_NAME', 'OS_DOMAIN_ID',