From 4546ce0012b526cd370533ba5a3f2f4107d249a2 Mon Sep 17 00:00:00 2001 From: Sergey Nikitin Date: Thu, 16 Oct 2014 12:31:13 +0400 Subject: [PATCH] Fixed quotas double decreasing problem When we delete vm with status "soft-delete" we shouldn't change quota values because they were changed during soft-deleting. Closes-bug: #1333145 Change-Id: I3ed7b3245b8908faa02903c74503918f061016bd --- nova/compute/api.py | 8 ++++++++ nova/tests/unit/compute/test_compute_api.py | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index 853866346aee..7cc07ad5da5d 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -1615,6 +1615,14 @@ class API(base.Base): self._record_action_start(context, instance, instance_actions.DELETE) + # NOTE(snikitin): If instance's vm_state is 'soft-delete', + # we should not count reservations here, because instance + # in soft-delete vm_state have already had quotas + # decremented. More details: + # https://bugs.launchpad.net/nova/+bug/1333145 + if instance['vm_state'] == vm_states.SOFT_DELETED: + quotas.rollback() + cb(context, instance, bdms, reservations=quotas.reservations) except exception.ComputeHostNotFound: diff --git a/nova/tests/unit/compute/test_compute_api.py b/nova/tests/unit/compute/test_compute_api.py index 10ac29d3dd09..32cb1060ab27 100644 --- a/nova/tests/unit/compute/test_compute_api.py +++ b/nova/tests/unit/compute/test_compute_api.py @@ -672,10 +672,12 @@ class _ComputeAPIUnitTestMixIn(object): cast = True commit_quotas = True + soft_delete = False if self.cell_type != 'api': if inst.vm_state == vm_states.RESIZED: self._test_delete_resized_part(inst) - + if inst.vm_state == vm_states.SOFT_DELETED: + soft_delete = True self.context.elevated().AndReturn(self.context) db.service_get_by_compute_host( self.context, inst.host).AndReturn( @@ -696,7 +698,7 @@ class _ComputeAPIUnitTestMixIn(object): if self.cell_type != 'api': self.compute_api._record_action_start(self.context, inst, instance_actions.DELETE) - if commit_quotas: + if commit_quotas or soft_delete: cast_reservations = None else: cast_reservations = reservations