Correct message when extension is not available

Now if extension is not available, user gets
message 'Service endpoint not in service catalog'
which is incorrect. Patch corrects this behavior
and adds improved messages with more info.

Change-Id: I9b6c0d2921519590ef105be35e31db29cd1e3ecc
This commit is contained in:
Dmitriy Uvarenkov 2016-06-23 14:38:54 +03:00
parent 56ab930f7b
commit 558a8cd1e8
10 changed files with 42 additions and 28 deletions

View File

@ -30,7 +30,7 @@ from .test_cloud_loadbalancer import FakeNode # noqa
class LBNode(lb_node.LBNode):
@classmethod
def is_service_available(cls, context):
return True
return (True, None)
class LBNodeTest(common.HeatTestCase):

View File

@ -599,7 +599,7 @@ class ResourceRegistry(object):
return True
try:
return cls.get_class().is_service_available(cnxt)
return cls.get_class().is_service_available(cnxt)[0]
except Exception:
return False

View File

@ -166,7 +166,7 @@ class Resource(object):
@classmethod
def _validate_service_availability(cls, context, resource_type):
try:
svc_available = cls.is_service_available(context)
(svc_available, reason) = cls.is_service_available(context)
except Exception as exc:
ex = exception.ResourceTypeUnavailable(
resource_type=resource_type,
@ -179,7 +179,7 @@ class Resource(object):
ex = exception.ResourceTypeUnavailable(
resource_type=resource_type,
service_name=cls.default_client_name,
reason='Service endpoint not in service catalog.')
reason=reason)
LOG.info(six.text_type(ex))
raise ex
@ -645,7 +645,7 @@ class Resource(object):
# resource does not have endpoint, such as RandomString, OS::Heat
# resources as they are implemented within the engine.
if cls.default_client_name is None:
return True
return (True, None)
client_plugin = clients.Clients(context).client_plugin(
cls.default_client_name)
@ -655,7 +655,7 @@ class Resource(object):
service_types = client_plugin.service_types
if not service_types:
return True
return (True, None)
# NOTE(kanagaraj-manickam): if one of the service_type does
# exist in the keystone, then considered it as available.
@ -669,8 +669,16 @@ class Resource(object):
not req_extension or client_plugin.has_extension(
req_extension))
if is_ext_available:
return True
return False
return (True, None)
else:
reason = _('Required extension {0} in {1} service '
'is not available.')
reason = reason.format(req_extension,
cls.default_client_name)
else:
reason = _('{0} {1} endpoint is not in service catalog.')
reason = reason.format(cls.default_client_name, service_type)
return (False, reason)
def keystone(self):
return self.client('keystone')

View File

@ -1514,7 +1514,7 @@ class EngineService(service.Service):
raise exception.NotSupported(type_name)
try:
svc_available = resource_class.is_service_available(cnxt)
svc_available = resource_class.is_service_available(cnxt)[0]
except Exception as exc:
raise exception.ResourceTypeUnavailable(
service_name=resource_class.default_client_name,

View File

@ -32,7 +32,7 @@ class ResourceTypeTest(common.HeatTestCase):
@mock.patch.object(res.Resource, 'is_service_available')
def test_list_resource_types(self, mock_is_service_available):
mock_is_service_available.return_value = True
mock_is_service_available.return_value = (True, None)
resources = self.eng.list_resource_types(self.ctx)
self.assertIsInstance(resources, list)
self.assertIn('AWS::EC2::Instance', resources)
@ -41,7 +41,7 @@ class ResourceTypeTest(common.HeatTestCase):
@mock.patch.object(res.Resource, 'is_service_available')
def test_list_resource_types_deprecated(self,
mock_is_service_available):
mock_is_service_available.return_value = True
mock_is_service_available.return_value = (True, None)
resources = self.eng.list_resource_types(self.ctx, "DEPRECATED")
self.assertEqual(set(['OS::Heat::HARestarter',
'OS::Heat::SoftwareDeployments',
@ -55,7 +55,7 @@ class ResourceTypeTest(common.HeatTestCase):
@mock.patch.object(res.Resource, 'is_service_available')
def test_list_resource_types_supported(self,
mock_is_service_available):
mock_is_service_available.return_value = True
mock_is_service_available.return_value = (True, None)
resources = self.eng.list_resource_types(self.ctx, "SUPPORTED")
self.assertNotIn(['OS::Neutron::RouterGateway'], resources)
self.assertIn('AWS::EC2::Instance', resources)
@ -64,14 +64,15 @@ class ResourceTypeTest(common.HeatTestCase):
def test_list_resource_types_unavailable(
self,
mock_is_service_available):
mock_is_service_available.return_value = False
mock_is_service_available.return_value = (
False, 'Service endpoint not in service catalog.')
resources = self.eng.list_resource_types(self.ctx)
# Check for a known resource, not listed
self.assertNotIn('OS::Nova::Server', resources)
@mock.patch.object(res.Resource, 'is_service_available')
def test_list_resource_types_with_descr(self, mock_is_service_available):
mock_is_service_available.return_value = True
mock_is_service_available.return_value = (True, None)
resources = self.eng.list_resource_types(self.ctx,
with_description=True)
self.assertIsInstance(resources, list)
@ -186,7 +187,8 @@ class ResourceTypeTest(common.HeatTestCase):
with mock.patch.object(
generic_rsrc.ResourceWithDefaultClientName,
'is_service_available') as mock_is_service_available:
mock_is_service_available.return_value = False
mock_is_service_available.return_value = (
False, 'Service endpoint not in service catalog.')
ex = self.assertRaises(exception.ResourceTypeUnavailable,
self.eng.resource_schema,
self.ctx,

View File

@ -36,7 +36,7 @@ class GenericResource(resource.Resource):
@classmethod
def is_service_available(cls, context):
return True
return (True, None)
def handle_create(self):
LOG.warning(_LW('Creating generic resource (Type "%s")'),

View File

@ -79,7 +79,7 @@ class NeutronTest(common.HeatTestCase):
@classmethod
def is_service_available(cls, context):
return True
return (True, None)
tmpl = rsrc_defn.ResourceDefinition('test_res', 'Foo')
stack = mock.MagicMock()

View File

@ -221,6 +221,7 @@ class WaitConditionMetadataUpdateTest(common.HeatTestCase):
mock_check, mock_handle, *args):
"""Tests a wait condition metadata update after a signal call."""
mock_available.return_value = (True, None)
# Setup Stack
temp = template_format.parse(TEST_TEMPLATE_WAIT_CONDITION)
template = tmpl.Template(temp)

View File

@ -3158,7 +3158,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
new_callable=mock.PropertyMock) as mock_client_name:
mock_client_name.return_value = None
self.assertTrue((generic_rsrc.ResourceWithDefaultClientName.
is_service_available(context=mock.Mock())))
is_service_available(context=mock.Mock())[0]))
@mock.patch.object(clients.OpenStackClients, 'client_plugin')
def test_default_true_empty_service_types(
@ -3174,7 +3174,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
self.assertTrue(
generic_rsrc.ResourceWithDefaultClientName.is_service_available(
context=mock.Mock()))
context=mock.Mock())[0])
mock_client_plugin_method.assert_called_once_with(
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
mock_service_types.assert_called_once_with()
@ -3195,7 +3195,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
self.assertTrue(
generic_rsrc.ResourceWithDefaultClientName.is_service_available(
context=mock.Mock()))
context=mock.Mock())[0])
mock_client_plugin_method.assert_called_once_with(
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
mock_service_types.assert_called_once_with()
@ -3223,7 +3223,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
self.assertFalse(
generic_rsrc.ResourceWithDefaultClientName.is_service_available(
context=mock.Mock()))
context=mock.Mock())[0])
mock_client_plugin_method.assert_called_once_with(
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
mock_service_types.assert_called_once_with()
@ -3248,7 +3248,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
self.assertTrue(
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
context=mock.Mock()))
context=mock.Mock())[0])
mock_client_plugin_method.assert_called_once_with(
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
mock_service_types.assert_called_once_with()
@ -3273,7 +3273,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
self.assertFalse(
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
context=mock.Mock()))
context=mock.Mock())[0])
mock_client_plugin_method.assert_called_once_with(
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
mock_service_types.assert_called_once_with()
@ -3327,7 +3327,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
self.assertFalse(
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
context=mock.Mock()))
context=mock.Mock())[0])
mock_client_plugin_method.assert_called_once_with(
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
mock_service_types.assert_called_once_with()
@ -3363,7 +3363,8 @@ class ResourceAvailabilityTest(common.HeatTestCase):
with mock.patch.object(
generic_rsrc.ResourceWithDefaultClientName,
'is_service_available') as mock_method:
mock_method.return_value = False
mock_method.return_value = (
False, 'Service endpoint not in service catalog.')
definition = rsrc_defn.ResourceDefinition(
name='Test Resource',

View File

@ -909,7 +909,7 @@ class ValidateTest(common.HeatTestCase):
self.ctx = utils.dummy_context()
self.mock_isa = mock.patch(
'heat.engine.resource.Resource.is_service_available',
return_value=True)
return_value=(True, None))
self.mock_is_service_available = self.mock_isa.start()
self.addCleanup(self.mock_isa.stop)
self.engine = service.EngineService('a', 't')
@ -1662,7 +1662,8 @@ class ValidateTest(common.HeatTestCase):
type: AWS::EC2::Instance
""")
self.mock_is_service_available.return_value = False
self.mock_is_service_available.return_value = (
False, 'Service endpoint not in service catalog.')
ex = self.assertRaises(dispatcher.ExpectedException,
self.engine.validate_template,
self.ctx,
@ -1679,7 +1680,8 @@ class ValidateTest(common.HeatTestCase):
type: AWS::EC2::Instance
""")
engine = service.EngineService('a', 't')
self.mock_is_service_available.return_value = False
self.mock_is_service_available.return_value = (
False, 'Service endpoint not in service catalog.')
res = dict(engine.validate_template(
self.ctx,