Conditionally check for service extensions
Currently we always check for service extensions, even when the endpoint doesn't exist, which leads to a spurious backtrace in the logs. Change-Id: I0b7b6c1ed4ce39602b3745408e059a0d7a453130 Closes-Bug: #1515215
This commit is contained in:
parent
28b9faac98
commit
3f9e58113b
|
@ -564,12 +564,13 @@ class Resource(object):
|
|||
endpoint_exists = client_plugin.does_endpoint_exist(
|
||||
service_type=service_type,
|
||||
service_name=cls.default_client_name)
|
||||
req_extension = cls.required_service_extension
|
||||
is_ext_available = (
|
||||
not req_extension or client_plugin.has_extension(
|
||||
req_extension))
|
||||
if endpoint_exists and is_ext_available:
|
||||
return True
|
||||
if endpoint_exists:
|
||||
req_extension = cls.required_service_extension
|
||||
is_ext_available = (
|
||||
not req_extension or client_plugin.has_extension(
|
||||
req_extension))
|
||||
if is_ext_available:
|
||||
return True
|
||||
except Exception as ex:
|
||||
LOG.exception(ex)
|
||||
|
||||
|
|
|
@ -235,6 +235,11 @@ class ResourceWithDefaultClientName(resource.Resource):
|
|||
default_client_name = 'sample'
|
||||
|
||||
|
||||
class ResourceWithDefaultClientNameExt(resource.Resource):
|
||||
default_client_name = 'sample'
|
||||
required_service_extension = 'foo'
|
||||
|
||||
|
||||
class ResourceWithFnGetAttType(GenericResource):
|
||||
def FnGetAtt(self, name):
|
||||
pass
|
||||
|
|
|
@ -2955,6 +2955,108 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
|||
.default_client_name)
|
||||
)
|
||||
|
||||
@mock.patch.object(clients.OpenStackClients, 'client_plugin')
|
||||
def test_service_deployed_required_extension_true(
|
||||
self,
|
||||
mock_client_plugin_method):
|
||||
"""Test availability of resource with a required extension. """
|
||||
|
||||
mock_service_types, mock_client_plugin = self._mock_client_plugin(
|
||||
['test_type']
|
||||
)
|
||||
mock_client_plugin.has_extension = mock.Mock(
|
||||
return_value=True)
|
||||
mock_client_plugin_method.return_value = mock_client_plugin
|
||||
|
||||
self.assertTrue(
|
||||
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
||||
context=mock.Mock()))
|
||||
mock_client_plugin_method.assert_called_once_with(
|
||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||
mock_service_types.assert_called_once_with()
|
||||
mock_client_plugin.does_endpoint_exist.assert_called_once_with(
|
||||
service_type='test_type',
|
||||
service_name=(generic_rsrc.ResourceWithDefaultClientName
|
||||
.default_client_name))
|
||||
mock_client_plugin.has_extension.assert_called_once_with('foo')
|
||||
|
||||
@mock.patch.object(clients.OpenStackClients, 'client_plugin')
|
||||
def test_service_deployed_required_extension_false(
|
||||
self,
|
||||
mock_client_plugin_method):
|
||||
"""Test availability of resource with a required extension. """
|
||||
|
||||
mock_service_types, mock_client_plugin = self._mock_client_plugin(
|
||||
['test_type']
|
||||
)
|
||||
mock_client_plugin.has_extension = mock.Mock(
|
||||
return_value=False)
|
||||
mock_client_plugin_method.return_value = mock_client_plugin
|
||||
|
||||
self.assertFalse(
|
||||
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
||||
context=mock.Mock()))
|
||||
mock_client_plugin_method.assert_called_once_with(
|
||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||
mock_service_types.assert_called_once_with()
|
||||
mock_client_plugin.does_endpoint_exist.assert_called_once_with(
|
||||
service_type='test_type',
|
||||
service_name=(generic_rsrc.ResourceWithDefaultClientName
|
||||
.default_client_name))
|
||||
mock_client_plugin.has_extension.assert_called_once_with('foo')
|
||||
|
||||
@mock.patch.object(clients.OpenStackClients, 'client_plugin')
|
||||
def test_service_deployed_required_extension_exception(
|
||||
self,
|
||||
mock_client_plugin_method):
|
||||
"""Test availability of resource with a required extension. """
|
||||
|
||||
mock_service_types, mock_client_plugin = self._mock_client_plugin(
|
||||
['test_type']
|
||||
)
|
||||
mock_client_plugin.has_extension = mock.Mock(
|
||||
side_effect=Exception("error"))
|
||||
mock_client_plugin_method.return_value = mock_client_plugin
|
||||
|
||||
self.assertFalse(
|
||||
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
||||
context=mock.Mock()))
|
||||
mock_client_plugin_method.assert_called_once_with(
|
||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||
mock_service_types.assert_called_once_with()
|
||||
mock_client_plugin.does_endpoint_exist.assert_called_once_with(
|
||||
service_type='test_type',
|
||||
service_name=(generic_rsrc.ResourceWithDefaultClientName
|
||||
.default_client_name))
|
||||
mock_client_plugin.has_extension.assert_called_once_with('foo')
|
||||
|
||||
@mock.patch.object(clients.OpenStackClients, 'client_plugin')
|
||||
def test_service_not_deployed_required_extension(
|
||||
self,
|
||||
mock_client_plugin_method):
|
||||
"""Test availability of resource when the service is not deployed.
|
||||
|
||||
When the service is not deployed, resource is considered as
|
||||
unavailable.
|
||||
"""
|
||||
|
||||
mock_service_types, mock_client_plugin = self._mock_client_plugin(
|
||||
['test_type_un_deployed'],
|
||||
False
|
||||
)
|
||||
mock_client_plugin_method.return_value = mock_client_plugin
|
||||
|
||||
self.assertFalse(
|
||||
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
||||
context=mock.Mock()))
|
||||
mock_client_plugin_method.assert_called_once_with(
|
||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||
mock_service_types.assert_called_once_with()
|
||||
mock_client_plugin.does_endpoint_exist.assert_called_once_with(
|
||||
service_type='test_type_un_deployed',
|
||||
service_name=(generic_rsrc.ResourceWithDefaultClientName
|
||||
.default_client_name))
|
||||
|
||||
def test_service_not_deployed_throws_exception(self):
|
||||
"""Test raising exception when the service is not deployed.
|
||||
|
||||
|
|
Loading…
Reference in New Issue