Merge ~alexsander-souza/maas:lp2028284_smart_sync_hints into maas:master

Proposed by Alexsander de Souza
Status: Merged
Approved by: Alexsander de Souza
Approved revision: 3a354cf69001fb651fba7b268e6b5af0e16e05bd
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~alexsander-souza/maas:lp2028284_smart_sync_hints
Merge into: maas:master
Diff against target: 130 lines (+63/-15)
3 files modified
src/maasserver/models/bmc.py (+23/-11)
src/maasserver/models/tests/test_bmc.py (+34/-0)
src/provisioningserver/drivers/pod/__init__.py (+6/-4)
Reviewer Review Type Date Requested Status
Björn Tillenius Approve
MAAS Lander Approve
Review via email: mp+449978@code.launchpad.net

Commit message

don't save hints if nothing changed

fixes LP#2028284

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

UNIT TESTS
-b lp2028284_smart_sync_hints lp:~alexsander-souza/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 3a354cf69001fb651fba7b268e6b5af0e16e05bd

review: Approve
Revision history for this message
Björn Tillenius (bjornt) wrote :

+1

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

LANDING
-b lp2028284_smart_sync_hints lp:~alexsander-souza/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED BUILD
LOG: http://maas-ci.internal:8080/job/maas-tester/3405/console

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 b317f34..54506e3 100644
3--- a/src/maasserver/models/bmc.py
4+++ b/src/maasserver/models/bmc.py
5@@ -69,7 +69,10 @@ from maasserver.utils.orm import transactional
6 from maasserver.utils.threads import deferToDatabase
7 from metadataserver.enum import RESULT_TYPE
8 from provisioningserver.drivers import SETTING_SCOPE
9-from provisioningserver.drivers.pod import InterfaceAttachType
10+from provisioningserver.drivers.pod import (
11+ DiscoveredPodHints,
12+ InterfaceAttachType,
13+)
14 from provisioningserver.drivers.power.registry import (
15 PowerDriverRegistry,
16 sanitise_power_parameters,
17@@ -800,21 +803,30 @@ class Pod(BMC):
18 def sync_hints(self, discovered_hints, cluster=None):
19 """Sync the hints with `discovered_hints`."""
20
21+ def update_hint(
22+ hints: PodHints, discovered: DiscoveredPodHints, attr: str
23+ ) -> bool:
24+ new_val = getattr(discovered, attr)
25+ if new_val != DiscoveredPodHints.UNDEFINED and new_val != getattr(
26+ hints, attr
27+ ):
28+ setattr(hints, attr, new_val)
29+ return True
30+ return False
31+
32+ changed = False
33 try:
34 hints = self.hints
35 except PodHints.DoesNotExist:
36 hints = self.hints = PodHints()
37- if discovered_hints.cores != -1:
38- hints.cores = discovered_hints.cores
39- if discovered_hints.cpu_speed != -1:
40- hints.cpu_speed = discovered_hints.cpu_speed
41- if discovered_hints.memory != -1:
42- hints.memory = discovered_hints.memory
43- if discovered_hints.local_storage != -1:
44- hints.local_storage = discovered_hints.local_storage
45- if cluster is not None:
46+ changed = True
47+ for a in ["cores", "cpu_speed", "memory", "local_storage"]:
48+ changed |= update_hint(hints, discovered_hints, a)
49+ if cluster is not None and hints.cluster != cluster:
50 hints.cluster = cluster
51- hints.save()
52+ changed = True
53+ if changed:
54+ hints.save()
55
56 def add_tag(self, tag):
57 """Add tag to Pod."""
58diff --git a/src/maasserver/models/tests/test_bmc.py b/src/maasserver/models/tests/test_bmc.py
59index b766810..0e56f59 100644
60--- a/src/maasserver/models/tests/test_bmc.py
61+++ b/src/maasserver/models/tests/test_bmc.py
62@@ -44,6 +44,7 @@ from maasserver.models.fabric import Fabric
63 from maasserver.models.filesystem import Filesystem
64 from maasserver.models.node import Controller, Machine, Node
65 from maasserver.models.physicalblockdevice import PhysicalBlockDevice
66+from maasserver.models.podhints import PodHints
67 from maasserver.models.podstoragepool import PodStoragePool
68 from maasserver.models.resourcepool import ResourcePool
69 from maasserver.models.staticipaddress import StaticIPAddress
70@@ -3035,6 +3036,39 @@ class TestPod(MAASServerTestCase, PodTestMixin):
71 self.assertEqual(vm.bmc_id, intended_bmc.id)
72
73
74+class TestPodHints(MAASServerTestCase, PodTestMixin):
75+ def test_sync_hints_doesnt_save_empty_hints(self):
76+ cluster = factory.make_VMCluster(pods=0)
77+ discovered = self.make_discovered_pod()
78+ pod1 = Pod(
79+ power_type="lxd",
80+ power_parameters={"project": factory.make_name("project")},
81+ )
82+ pod1.save()
83+ mock_hint_save = self.patch(PodHints, "save")
84+ pod1.sync_hints(discovered.hints, cluster=cluster)
85+ mock_hint_save.assert_called()
86+ mock_hint_save.reset_mock()
87+ blank = DiscoveredPodHints()
88+ pod1.sync_hints(blank)
89+ mock_hint_save.assert_not_called()
90+
91+ def test_sync_hints_doesnt_save_same_hints(self):
92+ cluster = factory.make_VMCluster(pods=0)
93+ discovered = self.make_discovered_pod()
94+ pod1 = Pod(
95+ power_type="lxd",
96+ power_parameters={"project": factory.make_name("project")},
97+ )
98+ pod1.save()
99+ mock_hint_save = self.patch(PodHints, "save")
100+ pod1.sync_hints(discovered.hints, cluster=cluster)
101+ mock_hint_save.assert_called()
102+ mock_hint_save.reset_mock()
103+ pod1.sync_hints(discovered.hints)
104+ mock_hint_save.assert_not_called()
105+
106+
107 class TestPodDelete(MAASTransactionServerTestCase, PodTestMixin):
108 def test_delete_is_not_allowed(self):
109 pod = factory.make_Pod()
110diff --git a/src/provisioningserver/drivers/pod/__init__.py b/src/provisioningserver/drivers/pod/__init__.py
111index 815e076..197909c 100644
112--- a/src/provisioningserver/drivers/pod/__init__.py
113+++ b/src/provisioningserver/drivers/pod/__init__.py
114@@ -259,10 +259,12 @@ class DiscoveredPodHints:
115 Limiting the maximum cores allow request on a per machine basis.
116 """
117
118- cores = attr.ib(converter=int, default=-1)
119- cpu_speed = attr.ib(converter=int, default=-1)
120- memory = attr.ib(converter=int, default=-1)
121- local_storage = attr.ib(converter=int, default=-1)
122+ UNDEFINED = -1
123+
124+ cores = attr.ib(converter=int, default=UNDEFINED)
125+ cpu_speed = attr.ib(converter=int, default=UNDEFINED)
126+ memory = attr.ib(converter=int, default=UNDEFINED)
127+ local_storage = attr.ib(converter=int, default=UNDEFINED)
128
129
130 @attr.s

Subscribers

People subscribed via source and target branches