Merge ~adam-collard/maas:2.9-pod-hints-average into maas:2.9

Proposed by Adam Collard
Status: Merged
Approved by: Adam Collard
Approved revision: 79293fb4c4b646c92a997b85b414181f8f978f78
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~adam-collard/maas:2.9-pod-hints-average
Merge into: maas:2.9
Diff against target: 124 lines (+21/-14)
3 files modified
src/maasserver/models/bmc.py (+7/-6)
src/maasserver/models/tests/test_bmc.py (+8/-6)
src/maasserver/triggers/tests/test_system_listener.py (+6/-2)
Reviewer Review Type Date Requested Status
Adam Collard (community) Approve
MAAS Lander unittests Pending
Review via email: mp+394756@code.launchpad.net

Commit message

Change PodHints CPU speed to be mean-average of nodes'

Previous implementation seemed to be a naive implementation of an
average with "cpu_speed = (cpu_speed + node.cpu_speed) / 2" which
falls down with 3 or more nodes.

Cherry-pick 4ace066772f093d8b4b367d9becf43cde748825b

To post a comment you must log in.
Revision history for this message
Adam Collard (adam-collard) :
review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/models/bmc.py b/src/maasserver/models/bmc.py
2index 5fe306b..95f3f1a 100644
3--- a/src/maasserver/models/bmc.py
4+++ b/src/maasserver/models/bmc.py
5@@ -6,6 +6,7 @@
6
7 from functools import partial
8 import re
9+from statistics import mean
10
11 from django.contrib.postgres.fields import ArrayField, JSONField
12 from django.core.exceptions import PermissionDenied, ValidationError
13@@ -1548,7 +1549,7 @@ class Pod(BMC):
14 podlog.info("%s: finished syncing discovered information" % self.name)
15
16 def sync_hints_from_nodes(self):
17- """Sync the hints based on discovered data from assoicated nodes."""
18+ """Sync the hints based on discovered data from associated nodes."""
19 try:
20 hints = self.hints
21 except PodHints.DoesNotExist:
22@@ -1558,6 +1559,7 @@ class Pod(BMC):
23 self.memory = hints.memory = 0
24 self.local_disks = hints.local_disks = 0
25 self.iscsi_storage = hints.iscsi_storage = 0
26+ cpu_speeds = []
27 # Set the hints for the Pod to the total amount for all nodes in a
28 # cluster.
29 for node in hints.nodes.all().prefetch_related(
30@@ -1569,11 +1571,7 @@ class Pod(BMC):
31 hints.memory += numa.memory
32 self.memory += numa.memory
33 if node.cpu_speed != 0:
34- if hints.cpu_speed != 0:
35- hints.cpu_speed = (hints.cpu_speed + node.cpu_speed) / 2
36- else:
37- hints.cpu_speed = node.cpu_speed
38- self.cpu_speed = hints.cpu_speed
39+ cpu_speeds.append(node.cpu_speed)
40 for bd in node.blockdevice_set.all():
41 if bd.type == "physical":
42 hints.local_disks += 1
43@@ -1581,6 +1579,9 @@ class Pod(BMC):
44 elif bd.type == "iscsi":
45 hints.iscsi_storage += bd.size
46 self.iscsi_storage += bd.size
47+ self.cpu_speed = hints.cpu_speed = (
48+ mean(cpu_speeds) if cpu_speeds else 0
49+ )
50 hints.save()
51 self.save()
52
53diff --git a/src/maasserver/models/tests/test_bmc.py b/src/maasserver/models/tests/test_bmc.py
54index 249a093..76216e9 100644
55--- a/src/maasserver/models/tests/test_bmc.py
56+++ b/src/maasserver/models/tests/test_bmc.py
57@@ -5,6 +5,7 @@
58
59
60 import random
61+from statistics import mean
62 from unittest.mock import Mock, sentinel
63
64 from crochet import wait_for
65@@ -2475,7 +2476,7 @@ class TestPod(MAASServerTestCase):
66 pod.sync_hints_from_nodes()
67
68 cores = 0
69- cpu_speed = 0
70+ cpu_speeds = []
71 memory = 0
72 local_storage = 0
73 iscsi_storage = 0
74@@ -2483,10 +2484,7 @@ class TestPod(MAASServerTestCase):
75 for numa in node.numanode_set.all():
76 cores += len(numa.cores)
77 memory += numa.memory
78- if cpu_speed == 0:
79- cpu_speed = node.cpu_speed
80- else:
81- cpu_speed = (cpu_speed + node.cpu_speed) / 2
82+ cpu_speeds.append(node.cpu_speed)
83 for bd in node.blockdevice_set.all():
84 if bd.type == "physical":
85 local_storage += bd.size
86@@ -2494,7 +2492,11 @@ class TestPod(MAASServerTestCase):
87 iscsi_storage += bd.size
88
89 self.assertEquals(pod.hints.cores, cores)
90- self.assertEquals(pod.hints.cpu_speed, int(cpu_speed))
91+ self.assertEquals(
92+ pod.hints.cpu_speed,
93+ int(mean(cpu_speeds)),
94+ f"Wrong hint ({pod.hints.cpu_speed}) for CPU speed. CPU speeds of nodes: {cpu_speeds}",
95+ )
96 self.assertEquals(pod.hints.memory, memory)
97 self.assertEquals(pod.hints.local_disks, len(nodes))
98 self.assertEquals(pod.hints.iscsi_storage, iscsi_storage)
99diff --git a/src/maasserver/triggers/tests/test_system_listener.py b/src/maasserver/triggers/tests/test_system_listener.py
100index be1d117..1573f02 100644
101--- a/src/maasserver/triggers/tests/test_system_listener.py
102+++ b/src/maasserver/triggers/tests/test_system_listener.py
103@@ -3834,7 +3834,9 @@ class TestDNSStaticIPAddressListener(
104 "ip": old_ip,
105 },
106 )
107- new_ip = factory.pick_ip_in_network(subnet.get_ipnetwork())
108+ new_ip = factory.pick_ip_in_network(
109+ subnet.get_ipnetwork(), but_not=[old_ip]
110+ )
111 yield self.capturePublication()
112 dv = DeferredValue()
113 listener = self.make_listener_without_delay()
114@@ -3875,7 +3877,9 @@ class TestDNSStaticIPAddressListener(
115 "ip": old_ip,
116 },
117 )
118- new_ip = factory.pick_ip_in_network(subnet.get_ipnetwork())
119+ new_ip = factory.pick_ip_in_network(
120+ subnet.get_ipnetwork(), but_not=[old_ip]
121+ )
122 yield self.capturePublication()
123 dv = DeferredValue()
124 listener = self.make_listener_without_delay()

Subscribers

People subscribed via source and target branches