diff options
-rw-r--r-- | contrib/rackspace/rackspace/tests/test_lb_node.py | 2 | ||||
-rw-r--r-- | heat/engine/environment.py | 2 | ||||
-rw-r--r-- | heat/engine/resource.py | 20 | ||||
-rw-r--r-- | heat/engine/service.py | 2 | ||||
-rw-r--r-- | heat/tests/engine/test_resource_type.py | 14 | ||||
-rw-r--r-- | heat/tests/generic_resource.py | 2 | ||||
-rw-r--r-- | heat/tests/openstack/neutron/test_neutron.py | 2 | ||||
-rw-r--r-- | heat/tests/test_metadata_refresh.py | 1 | ||||
-rw-r--r-- | heat/tests/test_resource.py | 17 | ||||
-rw-r--r-- | heat/tests/test_validate.py | 8 |
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, |