summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/rackspace/rackspace/tests/test_lb_node.py2
-rw-r--r--heat/engine/environment.py2
-rw-r--r--heat/engine/resource.py20
-rw-r--r--heat/engine/service.py2
-rw-r--r--heat/tests/engine/test_resource_type.py14
-rw-r--r--heat/tests/generic_resource.py2
-rw-r--r--heat/tests/openstack/neutron/test_neutron.py2
-rw-r--r--heat/tests/test_metadata_refresh.py1
-rw-r--r--heat/tests/test_resource.py17
-rw-r--r--heat/tests/test_validate.py8
10 files changed, 42 insertions, 28 deletions
diff --git a/contrib/rackspace/rackspace/tests/test_lb_node.py b/contrib/rackspace/rackspace/tests/test_lb_node.py
index e42135576..b7f778a7f 100644
--- a/contrib/rackspace/rackspace/tests/test_lb_node.py
+++ b/contrib/rackspace/rackspace/tests/test_lb_node.py
@@ -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):
diff --git a/heat/engine/environment.py b/heat/engine/environment.py
index 7a29290d8..7fc65b47d 100644
--- a/heat/engine/environment.py
+++ b/heat/engine/environment.py
@@ -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
diff --git a/heat/engine/resource.py b/heat/engine/resource.py
index d679676db..da621b4b8 100644
--- a/heat/engine/resource.py
+++ b/heat/engine/resource.py
@@ -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')
diff --git a/heat/engine/service.py b/heat/engine/service.py
index 2aafc545c..98b015302 100644
--- a/heat/engine/service.py
+++ b/heat/engine/service.py
@@ -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,
diff --git a/heat/tests/engine/test_resource_type.py b/heat/tests/engine/test_resource_type.py
index 3a65cf56b..9bdc0c869 100644
--- a/heat/tests/engine/test_resource_type.py
+++ b/heat/tests/engine/test_resource_type.py
@@ -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,
diff --git a/heat/tests/generic_resource.py b/heat/tests/generic_resource.py
index b4cb44aab..dfb061b11 100644
--- a/heat/tests/generic_resource.py
+++ b/heat/tests/generic_resource.py
@@ -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")'),
diff --git a/heat/tests/openstack/neutron/test_neutron.py b/heat/tests/openstack/neutron/test_neutron.py
index ac9927ded..f018f613e 100644
--- a/heat/tests/openstack/neutron/test_neutron.py
+++ b/heat/tests/openstack/neutron/test_neutron.py
@@ -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()
diff --git a/heat/tests/test_metadata_refresh.py b/heat/tests/test_metadata_refresh.py
index ae8626900..9bea76fd1 100644
--- a/heat/tests/test_metadata_refresh.py
+++ b/heat/tests/test_metadata_refresh.py
@@ -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)
diff --git a/heat/tests/test_resource.py b/heat/tests/test_resource.py
index ca4200302..77ad92928 100644
--- a/heat/tests/test_resource.py
+++ b/heat/tests/test_resource.py
@@ -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',
diff --git a/heat/tests/test_validate.py b/heat/tests/test_validate.py
index 78d4a692b..e4d094b9a 100644
--- a/heat/tests/test_validate.py
+++ b/heat/tests/test_validate.py
@@ -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,