Protect against missing interface attribute
If deprecated options aren't registered, interface will not exist, resulting in NoSuchOptError. Add safeguards around accessing the interface opt, and appropriate test cases. Co-Authored-By: Eric Fried <efried@us.ibm.com> Closes-Bug: #1707273 Change-Id: Ic3df9817f0038f8f610db70d7e34fe9d458606b6
This commit is contained in:
parent
2c5df20f80
commit
81ec69116a
@ -213,7 +213,7 @@ class Adapter(base.BaseLoader):
|
||||
"""
|
||||
c = conf[group]
|
||||
|
||||
if c.valid_interfaces and c.interface:
|
||||
if c.valid_interfaces and hasattr(c, 'interface') and c.interface:
|
||||
raise TypeError("interface and valid_interfaces are mutually"
|
||||
" exclusive. Please use valid_interfaces.")
|
||||
if c.valid_interfaces:
|
||||
@ -224,7 +224,7 @@ class Adapter(base.BaseLoader):
|
||||
" public, internal or admin".format(
|
||||
iface=iface))
|
||||
kwargs.setdefault('interface', c.valid_interfaces)
|
||||
else:
|
||||
elif hasattr(c, 'interface'):
|
||||
kwargs.setdefault('interface', c.interface)
|
||||
kwargs.setdefault('service_type', c.service_type)
|
||||
kwargs.setdefault('service_name', c.service_name)
|
||||
|
@ -27,7 +27,8 @@ class ConfLoadingTests(utils.TestCase):
|
||||
super(ConfLoadingTests, self).setUp()
|
||||
|
||||
self.conf_fx = self.useFixture(config.Config())
|
||||
loading.register_adapter_conf_options(self.conf_fx.conf, self.GROUP)
|
||||
loading.register_adapter_conf_options(self.conf_fx.conf, self.GROUP,
|
||||
include_deprecated=False)
|
||||
|
||||
def test_load(self):
|
||||
self.conf_fx.config(
|
||||
@ -86,25 +87,6 @@ class ConfLoadingTests(utils.TestCase):
|
||||
self.assertIsNone(adap.min_version)
|
||||
self.assertIsNone(adap.max_version)
|
||||
|
||||
def test_load_old_interface(self):
|
||||
self.conf_fx.config(
|
||||
service_type='type', service_name='name',
|
||||
interface='internal',
|
||||
region_name='region', endpoint_override='endpoint',
|
||||
version='2.0', group=self.GROUP)
|
||||
adap = loading.load_adapter_from_conf_options(
|
||||
self.conf_fx.conf, self.GROUP, session='session', auth='auth')
|
||||
self.assertEqual('type', adap.service_type)
|
||||
self.assertEqual('name', adap.service_name)
|
||||
self.assertEqual('internal', adap.interface)
|
||||
self.assertEqual('region', adap.region_name)
|
||||
self.assertEqual('endpoint', adap.endpoint_override)
|
||||
self.assertEqual('session', adap.session)
|
||||
self.assertEqual('auth', adap.auth)
|
||||
self.assertEqual('2.0', adap.version)
|
||||
self.assertIsNone(adap.min_version)
|
||||
self.assertIsNone(adap.max_version)
|
||||
|
||||
def test_load_bad_valid_interfaces_value(self):
|
||||
self.conf_fx.config(
|
||||
service_type='type', service_name='name',
|
||||
@ -135,18 +117,6 @@ class ConfLoadingTests(utils.TestCase):
|
||||
self.assertEqual('2.0', adap.min_version)
|
||||
self.assertEqual('3.0', adap.max_version)
|
||||
|
||||
def test_interface_conflict(self):
|
||||
self.conf_fx.config(
|
||||
service_type='type', service_name='name', interface='iface',
|
||||
valid_interfaces='internal,public',
|
||||
region_name='region', endpoint_override='endpoint',
|
||||
group=self.GROUP)
|
||||
|
||||
self.assertRaises(
|
||||
TypeError,
|
||||
loading.load_adapter_from_conf_options,
|
||||
self.conf_fx.conf, self.GROUP, session='session', auth='auth')
|
||||
|
||||
def test_load_bad_version(self):
|
||||
self.conf_fx.config(
|
||||
service_type='type', service_name='name',
|
||||
@ -186,6 +156,11 @@ class ConfLoadingTests(utils.TestCase):
|
||||
{opt.name for opt in opts})
|
||||
|
||||
def test_deprecated(self):
|
||||
"""Test external options that are deprecated by Adapter options.
|
||||
|
||||
Not to be confused with ConfLoadingDeprecatedTests, which tests conf
|
||||
options in Adapter which are themselves deprecated.
|
||||
"""
|
||||
def new_deprecated():
|
||||
return cfg.DeprecatedOpt(uuid.uuid4().hex, group=uuid.uuid4().hex)
|
||||
|
||||
@ -196,3 +171,50 @@ class ConfLoadingTests(utils.TestCase):
|
||||
for opt in opts:
|
||||
if opt.name in opt_names:
|
||||
self.assertIn(depr[opt.name][0], opt.deprecated_opts)
|
||||
|
||||
|
||||
class ConfLoadingLegacyTests(ConfLoadingTests):
|
||||
"""Tests with inclusion of deprecated conf options.
|
||||
|
||||
Not to be confused with ConfLoadingTests.test_deprecated, which tests
|
||||
external options that are deprecated in favor of Adapter options.
|
||||
"""
|
||||
|
||||
GROUP = 'adaptergroup'
|
||||
|
||||
def setUp(self):
|
||||
super(ConfLoadingLegacyTests, self).setUp()
|
||||
|
||||
self.conf_fx = self.useFixture(config.Config())
|
||||
loading.register_adapter_conf_options(self.conf_fx.conf, self.GROUP)
|
||||
|
||||
def test_load_old_interface(self):
|
||||
self.conf_fx.config(
|
||||
service_type='type', service_name='name',
|
||||
interface='internal',
|
||||
region_name='region', endpoint_override='endpoint',
|
||||
version='2.0', group=self.GROUP)
|
||||
adap = loading.load_adapter_from_conf_options(
|
||||
self.conf_fx.conf, self.GROUP, session='session', auth='auth')
|
||||
self.assertEqual('type', adap.service_type)
|
||||
self.assertEqual('name', adap.service_name)
|
||||
self.assertEqual('internal', adap.interface)
|
||||
self.assertEqual('region', adap.region_name)
|
||||
self.assertEqual('endpoint', adap.endpoint_override)
|
||||
self.assertEqual('session', adap.session)
|
||||
self.assertEqual('auth', adap.auth)
|
||||
self.assertEqual('2.0', adap.version)
|
||||
self.assertIsNone(adap.min_version)
|
||||
self.assertIsNone(adap.max_version)
|
||||
|
||||
def test_interface_conflict(self):
|
||||
self.conf_fx.config(
|
||||
service_type='type', service_name='name', interface='iface',
|
||||
valid_interfaces='internal,public',
|
||||
region_name='region', endpoint_override='endpoint',
|
||||
group=self.GROUP)
|
||||
|
||||
self.assertRaises(
|
||||
TypeError,
|
||||
loading.load_adapter_from_conf_options,
|
||||
self.conf_fx.conf, self.GROUP, session='session', auth='auth')
|
||||
|
Loading…
Reference in New Issue
Block a user