Merge ~troyanov/maas:fix-2003940-3.3 into maas:3.3

Proposed by Anton Troyanov
Status: Merged
Approved by: Anton Troyanov
Approved revision: 478dc737be6a05c10c31e55fff5370b82d93cb2e
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~troyanov/maas:fix-2003940-3.3
Merge into: maas:3.3
Diff against target: 73 lines (+33/-3)
2 files modified
src/maasserver/websockets/handlers/machine.py (+15/-3)
src/maasserver/websockets/handlers/tests/test_machine.py (+18/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Anton Troyanov Approve
Review via email: mp+442024@code.launchpad.net

Commit message

fix(ws): incorrect storage amount

Combining multiple aggregations with annotate() will yield the wrong results
because joins are used instead of subqueries.

See related Django bug: https://code.djangoproject.com/ticket/10060

Resolves LP:2003940

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

UNIT TESTS
-b fix-2003940-3.3 lp:~troyanov/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 68957d1035d803a2b9dbeb3f4000d4a5375f3469

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b fix-2003940-3.3 lp:~troyanov/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/2418/console
COMMIT: 478dc737be6a05c10c31e55fff5370b82d93cb2e

review: Needs Fixing
Revision history for this message
Anton Troyanov (troyanov) wrote :

jenkins: !test

Revision history for this message
Anton Troyanov (troyanov) wrote :

Self approving, since this backport is almost identical (but not a cherry-pick tho)
https://git.launchpad.net/maas/commit/?id=66663a3f3a99523aab3720697f9f0859def16b61

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b fix-2003940-3.3 lp:~troyanov/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 478dc737be6a05c10c31e55fff5370b82d93cb2e

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/maasserver/websockets/handlers/machine.py b/src/maasserver/websockets/handlers/machine.py
index d5ae491..9365a64 100644
--- a/src/maasserver/websockets/handlers/machine.py
+++ b/src/maasserver/websockets/handlers/machine.py
@@ -15,6 +15,7 @@ from django.db.models import (
15 Count,15 Count,
16 Exists,16 Exists,
17 F,17 F,
18 IntegerField,
18 OuterRef,19 OuterRef,
19 Subquery,20 Subquery,
20 Sum,21 Sum,
@@ -127,6 +128,15 @@ class MachineHandler(NodeHandler):
127 "partitiontable_set__partitions"128 "partitiontable_set__partitions"
128 )129 )
129 )130 )
131 node_storage_query_set = (
132 Machine.objects.select_related("current_config")
133 .annotate(
134 storage=Sum(
135 "current_config__blockdevice__physicalblockdevice__size"
136 )
137 )
138 .filter(pk=OuterRef("pk"))
139 )
130 list_queryset = (140 list_queryset = (
131 Machine.objects.all()141 Machine.objects.all()
132 .select_related("owner", "zone", "domain", "bmc", "current_config")142 .select_related("owner", "zone", "domain", "bmc", "current_config")
@@ -157,10 +167,12 @@ class MachineHandler(NodeHandler):
157 .prefetch_related("ownerdata_set")167 .prefetch_related("ownerdata_set")
158 .alias(168 .alias(
159 physical_disk_count=Count(169 physical_disk_count=Count(
160 "current_config__blockdevice__physicalblockdevice"170 "current_config__blockdevice__physicalblockdevice",
171 distinct=True,
161 ),172 ),
162 storage=Sum(173 storage=Subquery(
163 "current_config__blockdevice__physicalblockdevice__size"174 node_storage_query_set.values("storage"),
175 output_field=IntegerField(),
164 ),176 ),
165 pxe_mac=F("boot_interface__mac_address"),177 pxe_mac=F("boot_interface__mac_address"),
166 fabric_name=F("boot_interface__vlan__fabric__name"),178 fabric_name=F("boot_interface__vlan__fabric__name"),
diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py
index 08afc62..f7a5b79 100644
--- a/src/maasserver/websockets/handlers/tests/test_machine.py
+++ b/src/maasserver/websockets/handlers/tests/test_machine.py
@@ -6041,6 +6041,24 @@ class TestMachineHandlerNewSchema(MAASServerTestCase):
6041 self.assertEqual(2, result["count"])6041 self.assertEqual(2, result["count"])
6042 self.assertEqual(2, result["groups"][0]["count"])6042 self.assertEqual(2, result["groups"][0]["count"])
60436043
6044 def test_filter_storage_counters(self):
6045 user = factory.make_User()
6046 node = factory.make_Machine(owner=user)
6047 [node.tags.add(factory.make_Tag()) for _ in range(2)]
6048
6049 handler = MachineHandler(user, {}, None)
6050 result = handler.list({"filter": {"free_text": node.hostname}})
6051
6052 self.assertEqual(1, result["count"])
6053 self.assertEqual(
6054 node.physicalblockdevice_set.count(),
6055 result["groups"][0]["items"][0]["physical_disk_count"],
6056 )
6057 self.assertEqual(
6058 round(node.physicalblockdevice_set.first().size / (1000**3), 1),
6059 result["groups"][0]["items"][0]["storage"],
6060 )
6061
6044 def test_sort_alias(self):6062 def test_sort_alias(self):
6045 user = factory.make_User()6063 user = factory.make_User()
6046 fabrics = [factory.make_Fabric() for _ in range(2)]6064 fabrics = [factory.make_Fabric() for _ in range(2)]

Subscribers

People subscribed via source and target branches