
This patch allows the user to choose which authentication plugin to use with the CLI. The arguments needed by the auth plugins are automatically added to the argument parser. Some examples with the currently available authentication plugins:: OS_USERNAME=admin OS_PROJECT_NAME=admin OS_AUTH_URL=http://keystone:5000/v2.0 \ OS_PASSWORD=admin openstack user list OS_USERNAME=admin OS_PROJECT_DOMAIN_NAME=default OS_USER_DOMAIN_NAME=default \ OS_PROJECT_NAME=admin OS_AUTH_URL=http://keystone:5000/v3 OS_PASSWORD=admin \ OS_IDENTITY_API_VERSION=3 OS_AUTH_PLUGIN=v3password openstack project list OS_TOKEN=1234 OS_URL=http://service_url:35357/v2.0 \ OS_IDENTITY_API_VERSION=2.0 openstack user list The --os-auth-plugin option can be omitted; if so the CLI will attempt to guess which plugin to use from the other options. Change-Id: I330c20ddb8d96b3a4287c68b57c36c4a0f869669 Co-Authored-By: Florent Flament <florent.flament-ext@cloudwatt.com>
93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
# Copyright 2012-2013 OpenStack Foundation
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
|
|
import logging
|
|
|
|
from keystoneclient.v2_0 import client as identity_client_v2_0
|
|
from openstackclient.api import auth
|
|
from openstackclient.common import utils
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
DEFAULT_IDENTITY_API_VERSION = '2.0'
|
|
API_VERSION_OPTION = 'os_identity_api_version'
|
|
API_NAME = 'identity'
|
|
API_VERSIONS = {
|
|
'2.0': 'openstackclient.identity.client.IdentityClientv2_0',
|
|
'3': 'keystoneclient.v3.client.Client',
|
|
}
|
|
|
|
# Translate our API version to auth plugin version prefix
|
|
AUTH_VERSIONS = {
|
|
'2.0': 'v2',
|
|
'3': 'v3',
|
|
}
|
|
|
|
|
|
def make_client(instance):
|
|
"""Returns an identity service client."""
|
|
identity_client = utils.get_client_class(
|
|
API_NAME,
|
|
instance._api_version[API_NAME],
|
|
API_VERSIONS)
|
|
LOG.debug('Instantiating identity client: %s', identity_client)
|
|
|
|
# TODO(dtroyer): Something doesn't like the session.auth when using
|
|
# token auth, chase that down.
|
|
if instance._url:
|
|
LOG.debug('Using service token auth')
|
|
client = identity_client(
|
|
endpoint=instance._url,
|
|
token=instance._auth_params['token'],
|
|
cacert=instance._cacert,
|
|
insecure=instance._insecure
|
|
)
|
|
else:
|
|
LOG.debug('Using auth plugin: %s' % instance._auth_plugin)
|
|
client = identity_client(
|
|
session=instance.session,
|
|
cacert=instance._cacert,
|
|
)
|
|
|
|
# TODO(dtroyer): the identity v2 role commands use this yet, fix that
|
|
# so we can remove it
|
|
if not instance._url:
|
|
instance.auth_ref = instance.auth.get_auth_ref(instance.session)
|
|
return client
|
|
|
|
|
|
def build_option_parser(parser):
|
|
"""Hook to add global options"""
|
|
parser.add_argument(
|
|
'--os-identity-api-version',
|
|
metavar='<identity-api-version>',
|
|
default=utils.env(
|
|
'OS_IDENTITY_API_VERSION',
|
|
default=DEFAULT_IDENTITY_API_VERSION),
|
|
help='Identity API version, default=' +
|
|
DEFAULT_IDENTITY_API_VERSION +
|
|
' (Env: OS_IDENTITY_API_VERSION)')
|
|
return auth.build_auth_plugins_option_parser(parser)
|
|
|
|
|
|
class IdentityClientv2_0(identity_client_v2_0.Client):
|
|
"""Tweak the earlier client class to deal with some changes"""
|
|
def __getattr__(self, name):
|
|
# Map v3 'projects' back to v2 'tenants'
|
|
if name == "projects":
|
|
return self.tenants
|
|
else:
|
|
raise AttributeError(name)
|