diff options
| author | Jamie Lennox <jamielennox@redhat.com> | 2015-05-31 13:37:50 +1000 |
|---|---|---|
| committer | Jamie Lennox <jamielennox@redhat.com> | 2015-05-31 15:03:42 +1000 |
| commit | 3ae247fdceac0e2c7bb6160f9ffefc4ad5d8da29 (patch) | |
| tree | 4799e829cd7034810aba68aefd34f1511259c421 | |
| parent | 211c14c638b9bf393932be42d4f04a4dd12a84bc (diff) | |
| download | python-openstackclient-3ae247fdceac0e2c7bb6160f9ffefc4ad5d8da29.tar.gz | |
Set tenant options on parsed namespace
Because of the way OSC registers all plugins together we end up
with os-tenant-X parameters being saved to the project-X attribute after
parsing. If you are using the v2 plugins directly then they and os-client-config
expect the tenant_X values and will assuming no scoping information if
they are not present.
Validating options for scope will also fail in this situation, not just
because the resultant auth dictionary is missing the tenant-X
attributes, but because OSC validates that either project or domain
scope information is present.
Fix this by just always setting the v2 parameters if the v3 parameters
are present. This will have no effect on the generic or v3 case but fix
the v2 case.
Expand validation to include the tenant options so it knows that v2
plugins are scoped.
Change-Id: I8cab3e423663f801cbf2d83106c671bddc58d7e6
Closes-Bug: #1460369
| -rw-r--r-- | openstackclient/api/auth.py | 4 | ||||
| -rw-r--r-- | openstackclient/common/clientmanager.py | 2 | ||||
| -rw-r--r-- | openstackclient/shell.py | 17 |
3 files changed, 22 insertions, 1 deletions
diff --git a/openstackclient/api/auth.py b/openstackclient/api/auth.py index 9fb26e71..1d50f92c 100644 --- a/openstackclient/api/auth.py +++ b/openstackclient/api/auth.py @@ -149,7 +149,9 @@ def check_valid_auth_options(options, auth_plugin_name): if (not options.auth.get('project_id', None) and not options.auth.get('domain_id', None) and not options.auth.get('domain_name', None) and not - options.auth.get('project_name', None)): + options.auth.get('project_name', None) and not + options.auth.get('tenant_id', None) and not + options.auth.get('tenant_name', None)): msg += _('Set a scope, such as a project or domain, with ' '--os-project-name, OS_PROJECT_NAME or auth.project_name') elif auth_plugin_name.endswith('token'): diff --git a/openstackclient/common/clientmanager.py b/openstackclient/common/clientmanager.py index 85e367c4..6311c71a 100644 --- a/openstackclient/common/clientmanager.py +++ b/openstackclient/common/clientmanager.py @@ -139,6 +139,7 @@ class ClientManager(object): # PROJECT_DOMAIN_ID to 'OS_DEFAULT_DOMAIN' for better usability. if (self._api_version.get('identity') == '3' and not self._auth_params.get('project_domain_id', None) and + not self.auth_plugin_name.startswith('v2') and not self._auth_params.get('project_domain_name', None)): self._auth_params['project_domain_id'] = default_domain @@ -147,6 +148,7 @@ class ClientManager(object): # to 'OS_DEFAULT_DOMAIN' for better usability. if (self._api_version.get('identity') == '3' and self.auth_plugin_name.endswith('password') and + not self.auth_plugin_name.startswith('v2') and not self._auth_params.get('user_domain_id', None) and not self._auth_params.get('user_domain_name', None)): self._auth_params['user_domain_id'] = default_domain diff --git a/openstackclient/shell.py b/openstackclient/shell.py index da985cbc..ab732dad 100644 --- a/openstackclient/shell.py +++ b/openstackclient/shell.py @@ -234,6 +234,23 @@ class OpenStackShell(app.App): cloud_config.set_default('auth_type', 'osc_password') self.log.debug("options: %s", self.options) + project_id = getattr(self.options, 'project_id', None) + project_name = getattr(self.options, 'project_name', None) + tenant_id = getattr(self.options, 'tenant_id', None) + tenant_name = getattr(self.options, 'tenant_name', None) + + # handle some v2/v3 authentication inconsistencies by just acting like + # both the project and tenant information are both present. This can + # go away if we stop registering all the argparse options together. + if project_id and not tenant_id: + self.options.tenant_id = project_id + if project_name and not tenant_name: + self.options.tenant_name = project_name + if tenant_id and not project_id: + self.options.project_id = tenant_id + if tenant_name and not project_name: + self.options.project_name = tenant_name + # Do configuration file handling cc = cloud_config.OpenStackConfig() self.log.debug("defaults: %s", cc.defaults) |
