Add API versioning support
* Specific versions supported are managed in XXXXXX.client.py with a mapping from version to client class. This is based on the scheme that is included in novaclient; none of the other client libs have that capability. Change-Id: I930b197f1189e7f52c3b0096e73e0773cf925542
This commit is contained in:
parent
9d224b3bf8
commit
712a8c7f9c
openstackclient
@ -54,9 +54,7 @@ class ClientManager(object):
|
|||||||
tenant_name=None, tenant_id=None,
|
tenant_name=None, tenant_id=None,
|
||||||
username=None, password=None,
|
username=None, password=None,
|
||||||
region_name=None,
|
region_name=None,
|
||||||
identity_api_version=None,
|
api_version=None,
|
||||||
compute_api_version=None,
|
|
||||||
image_api_version=None,
|
|
||||||
):
|
):
|
||||||
self._token = token
|
self._token = token
|
||||||
self._url = url
|
self._url = url
|
||||||
@ -66,9 +64,7 @@ class ClientManager(object):
|
|||||||
self._username = username
|
self._username = username
|
||||||
self._password = password
|
self._password = password
|
||||||
self._region_name = region_name
|
self._region_name = region_name
|
||||||
self._identity_api_version = identity_api_version
|
self._api_version = api_version
|
||||||
self._compute_api_version = compute_api_version
|
|
||||||
self._image_api_version = image_api_version
|
|
||||||
self._service_catalog = None
|
self._service_catalog = None
|
||||||
|
|
||||||
if not self._url:
|
if not self._url:
|
||||||
|
@ -39,6 +39,12 @@ class EndpointNotFound(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class UnsupportedVersion(Exception):
|
||||||
|
"""Indicates that the user is trying to use an unsupported
|
||||||
|
version of the API"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class ClientException(Exception):
|
class ClientException(Exception):
|
||||||
"""
|
"""
|
||||||
The base exception class for all exceptions this library raises.
|
The base exception class for all exceptions this library raises.
|
||||||
|
@ -20,6 +20,7 @@ Common client utilities
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
import prettytable
|
import prettytable
|
||||||
@ -67,3 +68,10 @@ def env(*vars, **kwargs):
|
|||||||
if value:
|
if value:
|
||||||
return value
|
return value
|
||||||
return kwargs.get('default', '')
|
return kwargs.get('default', '')
|
||||||
|
|
||||||
|
|
||||||
|
def import_class(import_str):
|
||||||
|
"""Returns a class from a string including module and class."""
|
||||||
|
mod_str, _sep, class_str = import_str.rpartition('.')
|
||||||
|
__import__(mod_str)
|
||||||
|
return getattr(sys.modules[mod_str], class_str)
|
||||||
|
@ -27,7 +27,7 @@ def make_client(instance):
|
|||||||
"""
|
"""
|
||||||
LOG.debug('instantiating compute client')
|
LOG.debug('instantiating compute client')
|
||||||
client = nova_client.Client(
|
client = nova_client.Client(
|
||||||
version=instance._compute_api_version,
|
version=instance._api_version['compute'],
|
||||||
username=instance._username,
|
username=instance._username,
|
||||||
api_key=instance._password,
|
api_key=instance._password,
|
||||||
project_id=instance._tenant_name,
|
project_id=instance._tenant_name,
|
||||||
|
@ -17,23 +17,42 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from keystoneclient.v2_0 import client as identity_client
|
from openstackclient.common import exceptions as exc
|
||||||
|
from openstackclient.common import utils
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
API_VERSIONS = {
|
||||||
|
'2.0': 'keystoneclient.v2_0.client.Client',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_client_class(version):
|
||||||
|
"""Returns the client class for the requested API version
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
client_path = API_VERSIONS[str(version)]
|
||||||
|
except (KeyError, ValueError):
|
||||||
|
msg = "Invalid client version '%s'. must be one of: %s" % (
|
||||||
|
(version, ', '.join(API_VERSIONS.keys())))
|
||||||
|
raise exc.UnsupportedVersion(msg)
|
||||||
|
|
||||||
|
return utils.import_class(client_path)
|
||||||
|
|
||||||
|
|
||||||
def make_client(instance):
|
def make_client(instance):
|
||||||
"""Returns an identity service client.
|
"""Returns an identity service client.
|
||||||
"""
|
"""
|
||||||
|
identity_client = get_client_class(instance._api_version['identity'])
|
||||||
if instance._url:
|
if instance._url:
|
||||||
LOG.debug('instantiating identity client: token flow')
|
LOG.debug('instantiating identity client: token flow')
|
||||||
client = identity_client.Client(
|
client = identity_client(
|
||||||
endpoint=instance._url,
|
endpoint=instance._url,
|
||||||
token=instance._token,
|
token=instance._token,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
LOG.debug('instantiating identity client: password flow')
|
LOG.debug('instantiating identity client: password flow')
|
||||||
client = identity_client.Client(
|
client = identity_client(
|
||||||
username=instance._username,
|
username=instance._username,
|
||||||
password=instance._password,
|
password=instance._password,
|
||||||
tenant_name=instance._tenant_name,
|
tenant_name=instance._tenant_name,
|
||||||
|
@ -172,9 +172,7 @@ class OpenStackShell(App):
|
|||||||
username=self.options.os_username,
|
username=self.options.os_username,
|
||||||
password=self.options.os_password,
|
password=self.options.os_password,
|
||||||
region_name=self.options.os_region_name,
|
region_name=self.options.os_region_name,
|
||||||
identity_api_version=self.options.os_identity_api_version,
|
api_version=self.api_version,
|
||||||
compute_api_version=self.options.os_compute_api_version,
|
|
||||||
image_api_version=self.options.os_image_api_version,
|
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user