From f2d03bf92db3615693b62f4f3274b867f00c0967 Mon Sep 17 00:00:00 2001 From: falseuser Date: Wed, 12 Apr 2017 03:35:33 +0000 Subject: [PATCH] [BugFix] Release the memory quota for video ram when deleting an instance. When creating an instance, the quota is used to contain vram, and the deletion of the instance does not release the memory quota for vram, if delete intance it need to release the memory quota for vram. Change-Id: Iee2925c585c87d9885fd4bfe38cd9b4d316f5dab Closes-Bug: #1681989 --- nova/compute/api.py | 3 ++- nova/tests/unit/compute/test_compute_api.py | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index 105c7dc394a2..de2c3cad7269 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -2110,7 +2110,8 @@ class API(base.Base): else: flavor = flavor or instance.flavor instance_vcpus = flavor.vcpus - instance_memory_mb = flavor.memory_mb + vram_mb = int(flavor.get('extra_specs', {}).get(VIDEO_RAM, 0)) + instance_memory_mb = flavor.memory_mb + vram_mb quotas = objects.Quotas(context=context) quotas.reserve(project_id=project_id, diff --git a/nova/tests/unit/compute/test_compute_api.py b/nova/tests/unit/compute/test_compute_api.py index e7fc89c1ea9c..839498b59954 100644 --- a/nova/tests/unit/compute/test_compute_api.py +++ b/nova/tests/unit/compute/test_compute_api.py @@ -846,9 +846,11 @@ class _ComputeAPIUnitTestMixIn(object): inst = self._create_instance_obj() inst.update(attrs) inst._context = self.context + vram_mb = int(inst.flavor.get('extra_specs', + {}).get(compute_api.VIDEO_RAM, 0)) deltas = {'instances': -1, 'cores': -inst.flavor.vcpus, - 'ram': -inst.flavor.memory_mb} + 'ram': -(inst.flavor.memory_mb + vram_mb)} delete_time = datetime.datetime(1955, 11, 5, 9, 30, tzinfo=iso8601.iso8601.Utc()) self.useFixture(utils_fixture.TimeFixture(delete_time)) @@ -995,6 +997,12 @@ class _ComputeAPIUnitTestMixIn(object): def test_delete_in_resized(self): self._test_delete('delete', vm_state=vm_states.RESIZED) + def test_delete_with_vram(self): + flavor = objects.Flavor(vcpus=1, memory_mb=512, + extra_specs={compute_api.VIDEO_RAM: "64"}) + self._test_delete('delete', + flavor=flavor) + def test_delete_shelved(self): fake_sys_meta = {'shelved_image_id': SHELVED_IMAGE} self._test_delete('delete',