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:
parent
56ab930f7b
commit
558a8cd1e8
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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")'),
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue