Merge "Correct message when extension is not available"
This commit is contained in:
commit
a758dff5aa
|
@ -30,7 +30,7 @@ from .test_cloud_loadbalancer import FakeNode # noqa
|
||||||
class LBNode(lb_node.LBNode):
|
class LBNode(lb_node.LBNode):
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_service_available(cls, context):
|
def is_service_available(cls, context):
|
||||||
return True
|
return (True, None)
|
||||||
|
|
||||||
|
|
||||||
class LBNodeTest(common.HeatTestCase):
|
class LBNodeTest(common.HeatTestCase):
|
||||||
|
|
|
@ -599,7 +599,7 @@ class ResourceRegistry(object):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return cls.get_class().is_service_available(cnxt)
|
return cls.get_class().is_service_available(cnxt)[0]
|
||||||
except Exception:
|
except Exception:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,7 @@ class Resource(object):
|
||||||
@classmethod
|
@classmethod
|
||||||
def _validate_service_availability(cls, context, resource_type):
|
def _validate_service_availability(cls, context, resource_type):
|
||||||
try:
|
try:
|
||||||
svc_available = cls.is_service_available(context)
|
(svc_available, reason) = cls.is_service_available(context)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
LOG.exception(_LE("Resource type %s unavailable"),
|
LOG.exception(_LE("Resource type %s unavailable"),
|
||||||
resource_type)
|
resource_type)
|
||||||
|
@ -180,7 +180,7 @@ class Resource(object):
|
||||||
ex = exception.ResourceTypeUnavailable(
|
ex = exception.ResourceTypeUnavailable(
|
||||||
resource_type=resource_type,
|
resource_type=resource_type,
|
||||||
service_name=cls.default_client_name,
|
service_name=cls.default_client_name,
|
||||||
reason='Service endpoint not in service catalog.')
|
reason=reason)
|
||||||
LOG.info(six.text_type(ex))
|
LOG.info(six.text_type(ex))
|
||||||
raise ex
|
raise ex
|
||||||
|
|
||||||
|
@ -646,7 +646,7 @@ class Resource(object):
|
||||||
# resource does not have endpoint, such as RandomString, OS::Heat
|
# resource does not have endpoint, such as RandomString, OS::Heat
|
||||||
# resources as they are implemented within the engine.
|
# resources as they are implemented within the engine.
|
||||||
if cls.default_client_name is None:
|
if cls.default_client_name is None:
|
||||||
return True
|
return (True, None)
|
||||||
client_plugin = clients.Clients(context).client_plugin(
|
client_plugin = clients.Clients(context).client_plugin(
|
||||||
cls.default_client_name)
|
cls.default_client_name)
|
||||||
|
|
||||||
|
@ -656,7 +656,7 @@ class Resource(object):
|
||||||
|
|
||||||
service_types = client_plugin.service_types
|
service_types = client_plugin.service_types
|
||||||
if not service_types:
|
if not service_types:
|
||||||
return True
|
return (True, None)
|
||||||
|
|
||||||
# NOTE(kanagaraj-manickam): if one of the service_type does
|
# NOTE(kanagaraj-manickam): if one of the service_type does
|
||||||
# exist in the keystone, then considered it as available.
|
# exist in the keystone, then considered it as available.
|
||||||
|
@ -670,8 +670,16 @@ class Resource(object):
|
||||||
not req_extension or client_plugin.has_extension(
|
not req_extension or client_plugin.has_extension(
|
||||||
req_extension))
|
req_extension))
|
||||||
if is_ext_available:
|
if is_ext_available:
|
||||||
return True
|
return (True, None)
|
||||||
return False
|
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):
|
def keystone(self):
|
||||||
return self.client('keystone')
|
return self.client('keystone')
|
||||||
|
|
|
@ -1514,7 +1514,7 @@ class EngineService(service.Service):
|
||||||
raise exception.NotSupported(type_name)
|
raise exception.NotSupported(type_name)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
svc_available = resource_class.is_service_available(cnxt)
|
svc_available = resource_class.is_service_available(cnxt)[0]
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise exception.ResourceTypeUnavailable(
|
raise exception.ResourceTypeUnavailable(
|
||||||
service_name=resource_class.default_client_name,
|
service_name=resource_class.default_client_name,
|
||||||
|
|
|
@ -32,7 +32,7 @@ class ResourceTypeTest(common.HeatTestCase):
|
||||||
|
|
||||||
@mock.patch.object(res.Resource, 'is_service_available')
|
@mock.patch.object(res.Resource, 'is_service_available')
|
||||||
def test_list_resource_types(self, mock_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)
|
resources = self.eng.list_resource_types(self.ctx)
|
||||||
self.assertIsInstance(resources, list)
|
self.assertIsInstance(resources, list)
|
||||||
self.assertIn('AWS::EC2::Instance', resources)
|
self.assertIn('AWS::EC2::Instance', resources)
|
||||||
|
@ -41,7 +41,7 @@ class ResourceTypeTest(common.HeatTestCase):
|
||||||
@mock.patch.object(res.Resource, 'is_service_available')
|
@mock.patch.object(res.Resource, 'is_service_available')
|
||||||
def test_list_resource_types_deprecated(self,
|
def test_list_resource_types_deprecated(self,
|
||||||
mock_is_service_available):
|
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")
|
resources = self.eng.list_resource_types(self.ctx, "DEPRECATED")
|
||||||
self.assertEqual(set(['OS::Heat::HARestarter',
|
self.assertEqual(set(['OS::Heat::HARestarter',
|
||||||
'OS::Heat::SoftwareDeployments',
|
'OS::Heat::SoftwareDeployments',
|
||||||
|
@ -55,7 +55,7 @@ class ResourceTypeTest(common.HeatTestCase):
|
||||||
@mock.patch.object(res.Resource, 'is_service_available')
|
@mock.patch.object(res.Resource, 'is_service_available')
|
||||||
def test_list_resource_types_supported(self,
|
def test_list_resource_types_supported(self,
|
||||||
mock_is_service_available):
|
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")
|
resources = self.eng.list_resource_types(self.ctx, "SUPPORTED")
|
||||||
self.assertNotIn(['OS::Neutron::RouterGateway'], resources)
|
self.assertNotIn(['OS::Neutron::RouterGateway'], resources)
|
||||||
self.assertIn('AWS::EC2::Instance', resources)
|
self.assertIn('AWS::EC2::Instance', resources)
|
||||||
|
@ -64,14 +64,15 @@ class ResourceTypeTest(common.HeatTestCase):
|
||||||
def test_list_resource_types_unavailable(
|
def test_list_resource_types_unavailable(
|
||||||
self,
|
self,
|
||||||
mock_is_service_available):
|
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)
|
resources = self.eng.list_resource_types(self.ctx)
|
||||||
# Check for a known resource, not listed
|
# Check for a known resource, not listed
|
||||||
self.assertNotIn('OS::Nova::Server', resources)
|
self.assertNotIn('OS::Nova::Server', resources)
|
||||||
|
|
||||||
@mock.patch.object(res.Resource, 'is_service_available')
|
@mock.patch.object(res.Resource, 'is_service_available')
|
||||||
def test_list_resource_types_with_descr(self, mock_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,
|
resources = self.eng.list_resource_types(self.ctx,
|
||||||
with_description=True)
|
with_description=True)
|
||||||
self.assertIsInstance(resources, list)
|
self.assertIsInstance(resources, list)
|
||||||
|
@ -186,7 +187,8 @@ class ResourceTypeTest(common.HeatTestCase):
|
||||||
with mock.patch.object(
|
with mock.patch.object(
|
||||||
generic_rsrc.ResourceWithDefaultClientName,
|
generic_rsrc.ResourceWithDefaultClientName,
|
||||||
'is_service_available') as mock_is_service_available:
|
'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,
|
ex = self.assertRaises(exception.ResourceTypeUnavailable,
|
||||||
self.eng.resource_schema,
|
self.eng.resource_schema,
|
||||||
self.ctx,
|
self.ctx,
|
||||||
|
|
|
@ -36,7 +36,7 @@ class GenericResource(resource.Resource):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_service_available(cls, context):
|
def is_service_available(cls, context):
|
||||||
return True
|
return (True, None)
|
||||||
|
|
||||||
def handle_create(self):
|
def handle_create(self):
|
||||||
LOG.warning(_LW('Creating generic resource (Type "%s")'),
|
LOG.warning(_LW('Creating generic resource (Type "%s")'),
|
||||||
|
|
|
@ -79,7 +79,7 @@ class NeutronTest(common.HeatTestCase):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_service_available(cls, context):
|
def is_service_available(cls, context):
|
||||||
return True
|
return (True, None)
|
||||||
|
|
||||||
tmpl = rsrc_defn.ResourceDefinition('test_res', 'Foo')
|
tmpl = rsrc_defn.ResourceDefinition('test_res', 'Foo')
|
||||||
stack = mock.MagicMock()
|
stack = mock.MagicMock()
|
||||||
|
|
|
@ -221,6 +221,7 @@ class WaitConditionMetadataUpdateTest(common.HeatTestCase):
|
||||||
mock_check, mock_handle, *args):
|
mock_check, mock_handle, *args):
|
||||||
"""Tests a wait condition metadata update after a signal call."""
|
"""Tests a wait condition metadata update after a signal call."""
|
||||||
|
|
||||||
|
mock_available.return_value = (True, None)
|
||||||
# Setup Stack
|
# Setup Stack
|
||||||
temp = template_format.parse(TEST_TEMPLATE_WAIT_CONDITION)
|
temp = template_format.parse(TEST_TEMPLATE_WAIT_CONDITION)
|
||||||
template = tmpl.Template(temp)
|
template = tmpl.Template(temp)
|
||||||
|
|
|
@ -3158,7 +3158,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
||||||
new_callable=mock.PropertyMock) as mock_client_name:
|
new_callable=mock.PropertyMock) as mock_client_name:
|
||||||
mock_client_name.return_value = None
|
mock_client_name.return_value = None
|
||||||
self.assertTrue((generic_rsrc.ResourceWithDefaultClientName.
|
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')
|
@mock.patch.object(clients.OpenStackClients, 'client_plugin')
|
||||||
def test_default_true_empty_service_types(
|
def test_default_true_empty_service_types(
|
||||||
|
@ -3174,7 +3174,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
||||||
|
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
generic_rsrc.ResourceWithDefaultClientName.is_service_available(
|
generic_rsrc.ResourceWithDefaultClientName.is_service_available(
|
||||||
context=mock.Mock()))
|
context=mock.Mock())[0])
|
||||||
mock_client_plugin_method.assert_called_once_with(
|
mock_client_plugin_method.assert_called_once_with(
|
||||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||||
mock_service_types.assert_called_once_with()
|
mock_service_types.assert_called_once_with()
|
||||||
|
@ -3195,7 +3195,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
||||||
|
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
generic_rsrc.ResourceWithDefaultClientName.is_service_available(
|
generic_rsrc.ResourceWithDefaultClientName.is_service_available(
|
||||||
context=mock.Mock()))
|
context=mock.Mock())[0])
|
||||||
mock_client_plugin_method.assert_called_once_with(
|
mock_client_plugin_method.assert_called_once_with(
|
||||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||||
mock_service_types.assert_called_once_with()
|
mock_service_types.assert_called_once_with()
|
||||||
|
@ -3223,7 +3223,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
||||||
|
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
generic_rsrc.ResourceWithDefaultClientName.is_service_available(
|
generic_rsrc.ResourceWithDefaultClientName.is_service_available(
|
||||||
context=mock.Mock()))
|
context=mock.Mock())[0])
|
||||||
mock_client_plugin_method.assert_called_once_with(
|
mock_client_plugin_method.assert_called_once_with(
|
||||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||||
mock_service_types.assert_called_once_with()
|
mock_service_types.assert_called_once_with()
|
||||||
|
@ -3248,7 +3248,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
||||||
|
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
||||||
context=mock.Mock()))
|
context=mock.Mock())[0])
|
||||||
mock_client_plugin_method.assert_called_once_with(
|
mock_client_plugin_method.assert_called_once_with(
|
||||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||||
mock_service_types.assert_called_once_with()
|
mock_service_types.assert_called_once_with()
|
||||||
|
@ -3273,7 +3273,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
||||||
|
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
||||||
context=mock.Mock()))
|
context=mock.Mock())[0])
|
||||||
mock_client_plugin_method.assert_called_once_with(
|
mock_client_plugin_method.assert_called_once_with(
|
||||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||||
mock_service_types.assert_called_once_with()
|
mock_service_types.assert_called_once_with()
|
||||||
|
@ -3327,7 +3327,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
||||||
|
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
generic_rsrc.ResourceWithDefaultClientNameExt.is_service_available(
|
||||||
context=mock.Mock()))
|
context=mock.Mock())[0])
|
||||||
mock_client_plugin_method.assert_called_once_with(
|
mock_client_plugin_method.assert_called_once_with(
|
||||||
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
generic_rsrc.ResourceWithDefaultClientName.default_client_name)
|
||||||
mock_service_types.assert_called_once_with()
|
mock_service_types.assert_called_once_with()
|
||||||
|
@ -3363,7 +3363,8 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
||||||
with mock.patch.object(
|
with mock.patch.object(
|
||||||
generic_rsrc.ResourceWithDefaultClientName,
|
generic_rsrc.ResourceWithDefaultClientName,
|
||||||
'is_service_available') as mock_method:
|
'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(
|
definition = rsrc_defn.ResourceDefinition(
|
||||||
name='Test Resource',
|
name='Test Resource',
|
||||||
|
|
|
@ -909,7 +909,7 @@ class ValidateTest(common.HeatTestCase):
|
||||||
self.ctx = utils.dummy_context()
|
self.ctx = utils.dummy_context()
|
||||||
self.mock_isa = mock.patch(
|
self.mock_isa = mock.patch(
|
||||||
'heat.engine.resource.Resource.is_service_available',
|
'heat.engine.resource.Resource.is_service_available',
|
||||||
return_value=True)
|
return_value=(True, None))
|
||||||
self.mock_is_service_available = self.mock_isa.start()
|
self.mock_is_service_available = self.mock_isa.start()
|
||||||
self.addCleanup(self.mock_isa.stop)
|
self.addCleanup(self.mock_isa.stop)
|
||||||
self.engine = service.EngineService('a', 't')
|
self.engine = service.EngineService('a', 't')
|
||||||
|
@ -1662,7 +1662,8 @@ class ValidateTest(common.HeatTestCase):
|
||||||
type: AWS::EC2::Instance
|
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,
|
ex = self.assertRaises(dispatcher.ExpectedException,
|
||||||
self.engine.validate_template,
|
self.engine.validate_template,
|
||||||
self.ctx,
|
self.ctx,
|
||||||
|
@ -1679,7 +1680,8 @@ class ValidateTest(common.HeatTestCase):
|
||||||
type: AWS::EC2::Instance
|
type: AWS::EC2::Instance
|
||||||
""")
|
""")
|
||||||
engine = service.EngineService('a', 't')
|
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(
|
res = dict(engine.validate_template(
|
||||||
self.ctx,
|
self.ctx,
|
||||||
|
|
Loading…
Reference in New Issue