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:
Steven Hardy 2015-11-11 12:47:05 +00:00
parent 28b9faac98
commit 3f9e58113b
3 changed files with 114 additions and 6 deletions

View File

@ -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)

View File

@ -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

View File

@ -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.