Merge ~ack/maas:1947087-vm-host-api-fix-used-counts into maas:master

Proposed by Alberto Donato
Status: Merged
Approved by: Alberto Donato
Approved revision: aaed0938fbdbc635d3c1ff4791cb57b672ff7fd4
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ack/maas:1947087-vm-host-api-fix-used-counts
Merge into: maas:master
Diff against target: 63 lines (+41/-2)
2 files modified
src/maasserver/models/tests/test_virtualmachine.py (+33/-0)
src/maasserver/models/virtualmachine.py (+8/-2)
Reviewer Review Type Date Requested Status
Christian Grabowski Approve
MAAS Lander Approve
Review via email: mp+410668@code.launchpad.net

Commit message

LP:1947087 fix query to get used vmhost resources for the API

The previous aggregation was counting memory and cores multiple times if VMs
had more than one disk because of the join with the VirtualMachineDisk table.

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b 1947087-vm-host-api-fix-used-counts lp:~ack/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: aaed0938fbdbc635d3c1ff4791cb57b672ff7fd4

review: Approve
Revision history for this message
Christian Grabowski (cgrabowski) wrote :

+1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/models/tests/test_virtualmachine.py b/src/maasserver/models/tests/test_virtualmachine.py
2index 02f3c75..d6654aa 100644
3--- a/src/maasserver/models/tests/test_virtualmachine.py
4+++ b/src/maasserver/models/tests/test_virtualmachine.py
5@@ -807,3 +807,36 @@ class TestGetVMHostUsedResources(MAASServerTestCase):
6 self.assertEqual(used_resources.memory, 0)
7 self.assertEqual(used_resources.hugepages_memory, 0)
8 self.assertEqual(used_resources.storage, 0)
9+
10+ def test_get_used_resources_multiple_disks(self):
11+ project = factory.make_string()
12+ vmhost = factory.make_Pod(
13+ pod_type="lxd",
14+ parameters={"project": project},
15+ )
16+ pool1 = factory.make_PodStoragePool(pod=vmhost)
17+ pool2 = factory.make_PodStoragePool(pod=vmhost)
18+ vm1 = factory.make_VirtualMachine(
19+ bmc=vmhost,
20+ project=project,
21+ memory=1024,
22+ pinned_cores=[0, 1, 2],
23+ hugepages_backed=False,
24+ )
25+ factory.make_VirtualMachineDisk(vm=vm1, backing_pool=pool1, size=1000)
26+ factory.make_VirtualMachineDisk(vm=vm1, backing_pool=pool2, size=2000)
27+ vm2 = factory.make_VirtualMachine(
28+ bmc=vmhost,
29+ project=project,
30+ memory=2048,
31+ unpinned_cores=2,
32+ hugepages_backed=True,
33+ )
34+ factory.make_VirtualMachineDisk(vm=vm2, backing_pool=pool1, size=1000)
35+ factory.make_VirtualMachineDisk(vm=vm2, backing_pool=pool2, size=4000)
36+ used_resources = get_vm_host_used_resources(vmhost)
37+ self.assertEqual(used_resources.cores, 5)
38+ self.assertEqual(used_resources.memory, 1024)
39+ self.assertEqual(used_resources.hugepages_memory, 2048)
40+ self.assertEqual(used_resources.total_memory, 3072)
41+ self.assertEqual(used_resources.storage, 8000)
42diff --git a/src/maasserver/models/virtualmachine.py b/src/maasserver/models/virtualmachine.py
43index 07a2462..49082cc 100644
44--- a/src/maasserver/models/virtualmachine.py
45+++ b/src/maasserver/models/virtualmachine.py
46@@ -300,10 +300,16 @@ def get_vm_host_used_resources(vmhost) -> VMHostUsedResources:
47 counts = VirtualMachine.objects.filter(
48 bmc=vmhost, project=vmhost.tracked_project
49 ).aggregate(
50- cores=C(Sum("unpinned_cores") + Sum(ArrayLength("pinned_cores"))),
51+ cores=C(Sum(F("unpinned_cores") + ArrayLength("pinned_cores"))),
52 memory=C(Sum("memory", filter=Q(hugepages_backed=False))),
53 hugepages_memory=C(Sum("memory", filter=Q(hugepages_backed=True))),
54- storage=C(Sum("disks_set__size")),
55+ )
56+ counts.update(
57+ VirtualMachineDisk.objects.filter(
58+ vm__bmc=vmhost, vm__project=vmhost.tracked_project
59+ ).aggregate(
60+ storage=C(Sum("size")),
61+ )
62 )
63 return VMHostUsedResources(**counts)
64

Subscribers

People subscribed via source and target branches