Check before _update_stack

If some parameters in bay_update are invalid, we should not update
the stack.

Change-Id: Idd32a07a5b319830710b6ada8284a053d4a65f4f
Closes-Bug: #1484048
This commit is contained in:
Hua Wang
2015-08-06 23:26:24 +08:00
parent fb168ffb47
commit d507069fda
2 changed files with 37 additions and 9 deletions

View File

@@ -116,6 +116,9 @@ def _update_stack_outputs(context, stack, bay):
class Handler(object):
_update_allowed_properties = set(['node_count'])
def __init__(self):
super(Handler, self).__init__()
@@ -141,6 +144,13 @@ class Handler(object):
return bay
def _validate_properties(self, delta):
update_disallowed_properties = delta - self._update_allowed_properties
if update_disallowed_properties:
err = (_("cannot change bay property(ies) %s.") %
", ".join(update_disallowed_properties))
raise exception.InvalidParameterValue(err=err)
def bay_update(self, context, bay):
LOG.debug('bay_heat bay_update')
@@ -152,17 +162,16 @@ class Handler(object):
'"%s"') % stack.stack_status
raise exception.NotSupported(operation=operation)
delta = set(bay.obj_what_changed())
if 'node_count' in delta:
delta.remove('node_count')
manager = scale_manager.ScaleManager(context, osc, bay)
delta = bay.obj_what_changed()
if not delta:
return bay
_update_stack(context, osc, bay, manager)
self._poll_and_check(osc, bay)
self._validate_properties(delta)
if delta:
raise exception.InvalidParameterValue(err=(
"cannot change bay property(ies) %s." % ", ".join(delta)))
manager = scale_manager.ScaleManager(context, osc, bay)
_update_stack(context, osc, bay, manager)
self._poll_and_check(osc, bay)
return bay

View File

@@ -733,6 +733,25 @@ class TestHandler(db_base.DbTestCase):
bay = objects.Bay.get(self.context, self.bay.uuid)
self.assertEqual(bay.node_count, 1)
@patch('magnum.common.clients.OpenStackClients')
def test_update_bay_with_invalid_params(
self, mock_openstack_client_class):
mock_heat_stack = mock.MagicMock()
mock_heat_stack.stack_status = bay_status.CREATE_COMPLETE
mock_heat_client = mock.MagicMock()
mock_heat_client.stacks.get.return_value = mock_heat_stack
mock_openstack_client = mock_openstack_client_class.return_value
mock_openstack_client.heat.return_value = mock_heat_client
self.bay.node_count = 2
self.bay.api_address = '7.7.7.7'
self.assertRaises(exception.InvalidParameterValue,
self.handler.bay_update,
self.context,
self.bay)
bay = objects.Bay.get(self.context, self.bay.uuid)
self.assertEqual(bay.node_count, 1)
@patch('magnum.conductor.handlers.bay_conductor._create_stack')
@patch('magnum.common.clients.OpenStackClients')
def test_create(self, mock_openstack_client_class, mock_create_stack):