Merge "Remove the dependency on oslo.config"
This commit is contained in:
@@ -14,7 +14,6 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
from oslo.config import cfg
|
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from marconiclient.auth import base
|
from marconiclient.auth import base
|
||||||
@@ -34,18 +33,18 @@ if keystone:
|
|||||||
_BACKENDS['keystone'] = keystone.KeystoneAuth
|
_BACKENDS['keystone'] = keystone.KeystoneAuth
|
||||||
|
|
||||||
|
|
||||||
def _register_opts(conf):
|
def get_backend(backend='noauth', options=None):
|
||||||
"""Registers auth cli options.
|
"""Loads backend `auth_backend`
|
||||||
|
|
||||||
This function exists mostly for testing
|
:params backend: The backend name to load.
|
||||||
purposes.
|
Default: `noauth`
|
||||||
|
:type backend: `six.string_types`
|
||||||
|
:param options: Options to pass to the Auth
|
||||||
|
backend. Refer to the backend for more info.
|
||||||
|
:type options: `dict`
|
||||||
"""
|
"""
|
||||||
backend_opt = cfg.StrOpt('auth_backend', default='noauth',
|
if options is None:
|
||||||
help='Backend plugin to use for authentication')
|
options = {}
|
||||||
conf.register_cli_opt(backend_opt)
|
|
||||||
|
|
||||||
|
backend = _BACKENDS[backend](options)
|
||||||
def get_backend(conf):
|
|
||||||
_register_opts(conf)
|
|
||||||
backend = _BACKENDS[conf.auth_backend](conf)
|
|
||||||
return backend
|
return backend
|
||||||
|
|||||||
@@ -13,55 +13,31 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from oslo.config import cfg
|
|
||||||
|
|
||||||
from keystoneclient.v2_0 import client as ksclient
|
from keystoneclient.v2_0 import client as ksclient
|
||||||
|
|
||||||
from marconiclient.auth import base
|
from marconiclient.auth import base
|
||||||
from marconiclient.common import utils
|
|
||||||
|
|
||||||
|
|
||||||
# NOTE(flaper87): Some of the code below
|
# NOTE(flaper87): Some of the code below
|
||||||
# was brought to you by the very unique
|
# was brought to you by the very unique
|
||||||
# work of ceilometerclient.
|
# work of ceilometerclient.
|
||||||
class KeystoneAuth(base.AuthBackend):
|
class KeystoneAuth(base.AuthBackend):
|
||||||
|
"""Keystone Auth backend
|
||||||
|
|
||||||
_CLI_OPTIONS = [
|
:params conf: A dictionary with Keystone's
|
||||||
cfg.StrOpt("os_username", default=utils.env('OS_USERNAME'),
|
custom parameters:
|
||||||
help='Defaults to env[OS_USERNAME]'),
|
- os_username
|
||||||
|
- os_password
|
||||||
cfg.StrOpt("os_password", default=utils.env('OS_PASSWORD'),
|
- os_project_id
|
||||||
help='Defaults to env[OS_PASSWORD]'),
|
- os_project_name
|
||||||
|
- os_auth_url
|
||||||
cfg.StrOpt("os_project_id", default=utils.env('OS_PROJECT_ID'),
|
- os_auth_token
|
||||||
help='Defaults to env[OS_PROJECT_ID]'),
|
- os_region_name
|
||||||
|
- os_service_type
|
||||||
cfg.StrOpt("os_project_name", default=utils.env('OS_PROJECT_NAME'),
|
- os_service_type
|
||||||
help='Defaults to env[OS_PROJECT_NAME]'),
|
- os_endpoint_type
|
||||||
|
:type conf: `dict`
|
||||||
cfg.StrOpt("os_auth_url", default=utils.env('OS_AUTH_URL'),
|
"""
|
||||||
help='Defaults to env[OS_AUTH_URL]'),
|
|
||||||
|
|
||||||
cfg.StrOpt("os_auth_token", default=utils.env('OS_AUTH_TOKEN'),
|
|
||||||
help='Defaults to env[OS_AUTH_TOKEN]'),
|
|
||||||
|
|
||||||
cfg.StrOpt("os_region_name", default=utils.env('OS_REGION_NAME'),
|
|
||||||
help='Defaults to env[OS_REGION_NAME]'),
|
|
||||||
|
|
||||||
cfg.StrOpt("os_service_type", default=utils.env('OS_SERVICE_TYPE'),
|
|
||||||
help='Defaults to env[OS_SERVICE_TYPE]'),
|
|
||||||
|
|
||||||
cfg.StrOpt("os_service_type", default=utils.env('OS_SERVICE_TYPE'),
|
|
||||||
help='Defaults to env[OS_SERVICE_TYPE]'),
|
|
||||||
|
|
||||||
cfg.StrOpt("os_endpoint_type", default=utils.env('OS_ENDPOINT_TYPE'),
|
|
||||||
help='Defaults to env[OS_ENDPOINT_TYPE]'),
|
|
||||||
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, conf):
|
|
||||||
super(KeystoneAuth, self).__init__(conf)
|
|
||||||
conf.register_cli_opts(self._CLI_OPTIONS)
|
|
||||||
|
|
||||||
def _get_ksclient(self, **kwargs):
|
def _get_ksclient(self, **kwargs):
|
||||||
"""Get an endpoint and auth token from Keystone.
|
"""Get an endpoint and auth token from Keystone.
|
||||||
@@ -73,18 +49,11 @@ class KeystoneAuth(base.AuthBackend):
|
|||||||
* insecure: allow insecure SSL (no cert verification)
|
* insecure: allow insecure SSL (no cert verification)
|
||||||
* project_{name|id}: name or ID of project
|
* project_{name|id}: name or ID of project
|
||||||
"""
|
"""
|
||||||
return ksclient.Client(username=self.conf.os_username,
|
return ksclient.Client(**kwargs)
|
||||||
password=self.conf.os_password,
|
|
||||||
tenant_id=self.conf.os_project_id,
|
|
||||||
tenant_name=self.conf.os_project_name,
|
|
||||||
auth_url=self.conf.os_auth_url,
|
|
||||||
insecure=self.conf.insecure)
|
|
||||||
|
|
||||||
def _get_endpoint(self, client):
|
def _get_endpoint(self, client, **extra):
|
||||||
"""Get an endpoint using the provided keystone client."""
|
"""Get an endpoint using the provided keystone client."""
|
||||||
return client.service_catalog.url_for(
|
return client.service_catalog.url_for(**extra)
|
||||||
service_type=self.conf.service_type or 'queuing',
|
|
||||||
endpoint_type=self.conf.endpoint_type or 'publicURL')
|
|
||||||
|
|
||||||
def authenticate(self, api_version, request):
|
def authenticate(self, api_version, request):
|
||||||
"""Get an authtenticated client, based on the credentials
|
"""Get an authtenticated client, based on the credentials
|
||||||
@@ -95,21 +64,19 @@ class KeystoneAuth(base.AuthBackend):
|
|||||||
the auth information.
|
the auth information.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
token = self.conf.os_auth_token
|
token = self.conf.get('os_auth_token')
|
||||||
if not self.conf.os_auth_token or not request.endpoint:
|
if not token or not request.endpoint:
|
||||||
# NOTE(flaper87): Lets assume all the
|
# NOTE(flaper87): Lets assume all the
|
||||||
# required information was provided
|
# required information was provided
|
||||||
# either through env variables or CLI
|
# either through env variables or CLI
|
||||||
# params. Let keystoneclient fail otherwise.
|
# params. Let keystoneclient fail otherwise.
|
||||||
ks_kwargs = {
|
ks_kwargs = {
|
||||||
'username': self.conf.os_username,
|
'username': self.conf.get('os_username'),
|
||||||
'password': self.conf.os_password,
|
'password': self.conf.get('os_password'),
|
||||||
'tenant_id': self.conf.os_project_id,
|
'tenant_id': self.conf.get('os_project_id'),
|
||||||
'tenant_name': self.conf.os_project_name,
|
'tenant_name': self.conf.get('os_project_name'),
|
||||||
'auth_url': self.conf.os_auth_url,
|
'auth_url': self.conf.get('os_auth_url'),
|
||||||
'service_type': self.conf.os_service_type,
|
'insecure': self.conf.get('insecure'),
|
||||||
'endpoint_type': self.conf.os_endpoint_type,
|
|
||||||
'insecure': self.conf.insecure,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_ksclient = self._get_ksclient(**ks_kwargs)
|
_ksclient = self._get_ksclient(**ks_kwargs)
|
||||||
@@ -118,7 +85,13 @@ class KeystoneAuth(base.AuthBackend):
|
|||||||
token = _ksclient.auth_token
|
token = _ksclient.auth_token
|
||||||
|
|
||||||
if not request.endpoint:
|
if not request.endpoint:
|
||||||
request.endpoint = self._get_endpoint(_ksclient, **ks_kwargs)
|
extra = {
|
||||||
|
'service_type': self.conf.get('os_service_type',
|
||||||
|
'queuing'),
|
||||||
|
'endpoint_type': self.conf.get('os_endpoint_type',
|
||||||
|
'publicURL'),
|
||||||
|
}
|
||||||
|
request.endpoint = self._get_endpoint(_ksclient, **extra)
|
||||||
|
|
||||||
# NOTE(flaper87): Update the request spec
|
# NOTE(flaper87): Update the request spec
|
||||||
# with the final token.
|
# with the final token.
|
||||||
|
|||||||
@@ -15,40 +15,39 @@
|
|||||||
|
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from oslo.config import cfg
|
|
||||||
|
|
||||||
from marconiclient.queues.v1 import queues
|
from marconiclient.queues.v1 import queues
|
||||||
from marconiclient import transport
|
from marconiclient import transport
|
||||||
|
|
||||||
|
|
||||||
_CLIENT_OPTIONS = [
|
|
||||||
cfg.StrOpt('os_queues_url',
|
|
||||||
help='Queues remote URL'),
|
|
||||||
|
|
||||||
cfg.StrOpt('client_uuid',
|
|
||||||
default=uuid.uuid4().hex,
|
|
||||||
help='Client UUID'),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class Client(object):
|
class Client(object):
|
||||||
|
"""Client base class
|
||||||
|
|
||||||
def __init__(self, conf, url=None, version=1):
|
:param url: Marconi's instance base url.
|
||||||
self.conf = conf
|
:type url: `six.text_type`
|
||||||
|
:param version: API Version pointing to.
|
||||||
|
:type version: `int`
|
||||||
|
:param options: Extra options:
|
||||||
|
- client_uuid: Custom client uuid. A new one
|
||||||
|
will be generated, if not passed.
|
||||||
|
- auth_opts: Authentication options:
|
||||||
|
- backend
|
||||||
|
- options
|
||||||
|
:type options: `dict`
|
||||||
|
"""
|
||||||
|
|
||||||
# NOTE(flaper87): This won't actually register
|
def __init__(self, url=None, version=1, conf=None):
|
||||||
# the CLI options until the class is instantiated
|
self.conf = conf or {}
|
||||||
# which is dumb. It'll refactored when the CLI API
|
|
||||||
# work starts.
|
self.api_url = url
|
||||||
self.conf.register_cli_opts(_CLIENT_OPTIONS)
|
|
||||||
self.api_url = self.conf.os_queues_url or url
|
|
||||||
self.api_version = version
|
self.api_version = version
|
||||||
|
self.auth_opts = self.conf.get('auth_opts', {})
|
||||||
self.client_uuid = self.conf.client_uuid
|
self.client_uuid = self.conf.get('client_uuid',
|
||||||
|
uuid.uuid4().hex)
|
||||||
|
|
||||||
def transport(self):
|
def transport(self):
|
||||||
"""Gets a transport based on conf."""
|
"""Gets a transport based the api url and version."""
|
||||||
return transport.get_transport_for_conf(self.conf)
|
return transport.get_transport_for(self.url,
|
||||||
|
self.api_version)
|
||||||
|
|
||||||
def queue(self, ref, **kwargs):
|
def queue(self, ref, **kwargs):
|
||||||
"""Returns a queue instance
|
"""Returns a queue instance
|
||||||
|
|||||||
@@ -43,12 +43,13 @@ class Queue(object):
|
|||||||
:type request: `transport.request.Request`
|
:type request: `transport.request.Request`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
trans = transport.get_transport_for(self.client.conf, request)
|
trans = transport.get_transport_for(request,
|
||||||
|
options=self.client.conf)
|
||||||
return (trans or self.client.transport)
|
return (trans or self.client.transport)
|
||||||
|
|
||||||
def _request_and_transport(self):
|
def _request_and_transport(self):
|
||||||
api = 'queues.v' + str(self.client.api_version)
|
api = 'queues.v' + str(self.client.api_version)
|
||||||
req = request.prepare_request(self.client.conf,
|
req = request.prepare_request(self.client.auth_opts,
|
||||||
endpoint=self.client.api_url,
|
endpoint=self.client.api_url,
|
||||||
api=api)
|
api=api)
|
||||||
|
|
||||||
|
|||||||
@@ -16,15 +16,13 @@
|
|||||||
import fixtures
|
import fixtures
|
||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
from oslo.config import cfg
|
|
||||||
|
|
||||||
|
|
||||||
class TestBase(testtools.TestCase):
|
class TestBase(testtools.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestBase, self).setUp()
|
super(TestBase, self).setUp()
|
||||||
|
|
||||||
self.conf = cfg.ConfigOpts()
|
self.conf = {}
|
||||||
self.useFixture(fixtures.FakeLogger('marconi'))
|
self.useFixture(fixtures.FakeLogger('marconi'))
|
||||||
|
|
||||||
# NOTE(kgriffs): Don't monkey-patch stdout since it breaks
|
# NOTE(kgriffs): Don't monkey-patch stdout since it breaks
|
||||||
@@ -40,9 +38,7 @@ class TestBase(testtools.TestCase):
|
|||||||
|
|
||||||
If a group argument is supplied, the overrides are applied to
|
If a group argument is supplied, the overrides are applied to
|
||||||
the specified configuration option group.
|
the specified configuration option group.
|
||||||
|
|
||||||
All overrides are automatically cleared at the end of the current
|
|
||||||
test by the tearDown() method.
|
|
||||||
"""
|
"""
|
||||||
for k, v in kw.items():
|
parent = (group and self.conf.setdefault(group, {})
|
||||||
self.conf.set_override(k, v, group)
|
or self.conf)
|
||||||
|
parent.update(kw)
|
||||||
|
|||||||
@@ -42,8 +42,8 @@ class QueuesV1QueueTestBase(base.TestBase):
|
|||||||
super(QueuesV1QueueTestBase, self).setUp()
|
super(QueuesV1QueueTestBase, self).setUp()
|
||||||
self.transport = self.transport_cls(self.conf)
|
self.transport = self.transport_cls(self.conf)
|
||||||
|
|
||||||
self.client = client.Client(self.conf, self.url,
|
self.client = client.Client(self.url, self.version,
|
||||||
self.version)
|
self.conf)
|
||||||
|
|
||||||
# NOTE(flaper87): Nasty monkeypatch, lets use
|
# NOTE(flaper87): Nasty monkeypatch, lets use
|
||||||
# the dummy transport here.
|
# the dummy transport here.
|
||||||
|
|||||||
@@ -13,29 +13,21 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from oslo.config import cfg
|
|
||||||
import six
|
import six
|
||||||
from six.moves.urllib import parse
|
from six.moves.urllib import parse
|
||||||
from stevedore import driver
|
from stevedore import driver
|
||||||
|
|
||||||
from marconiclient import errors as _errors
|
from marconiclient import errors as _errors
|
||||||
|
|
||||||
_TRANSPORT_OPTIONS = [
|
|
||||||
cfg.StrOpt('default_transport', default='http',
|
|
||||||
help='Transport to use as default'),
|
|
||||||
cfg.IntOpt('default_transport_version', default=1,
|
|
||||||
help='Transport to use as default'),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
def get_transport(transport='http', version=1, options=None):
|
||||||
def get_transport(conf, transport, version=1):
|
|
||||||
"""Gets a transport and returns it.
|
"""Gets a transport and returns it.
|
||||||
|
|
||||||
:param conf: the user configuration
|
:param transport: Transport name.
|
||||||
:type conf: cfg.ConfigOpts
|
Default: http
|
||||||
:param transport: Transport name
|
|
||||||
:type transport: `six.string_types`
|
:type transport: `six.string_types`
|
||||||
:param version: Version of the target transport.
|
:param version: Version of the target transport.
|
||||||
|
Default: 1
|
||||||
:type version: int
|
:type version: int
|
||||||
|
|
||||||
:returns: A `Transport` instance.
|
:returns: A `Transport` instance.
|
||||||
@@ -49,36 +41,20 @@ def get_transport(conf, transport, version=1):
|
|||||||
mgr = driver.DriverManager(namespace,
|
mgr = driver.DriverManager(namespace,
|
||||||
entry_point,
|
entry_point,
|
||||||
invoke_on_load=True,
|
invoke_on_load=True,
|
||||||
invoke_args=[conf])
|
invoke_args=[options])
|
||||||
except RuntimeError as ex:
|
except RuntimeError as ex:
|
||||||
raise _errors.DriverLoadFailure(entry_point, ex)
|
raise _errors.DriverLoadFailure(entry_point, ex)
|
||||||
|
|
||||||
return mgr.driver
|
return mgr.driver
|
||||||
|
|
||||||
|
|
||||||
def get_transport_for_conf(conf):
|
def get_transport_for(url_or_request, version=1, options=None):
|
||||||
"""Gets a transport based on the config object
|
|
||||||
|
|
||||||
It'll load a transport based on the `default-transport`
|
|
||||||
and `default-transport-version` params.
|
|
||||||
|
|
||||||
:param conf: the user configuration
|
|
||||||
:type conf: cfg.ConfigOpts
|
|
||||||
"""
|
|
||||||
conf.register_opts(_TRANSPORT_OPTIONS)
|
|
||||||
return get_transport(conf, conf.default_transport,
|
|
||||||
conf.default_transport_version)
|
|
||||||
|
|
||||||
|
|
||||||
def get_transport_for(conf, url_or_request, version=1):
|
|
||||||
"""Gets a transport for a given url.
|
"""Gets a transport for a given url.
|
||||||
|
|
||||||
An example transport URL might be::
|
An example transport URL might be::
|
||||||
|
|
||||||
zmq://example.org:8888/v1/
|
zmq://example.org:8888/v1/
|
||||||
|
|
||||||
:param conf: the user configuration
|
|
||||||
:type conf: cfg.ConfigOpts
|
|
||||||
:param url_or_request: a transport URL
|
:param url_or_request: a transport URL
|
||||||
:type url_or_request: `six.string_types` or
|
:type url_or_request: `six.string_types` or
|
||||||
`marconiclient.transport.request.Request`
|
`marconiclient.transport.request.Request`
|
||||||
@@ -94,4 +70,4 @@ def get_transport_for(conf, url_or_request, version=1):
|
|||||||
url = url_or_request.endpoint
|
url = url_or_request.endpoint
|
||||||
|
|
||||||
parsed = parse.urlparse(url)
|
parsed = parse.urlparse(url)
|
||||||
return get_transport(conf, parsed.scheme, version)
|
return get_transport(parsed.scheme, version, options)
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ import six
|
|||||||
@six.add_metaclass(abc.ABCMeta)
|
@six.add_metaclass(abc.ABCMeta)
|
||||||
class Transport(object):
|
class Transport(object):
|
||||||
|
|
||||||
def __init__(self, conf):
|
def __init__(self, options):
|
||||||
self.conf = conf
|
self.options = options
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def send(self, request):
|
def send(self, request):
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ class HttpTransport(base.Transport):
|
|||||||
404: errors.ResourceNotFound,
|
404: errors.ResourceNotFound,
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, conf):
|
def __init__(self, options):
|
||||||
super(HttpTransport, self).__init__(conf)
|
super(HttpTransport, self).__init__(options)
|
||||||
self.client = http.Client()
|
self.client = http.Client()
|
||||||
|
|
||||||
def _prepare(self, request):
|
def _prepare(self, request):
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ from marconiclient import auth
|
|||||||
from marconiclient import errors
|
from marconiclient import errors
|
||||||
|
|
||||||
|
|
||||||
def prepare_request(conf, data=None, **kwargs):
|
def prepare_request(auth_opts=None, data=None, **kwargs):
|
||||||
"""Prepares a request
|
"""Prepares a request
|
||||||
|
|
||||||
This method takes care of authentication
|
This method takes care of authentication
|
||||||
@@ -30,8 +30,8 @@ def prepare_request(conf, data=None, **kwargs):
|
|||||||
The request returned by this call is ready to
|
The request returned by this call is ready to
|
||||||
be sent to the server.
|
be sent to the server.
|
||||||
|
|
||||||
:param conf: `cfg.ConfigOpts` instance to use.
|
:param auth_opts: Auth parameters
|
||||||
:type conf: `cfg.ConfigOpts`
|
:type auth_opts: `dict`
|
||||||
:param data: Optional data to send along with the
|
:param data: Optional data to send along with the
|
||||||
request. If data is not None, it'll be serialized.
|
request. If data is not None, it'll be serialized.
|
||||||
:type data: Any primitive type that is json-serializable.
|
:type data: Any primitive type that is json-serializable.
|
||||||
@@ -42,7 +42,7 @@ def prepare_request(conf, data=None, **kwargs):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
req = Request(**kwargs)
|
req = Request(**kwargs)
|
||||||
auth_backend = auth.get_backend(conf)
|
auth_backend = auth.get_backend(**(auth_opts or {}))
|
||||||
# TODO(flaper87): Do something smarter
|
# TODO(flaper87): Do something smarter
|
||||||
# to get the api_version.
|
# to get the api_version.
|
||||||
req = auth_backend.authenticate(1, req)
|
req = auth_backend.authenticate(1, req)
|
||||||
|
|||||||
@@ -21,16 +21,13 @@ class TestBaseAuth(base.TestBase):
|
|||||||
|
|
||||||
def test_get_backend(self):
|
def test_get_backend(self):
|
||||||
try:
|
try:
|
||||||
auth.get_backend(self.conf)
|
auth.get_backend(options=self.conf)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
self.fail("Test failed")
|
self.fail("Test failed")
|
||||||
|
|
||||||
def test_get_non_existing_backend(self):
|
def test_get_non_existing_backend(self):
|
||||||
auth._register_opts(self.conf)
|
|
||||||
self.config(auth_backend="not_existing")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
auth.get_backend(self.conf)
|
auth.get_backend('not_existing')
|
||||||
self.fail("Test failed")
|
self.fail("Test failed")
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
from oslo.config import cfg
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from keystoneclient.v2_0 import client as ksclient
|
from keystoneclient.v2_0 import client as ksclient
|
||||||
@@ -42,13 +41,8 @@ class TestKeystoneAuth(base.TestBase):
|
|||||||
if not ksclient:
|
if not ksclient:
|
||||||
self.skipTest('Keystone client is not installed')
|
self.skipTest('Keystone client is not installed')
|
||||||
|
|
||||||
auth._register_opts(self.conf)
|
self.auth = auth.get_backend(backend='keystone',
|
||||||
self.config(auth_backend='keystone')
|
options=self.conf)
|
||||||
self.auth = auth.get_backend(self.conf)
|
|
||||||
|
|
||||||
# FIXME(flaper87): Remove once insecure is added
|
|
||||||
# in the right place.
|
|
||||||
self.conf.register_opt(cfg.BoolOpt('insecure', default=False))
|
|
||||||
|
|
||||||
def test_no_token(self):
|
def test_no_token(self):
|
||||||
test_endpoint = 'http://example.org:8888'
|
test_endpoint = 'http://example.org:8888'
|
||||||
|
|||||||
Reference in New Issue
Block a user