Only use client_plugin() if default_client_name is set
Some resource plugins don't use an openstack client (eg. OS::Heat::RandomString), so self.default_client_name is not set. Calling self.client_plugin() when self.default_client_name is not set results in an AssertionError. Change-Id: I05f6c6f9e78858b452ddc4fb7d76c29383f5622f
This commit is contained in:
parent
c32e2ccb90
commit
221c928e9c
|
@ -1481,8 +1481,10 @@ class Resource(object):
|
|||
obj = getattr(self.client(), self.entity)
|
||||
obj.delete(self.resource_id)
|
||||
except Exception as ex:
|
||||
self.client_plugin().ignore_not_found(ex)
|
||||
return None
|
||||
if self.default_client_name is not None:
|
||||
self.client_plugin().ignore_not_found(ex)
|
||||
return None
|
||||
raise
|
||||
return self.resource_id
|
||||
|
||||
@scheduler.wrappertask
|
||||
|
@ -1725,14 +1727,18 @@ class Resource(object):
|
|||
try:
|
||||
return getattr(self, '_{0}_resource'.format(attr))()
|
||||
except Exception as ex:
|
||||
self.client_plugin().ignore_not_found(ex)
|
||||
return None
|
||||
if self.default_client_name is not None:
|
||||
self.client_plugin().ignore_not_found(ex)
|
||||
return None
|
||||
raise
|
||||
else:
|
||||
try:
|
||||
return self._resolve_attribute(attr)
|
||||
except Exception as ex:
|
||||
self.client_plugin().ignore_not_found(ex)
|
||||
return None
|
||||
if self.default_client_name is not None:
|
||||
self.client_plugin().ignore_not_found(ex)
|
||||
return None
|
||||
raise
|
||||
|
||||
def _show_resource(self):
|
||||
"""Default implementation; should be overridden by resources.
|
||||
|
@ -1757,7 +1763,8 @@ class Resource(object):
|
|||
try:
|
||||
resource_data = self._show_resource()
|
||||
except Exception as ex:
|
||||
if self.client_plugin().is_not_found(ex):
|
||||
if (self.default_client_name is not None and
|
||||
self.client_plugin().is_not_found(ex)):
|
||||
raise exception.EntityNotFound(
|
||||
entity='Resource', name=self.name)
|
||||
raise
|
||||
|
|
|
@ -2186,6 +2186,7 @@ class ResourceTest(common.HeatTestCase):
|
|||
|
||||
# set resource_id and recheck with re-written _show_resource
|
||||
res.resource_id = mock.Mock()
|
||||
res.default_client_name = 'foo'
|
||||
|
||||
show_attr.return_value = 'my attr'
|
||||
self.assertEqual('my attr', res.FnGetAtt('show'))
|
||||
|
@ -2204,6 +2205,7 @@ class ResourceTest(common.HeatTestCase):
|
|||
# check path with resolve_attribute
|
||||
stack = self.create_resource_for_attributes_tests()
|
||||
res = stack['res']
|
||||
res.default_client_name = 'foo'
|
||||
|
||||
with mock.patch.object(res, '_resolve_attribute') as res_attr:
|
||||
res_attr.side_effect = ['Works', Exception]
|
||||
|
@ -2216,6 +2218,19 @@ class ResourceTest(common.HeatTestCase):
|
|||
self.assertIsNone(res.FnGetAtt('Foo'))
|
||||
self.assertEqual(1, client_plugin.call_count)
|
||||
|
||||
def test_resolve_attributes_no_default_client_name(self):
|
||||
class MyException(Exception):
|
||||
pass
|
||||
|
||||
stack = self.create_resource_for_attributes_tests()
|
||||
res = stack['res']
|
||||
res.default_client_name = None
|
||||
|
||||
with mock.patch.object(res, '_resolve_attribute') as res_attr:
|
||||
res_attr.side_effect = [MyException]
|
||||
# Make sure this isn't AssertionError
|
||||
self.assertRaises(MyException, res.FnGetAtt, 'Foo')
|
||||
|
||||
def test_show_resource(self):
|
||||
# check default function _show_resource
|
||||
stack = self.create_resource_for_attributes_tests()
|
||||
|
@ -3508,6 +3523,7 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
|||
res.client().entity.delete = delete
|
||||
res.entity = 'entity'
|
||||
res.resource_id = '12345'
|
||||
res.default_client_name = 'foo'
|
||||
|
||||
self.assertIsNone(res.handle_delete())
|
||||
delete.assert_called_once_with('12345')
|
||||
|
@ -3580,6 +3596,30 @@ class ResourceAvailabilityTest(common.HeatTestCase):
|
|||
self.assertIsNone(res.handle_delete())
|
||||
self.assertEqual(0, delete.call_count)
|
||||
|
||||
def test_handle_delete_no_default_client_name(self):
|
||||
class MyException(Exception):
|
||||
pass
|
||||
|
||||
self.stack = parser.Stack(utils.dummy_context(), 'test_stack',
|
||||
template.Template(empty_template))
|
||||
self.stack.store()
|
||||
snippet = rsrc_defn.ResourceDefinition('aresource',
|
||||
'OS::Heat::None')
|
||||
res = resource.Resource('aresource', snippet, self.stack)
|
||||
|
||||
FakeClient = collections.namedtuple('Client',
|
||||
['entity'])
|
||||
client = FakeClient(collections.namedtuple('entity', ['delete']))
|
||||
self.patchobject(resource.Resource, 'client', return_value=client)
|
||||
delete = mock.Mock()
|
||||
delete.side_effect = [MyException]
|
||||
res.client().entity.delete = delete
|
||||
res.entity = 'entity'
|
||||
res.resource_id = '1234'
|
||||
res.default_client_name = None
|
||||
|
||||
self.assertRaises(MyException, res.handle_delete)
|
||||
|
||||
|
||||
class TestLiveStateUpdate(common.HeatTestCase):
|
||||
|
||||
|
@ -3692,6 +3732,7 @@ class TestLiveStateUpdate(common.HeatTestCase):
|
|||
|
||||
def test_get_live_resource_data_not_found(self):
|
||||
res = self._prepare_resource_live_state()
|
||||
res.default_client_name = 'foo'
|
||||
res.resource_id = self.resource_id
|
||||
res._show_resource = mock.MagicMock(
|
||||
side_effect=[exception.NotFound()])
|
||||
|
@ -3703,6 +3744,20 @@ class TestLiveStateUpdate(common.HeatTestCase):
|
|||
six.text_type(ex))
|
||||
self._clean_tests_after_resource_live_state(res)
|
||||
|
||||
def test_get_live_resource_data_not_found_no_default_client_name(self):
|
||||
class MyException(Exception):
|
||||
pass
|
||||
|
||||
res = self._prepare_resource_live_state()
|
||||
res.default_client_name = None
|
||||
res.resource_id = self.resource_id
|
||||
res._show_resource = mock.MagicMock(
|
||||
side_effect=[MyException])
|
||||
res.client_plugin = mock.MagicMock()
|
||||
res.client_plugin().is_not_found = mock.MagicMock(return_value=True)
|
||||
self.assertRaises(MyException, res.get_live_resource_data)
|
||||
self._clean_tests_after_resource_live_state(res)
|
||||
|
||||
def test_get_live_resource_data_other_error(self):
|
||||
res = self._prepare_resource_live_state()
|
||||
res.resource_id = self.resource_id
|
||||
|
|
Loading…
Reference in New Issue