diff --git a/.coveragerc b/.coveragerc index eaa610a..d669ccf 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,7 +1,7 @@ [run] branch = True source = cinderclient -omit = cinderclient/openstack/*,cinderclient/tests/* +omit = cinderclient/tests/* [report] ignore_errors = True diff --git a/cinderclient/openstack/__init__.py b/cinderclient/apiclient/__init__.py similarity index 100% rename from cinderclient/openstack/__init__.py rename to cinderclient/apiclient/__init__.py diff --git a/cinderclient/openstack/common/apiclient/base.py b/cinderclient/apiclient/base.py similarity index 99% rename from cinderclient/openstack/common/apiclient/base.py rename to cinderclient/apiclient/base.py index 00ecbc7..ef7e258 100644 --- a/cinderclient/openstack/common/apiclient/base.py +++ b/cinderclient/apiclient/base.py @@ -30,7 +30,7 @@ from requests import Response import six from six.moves.urllib import parse -from cinderclient.openstack.common.apiclient import exceptions +from cinderclient.apiclient import exceptions from oslo_utils import strutils diff --git a/cinderclient/openstack/common/apiclient/client.py b/cinderclient/apiclient/client.py similarity index 99% rename from cinderclient/openstack/common/apiclient/client.py rename to cinderclient/apiclient/client.py index 3741df9..e48b784 100644 --- a/cinderclient/openstack/common/apiclient/client.py +++ b/cinderclient/apiclient/client.py @@ -36,7 +36,7 @@ except ImportError: import hashlib import requests -from cinderclient.openstack.common.apiclient import exceptions +from cinderclient.apiclient import exceptions from oslo_utils import encodeutils from oslo_utils import importutils @@ -63,7 +63,7 @@ class HTTPClient(object): into terminal and send the same request with curl. """ - user_agent = "cinderclient.openstack.common.apiclient" + user_agent = "cinderclient.apiclient" def __init__(self, auth_plugin, diff --git a/cinderclient/openstack/common/apiclient/exceptions.py b/cinderclient/apiclient/exceptions.py similarity index 100% rename from cinderclient/openstack/common/apiclient/exceptions.py rename to cinderclient/apiclient/exceptions.py diff --git a/cinderclient/openstack/common/apiclient/fake_client.py b/cinderclient/apiclient/fake_client.py similarity index 99% rename from cinderclient/openstack/common/apiclient/fake_client.py rename to cinderclient/apiclient/fake_client.py index ed04c18..8315c16 100644 --- a/cinderclient/openstack/common/apiclient/fake_client.py +++ b/cinderclient/apiclient/fake_client.py @@ -30,7 +30,7 @@ import requests import six from six.moves.urllib import parse -from cinderclient.openstack.common.apiclient import client +from cinderclient.apiclient import client def assert_has_keys(dct, required=None, optional=None): diff --git a/cinderclient/base.py b/cinderclient/base.py index d30a08e..fd783f0 100644 --- a/cinderclient/base.py +++ b/cinderclient/base.py @@ -26,8 +26,8 @@ import os import six from six.moves.urllib import parse +from cinderclient.apiclient import base as common_base from cinderclient import exceptions -from cinderclient.openstack.common.apiclient import base as common_base from cinderclient import utils diff --git a/cinderclient/extension.py b/cinderclient/extension.py index 1ea062f..a74cb91 100644 --- a/cinderclient/extension.py +++ b/cinderclient/extension.py @@ -13,8 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base from cinderclient import utils diff --git a/cinderclient/openstack/common/__init__.py b/cinderclient/openstack/common/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/cinderclient/openstack/common/apiclient/__init__.py b/cinderclient/openstack/common/apiclient/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/cinderclient/openstack/common/apiclient/auth.py b/cinderclient/openstack/common/apiclient/auth.py deleted file mode 100644 index 1a713b0..0000000 --- a/cinderclient/openstack/common/apiclient/auth.py +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# Copyright 2013 Spanish National Research Council. -# All Rights Reserved. -# -# 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. - -# E0202: An attribute inherited from %s hide this method -# pylint: disable=E0202 - -import abc -import argparse -import os - -import six -from stevedore import extension - -from cinderclient.openstack.common.apiclient import exceptions - - -_discovered_plugins = {} - - -def discover_auth_systems(): - """Discover the available auth-systems. - - This won't take into account the old style auth-systems. - """ - global _discovered_plugins - _discovered_plugins = {} - - def add_plugin(ext): - _discovered_plugins[ext.name] = ext.plugin - - ep_namespace = "cinderclient.openstack.common.apiclient.auth" - mgr = extension.ExtensionManager(ep_namespace) - mgr.map(add_plugin) - - -def load_auth_system_opts(parser): - """Load options needed by the available auth-systems into a parser. - - This function will try to populate the parser with options from the - available plugins. - """ - group = parser.add_argument_group("Common auth options") - BaseAuthPlugin.add_common_opts(group) - for name, auth_plugin in six.iteritems(_discovered_plugins): - group = parser.add_argument_group( - "Auth-system '%s' options" % name, - conflict_handler="resolve") - auth_plugin.add_opts(group) - - -def load_plugin(auth_system): - try: - plugin_class = _discovered_plugins[auth_system] - except KeyError: - raise exceptions.AuthSystemNotFound(auth_system) - return plugin_class(auth_system=auth_system) - - -def load_plugin_from_args(args): - """Load required plugin and populate it with options. - - Try to guess auth system if it is not specified. Systems are tried in - alphabetical order. - - :type args: argparse.Namespace - :raises: AuthorizationFailure - """ - auth_system = args.os_auth_system - if auth_system: - plugin = load_plugin(auth_system) - plugin.parse_opts(args) - plugin.sufficient_options() - return plugin - - for plugin_auth_system in sorted(six.iterkeys(_discovered_plugins)): - plugin_class = _discovered_plugins[plugin_auth_system] - plugin = plugin_class() - plugin.parse_opts(args) - try: - plugin.sufficient_options() - except exceptions.AuthPluginOptionsMissing: - continue - return plugin - raise exceptions.AuthPluginOptionsMissing(["auth_system"]) - - -@six.add_metaclass(abc.ABCMeta) -class BaseAuthPlugin(object): - """Base class for authentication plugins. - - An authentication plugin needs to override at least the authenticate - method to be a valid plugin. - """ - - auth_system = None - opt_names = [] - common_opt_names = [ - "auth_system", - "username", - "password", - "tenant_name", - "token", - "auth_url", - ] - - def __init__(self, auth_system=None, **kwargs): - self.auth_system = auth_system or self.auth_system - self.opts = dict((name, kwargs.get(name)) - for name in self.opt_names) - - @staticmethod - def _parser_add_opt(parser, opt): - """Add an option to parser in two variants. - - :param opt: option name (with underscores) - """ - dashed_opt = opt.replace("_", "-") - env_var = "OS_%s" % opt.upper() - arg_default = os.environ.get(env_var, "") - arg_help = "Defaults to env[%s]." % env_var - parser.add_argument( - "--os-%s" % dashed_opt, - metavar="<%s>" % dashed_opt, - default=arg_default, - help=arg_help) - parser.add_argument( - "--os_%s" % opt, - metavar="<%s>" % dashed_opt, - help=argparse.SUPPRESS) - - @classmethod - def add_opts(cls, parser): - """Populate the parser with the options for this plugin. - """ - for opt in cls.opt_names: - # use `BaseAuthPlugin.common_opt_names` since it is never - # changed in child classes - if opt not in BaseAuthPlugin.common_opt_names: - cls._parser_add_opt(parser, opt) - - @classmethod - def add_common_opts(cls, parser): - """Add options that are common for several plugins. - """ - for opt in cls.common_opt_names: - cls._parser_add_opt(parser, opt) - - @staticmethod - def get_opt(opt_name, args): - """Return option name and value. - - :param opt_name: name of the option, e.g., "username" - :param args: parsed arguments - """ - return (opt_name, getattr(args, "os_%s" % opt_name, None)) - - def parse_opts(self, args): - """Parse the actual auth-system options if any. - - This method is expected to populate the attribute `self.opts` with a - dict containing the options and values needed to make authentication. - """ - self.opts.update(dict(self.get_opt(opt_name, args) - for opt_name in self.opt_names)) - - def authenticate(self, http_client): - """Authenticate using plugin defined method. - - The method usually analyses `self.opts` and performs - a request to authentication server. - - :param http_client: client object that needs authentication - :type http_client: HTTPClient - :raises: AuthorizationFailure - """ - self.sufficient_options() - self._do_authenticate(http_client) - - @abc.abstractmethod - def _do_authenticate(self, http_client): - """Protected method for authentication. - """ - - def sufficient_options(self): - """Check if all required options are present. - - :raises: AuthPluginOptionsMissing - """ - missing = [opt - for opt in self.opt_names - if not self.opts.get(opt)] - if missing: - raise exceptions.AuthPluginOptionsMissing(missing) - - @abc.abstractmethod - def token_and_endpoint(self, endpoint_type, service_type): - """Return token and endpoint. - - :param service_type: Service type of the endpoint - :type service_type: string - :param endpoint_type: Type of endpoint. - Possible values: public or publicURL, - internal or internalURL, - admin or adminURL - :type endpoint_type: string - :returns: tuple of token and endpoint strings - :raises: EndpointException - """ diff --git a/cinderclient/tests/unit/test_base.py b/cinderclient/tests/unit/test_base.py index 587925a..e42c34c 100644 --- a/cinderclient/tests/unit/test_base.py +++ b/cinderclient/tests/unit/test_base.py @@ -14,10 +14,10 @@ from requests import Response from cinderclient import api_versions +from cinderclient.apiclient import base as common_base from cinderclient import base from cinderclient.v3 import client from cinderclient import exceptions -from cinderclient.openstack.common.apiclient import base as common_base from cinderclient.v1 import volumes from cinderclient.tests.unit import utils from cinderclient.tests.unit import test_utils diff --git a/cinderclient/tests/unit/test_utils.py b/cinderclient/tests/unit/test_utils.py index c7f9f06..4262b4a 100644 --- a/cinderclient/tests/unit/test_utils.py +++ b/cinderclient/tests/unit/test_utils.py @@ -18,10 +18,10 @@ import mock from six import moves from cinderclient import api_versions +from cinderclient.apiclient import base as common_base from cinderclient import exceptions from cinderclient import utils from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base from cinderclient.tests.unit import utils as test_utils from cinderclient.tests.unit.v2 import fakes diff --git a/cinderclient/v3/cgsnapshots.py b/cinderclient/v3/cgsnapshots.py index ca568bd..bfead23 100644 --- a/cinderclient/v3/cgsnapshots.py +++ b/cinderclient/v3/cgsnapshots.py @@ -18,8 +18,8 @@ import six from six.moves.urllib.parse import urlencode +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class Cgsnapshot(base.Resource): diff --git a/cinderclient/v3/consistencygroups.py b/cinderclient/v3/consistencygroups.py index 0ed4e50..30f8cfd 100644 --- a/cinderclient/v3/consistencygroups.py +++ b/cinderclient/v3/consistencygroups.py @@ -18,8 +18,8 @@ import six from six.moves.urllib.parse import urlencode +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class Consistencygroup(base.Resource): diff --git a/cinderclient/v3/group_snapshots.py b/cinderclient/v3/group_snapshots.py index 491447a..d205ce9 100644 --- a/cinderclient/v3/group_snapshots.py +++ b/cinderclient/v3/group_snapshots.py @@ -18,8 +18,8 @@ import six from six.moves.urllib.parse import urlencode +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class GroupSnapshot(base.Resource): diff --git a/cinderclient/v3/groups.py b/cinderclient/v3/groups.py index 611851f..7f9ce98 100644 --- a/cinderclient/v3/groups.py +++ b/cinderclient/v3/groups.py @@ -18,8 +18,8 @@ import six from six.moves.urllib.parse import urlencode +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class Group(base.Resource): diff --git a/cinderclient/v3/qos_specs.py b/cinderclient/v3/qos_specs.py index 0fcbae0..9723164 100644 --- a/cinderclient/v3/qos_specs.py +++ b/cinderclient/v3/qos_specs.py @@ -19,8 +19,8 @@ QoS Specs interface. """ +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class QoSSpecs(base.Resource): diff --git a/cinderclient/v3/volume_backups.py b/cinderclient/v3/volume_backups.py index 5698789..49ceb2b 100644 --- a/cinderclient/v3/volume_backups.py +++ b/cinderclient/v3/volume_backups.py @@ -17,8 +17,8 @@ Volume Backups interface (v3 extension). """ from cinderclient import api_versions +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class VolumeBackup(base.Resource): diff --git a/cinderclient/v3/volume_encryption_types.py b/cinderclient/v3/volume_encryption_types.py index 6faf633..a4b39c7 100644 --- a/cinderclient/v3/volume_encryption_types.py +++ b/cinderclient/v3/volume_encryption_types.py @@ -18,8 +18,8 @@ Volume Encryption Type interface """ +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class VolumeEncryptionType(base.Resource): diff --git a/cinderclient/v3/volume_snapshots.py b/cinderclient/v3/volume_snapshots.py index ae117d5..2699abc 100644 --- a/cinderclient/v3/volume_snapshots.py +++ b/cinderclient/v3/volume_snapshots.py @@ -16,8 +16,8 @@ """Volume snapshot interface (v3 extension).""" from cinderclient import api_versions +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class Snapshot(base.Resource): diff --git a/cinderclient/v3/volume_type_access.py b/cinderclient/v3/volume_type_access.py index abdfa86..bdd2e70 100644 --- a/cinderclient/v3/volume_type_access.py +++ b/cinderclient/v3/volume_type_access.py @@ -14,8 +14,8 @@ """Volume type access interface.""" +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class VolumeTypeAccess(base.Resource): diff --git a/cinderclient/v3/volume_types.py b/cinderclient/v3/volume_types.py index e52f6fd..7f26d69 100644 --- a/cinderclient/v3/volume_types.py +++ b/cinderclient/v3/volume_types.py @@ -16,8 +16,8 @@ """Volume Type interface.""" +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class VolumeType(base.Resource): diff --git a/cinderclient/v3/volumes.py b/cinderclient/v3/volumes.py index 6dd0f9c..f8f61d8 100644 --- a/cinderclient/v3/volumes.py +++ b/cinderclient/v3/volumes.py @@ -16,8 +16,8 @@ """Volume interface (v3 extension).""" from cinderclient import api_versions +from cinderclient.apiclient import base as common_base from cinderclient import base -from cinderclient.openstack.common.apiclient import base as common_base class Volume(base.Resource):