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
diff --git a/src/maasserver/models/tests/test_virtualmachine.py b/src/maasserver/models/tests/test_virtualmachine.py
index 02f3c75..d6654aa 100644
--- a/src/maasserver/models/tests/test_virtualmachine.py
+++ b/src/maasserver/models/tests/test_virtualmachine.py
@@ -807,3 +807,36 @@ class TestGetVMHostUsedResources(MAASServerTestCase):
807 self.assertEqual(used_resources.memory, 0)807 self.assertEqual(used_resources.memory, 0)
808 self.assertEqual(used_resources.hugepages_memory, 0)808 self.assertEqual(used_resources.hugepages_memory, 0)
809 self.assertEqual(used_resources.storage, 0)809 self.assertEqual(used_resources.storage, 0)
810
811 def test_get_used_resources_multiple_disks(self):
812 project = factory.make_string()
813 vmhost = factory.make_Pod(
814 pod_type="lxd",
815 parameters={"project": project},
816 )
817 pool1 = factory.make_PodStoragePool(pod=vmhost)
818 pool2 = factory.make_PodStoragePool(pod=vmhost)
819 vm1 = factory.make_VirtualMachine(
820 bmc=vmhost,
821 project=project,
822 memory=1024,
823 pinned_cores=[0, 1, 2],
824 hugepages_backed=False,
825 )
826 factory.make_VirtualMachineDisk(vm=vm1, backing_pool=pool1, size=1000)
827 factory.make_VirtualMachineDisk(vm=vm1, backing_pool=pool2, size=2000)
828 vm2 = factory.make_VirtualMachine(
829 bmc=vmhost,
830 project=project,
831 memory=2048,
832 unpinned_cores=2,
833 hugepages_backed=True,
834 )
835 factory.make_VirtualMachineDisk(vm=vm2, backing_pool=pool1, size=1000)
836 factory.make_VirtualMachineDisk(vm=vm2, backing_pool=pool2, size=4000)
837 used_resources = get_vm_host_used_resources(vmhost)
838 self.assertEqual(used_resources.cores, 5)
839 self.assertEqual(used_resources.memory, 1024)
840 self.assertEqual(used_resources.hugepages_memory, 2048)
841 self.assertEqual(used_resources.total_memory, 3072)
842 self.assertEqual(used_resources.storage, 8000)
diff --git a/src/maasserver/models/virtualmachine.py b/src/maasserver/models/virtualmachine.py
index 07a2462..49082cc 100644
--- a/src/maasserver/models/virtualmachine.py
+++ b/src/maasserver/models/virtualmachine.py
@@ -300,10 +300,16 @@ def get_vm_host_used_resources(vmhost) -> VMHostUsedResources:
300 counts = VirtualMachine.objects.filter(300 counts = VirtualMachine.objects.filter(
301 bmc=vmhost, project=vmhost.tracked_project301 bmc=vmhost, project=vmhost.tracked_project
302 ).aggregate(302 ).aggregate(
303 cores=C(Sum("unpinned_cores") + Sum(ArrayLength("pinned_cores"))),303 cores=C(Sum(F("unpinned_cores") + ArrayLength("pinned_cores"))),
304 memory=C(Sum("memory", filter=Q(hugepages_backed=False))),304 memory=C(Sum("memory", filter=Q(hugepages_backed=False))),
305 hugepages_memory=C(Sum("memory", filter=Q(hugepages_backed=True))),305 hugepages_memory=C(Sum("memory", filter=Q(hugepages_backed=True))),
306 storage=C(Sum("disks_set__size")),306 )
307 counts.update(
308 VirtualMachineDisk.objects.filter(
309 vm__bmc=vmhost, vm__project=vmhost.tracked_project
310 ).aggregate(
311 storage=C(Sum("size")),
312 )
307 )313 )
308 return VMHostUsedResources(**counts)314 return VMHostUsedResources(**counts)
309315

Subscribers

People subscribed via source and target branches