Check NotFound with pool property in pool member

We use pool property directly when create/update/delete/show pool member.
Which will try to translate and raise value error when it's actually pool
not found. In cases like pool can not be found, we will raise NotFound
exception instead a value error.

Story: #1747836
Task: #16037

Change-Id: Ibc8f5d125436f0f8c9ea5a62d5be4e4f8b3c4401
This commit is contained in:
ricolin 2018-02-07 14:14:27 +08:00
parent 86a1cc8c47
commit 705d2a0b7b
2 changed files with 85 additions and 5 deletions

View File

@ -131,20 +131,28 @@ class PoolMember(octavia_base.OctaviaBase):
def _resource_create(self, properties):
return self.client().member_create(
self.properties[self.POOL], json={'member': properties})['member']
self._get_pool_prop(), json={'member': properties})['member']
def _resource_update(self, prop_diff):
self.client().member_set(self.properties[self.POOL],
self.client().member_set(self._get_pool_prop(),
self.resource_id,
json={'member': prop_diff})
def _get_pool_prop(self):
try:
return self.properties[self.POOL]
except ValueError:
if self.client_plugin().get_pool(self.properties.data[self.POOL]):
raise
def _resource_delete(self):
self.client().member_delete(self.properties[self.POOL],
self.resource_id)
pool = self._get_pool_prop()
if pool:
self.client().member_delete(pool, self.resource_id)
def _show_resource(self):
return self.client().member_show(
self.properties[self.POOL], self.resource_id)
self._get_pool_prop(), self.resource_id)
def resource_mapping():

View File

@ -17,6 +17,7 @@ from neutronclient.neutron import v2_0 as neutronV20
from osc_lib import exceptions
from heat.common import template_format
from heat.engine import properties
from heat.engine.resources.openstack.octavia import pool_member
from heat.tests import common
from heat.tests.openstack.octavia import inline_templates
@ -155,6 +156,48 @@ class PoolMemberTest(common.HeatTestCase):
'1234')
self.assertFalse(self.member._delete_called)
def _prepare_delete_with_value_error(self):
self._create_stack()
self.member.resource_id_set('1234')
self.m_gpv = self.patchobject(properties.Properties,
'_get_property_value',
side_effect=ValueError)
def test_delete_value_error_with_not_found(self):
self._prepare_delete_with_value_error()
m_get_pool = mock.Mock(side_effect=exceptions.NotFound(404))
self.member.client_plugin().get_pool = m_get_pool
self.member.handle_delete()
self.assertTrue(self.member.check_delete_complete(None))
m_get_pool.assert_called_once_with(123)
self.assertFalse(self.member._delete_called)
self.assertEqual(0, self.octavia_client.member_delete.call_count)
self.m_gpv.assert_called_once_with('pool')
def test_delete_value_error_with_pool_found(self):
self._prepare_delete_with_value_error()
self.member.client_plugin().get_pool = mock.Mock(return_value='123')
self.member.handle_delete()
self.assertRaises(ValueError, self.member.check_delete_complete, None)
self.assertFalse(self.member._delete_called)
self.assertEqual(0, self.octavia_client.member_delete.call_count)
self.m_gpv.assert_called_once_with('pool')
def test_delete_value_error_with_pool_error(self):
self._prepare_delete_with_value_error()
self.member.client_plugin().get_pool = mock.Mock(side_effect=KeyError)
self.member.handle_delete()
self.assertRaises(KeyError, self.member.check_delete_complete, None)
self.assertFalse(self.member._delete_called)
self.assertEqual(0, self.octavia_client.member_delete.call_count)
self.m_gpv.assert_called_once_with('pool')
def test_delete_failed(self):
self._create_stack()
self.member.resource_id_set('1234')
@ -165,3 +208,32 @@ class PoolMemberTest(common.HeatTestCase):
self.assertRaises(exceptions.Unauthorized,
self.member.check_delete_complete, None)
def _prepare_get_pool_prop(self):
self._create_stack()
self.member.resource_id_set('1234')
self.m_prop = self.patchobject(
properties.Properties, '_get_property_value')
def test_get_pool_prop(self):
self._prepare_get_pool_prop()
self.member._get_pool_prop()
self.m_prop.assert_called_once_with('pool')
def _get_pool_prop_with_value_error(self, side_effect=[]):
self._prepare_get_pool_prop()
self.m_prop.side_effect = ValueError
self.member.client_plugin().get_pool = mock.Mock(
side_effect=side_effect)
def test_get_pool_prop_value_error_and_raise_exception(self):
self._get_pool_prop_with_value_error(
side_effect=exceptions.NotFound(404))
self.assertRaises(
exceptions.NotFound, self.member._get_pool_prop)
def test_get_pool_prop_value_error_and_raise(self):
self._get_pool_prop_with_value_error(side_effect=['foo'])
self.assertRaises(ValueError, self.member._get_pool_prop)