Merge ~cgrabowski/maas:favor_existing_cluster_name_on_refresh into maas:master

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: c47eeb17ce36a1f618547fb59de8e1f76fbf74b9
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:favor_existing_cluster_name_on_refresh
Merge into: maas:master
Diff against target: 241 lines (+174/-13)
2 files modified
src/maasserver/tests/test_vmhost.py (+168/-3)
src/maasserver/vmhost.py (+6/-10)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Alexsander de Souza Approve
Review via email: mp+411280@code.launchpad.net

Commit message

favor existing cluster name over discovered cluster name

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

UNIT TESTS
-b favor_existing_cluster_name_on_refresh lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11445/console
COMMIT: 6dc1ca4752dc26a8b057e98b91a6d9f9da60cf56

review: Needs Fixing
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

+1

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

UNIT TESTS
-b favor_existing_cluster_name_on_refresh lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: c47eeb17ce36a1f618547fb59de8e1f76fbf74b9

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/tests/test_vmhost.py b/src/maasserver/tests/test_vmhost.py
2index b0a4843..4be9cae 100644
3--- a/src/maasserver/tests/test_vmhost.py
4+++ b/src/maasserver/tests/test_vmhost.py
5@@ -9,7 +9,7 @@ from twisted.internet.defer import succeed
6 from maasserver import vmhost as vmhost_module
7 from maasserver.enum import BMC_TYPE
8 from maasserver.exceptions import PodProblem
9-from maasserver.models import PodHints, VMCluster
10+from maasserver.models import Pod, PodHints, VMCluster
11 from maasserver.testing.factory import factory
12 from maasserver.testing.testcase import (
13 MAASServerTestCase,
14@@ -464,7 +464,7 @@ class TestSyncVMCluster(MAASServerTestCase):
15 cluster.hosts(), updated_vmhost.hints.cluster.hosts()
16 )
17
18- def test_sync_vmcluster_uses_existing_cluster_name_when_discovered_cluster_has_none(
19+ def test_sync_vmcluster_uses_existing_cluster_name_when_exists(
20 self,
21 ):
22 (
23@@ -472,7 +472,6 @@ class TestSyncVMCluster(MAASServerTestCase):
24 discovered_racks,
25 failed_racks,
26 ) = fake_cluster_discovery(self)
27- discovered_cluster.name = None
28 zone = factory.make_Zone()
29 pool = factory.make_ResourcePool()
30 cluster = factory.make_VMCluster(
31@@ -506,6 +505,76 @@ class TestSyncVMCluster(MAASServerTestCase):
32 )
33 self.assertEqual(updated_vmhost.hints.cluster.name, cluster.name)
34
35+ def test_sync_vmcluster_uses_vmhost_name_when_no_existing_cluster_or_discovered_cluster_name(
36+ self,
37+ ):
38+ (
39+ discovered_cluster,
40+ discovered_racks,
41+ failed_racks,
42+ ) = fake_cluster_discovery(self)
43+ discovered_cluster.name = None
44+ zone = factory.make_Zone()
45+ pool = factory.make_ResourcePool()
46+ vmhost = factory.make_Pod(
47+ zone=zone,
48+ pool=pool,
49+ )
50+ updated_vmhost = vmhost_module.sync_vmcluster(
51+ discovered_cluster,
52+ ({"cluster": discovered_cluster},),
53+ vmhost,
54+ factory.make_admin(),
55+ )
56+ self.assertEqual(vmhost.name, updated_vmhost.cluster.name)
57+
58+ def test_sync_vmcluster_does_not_duplicate_cluster_or_hosts_on_refresh(
59+ self,
60+ ):
61+ (
62+ discovered_cluster,
63+ discovered_racks,
64+ failed_racks,
65+ ) = fake_cluster_discovery(self)
66+ zone = factory.make_Zone()
67+ pool = factory.make_ResourcePool()
68+ cluster = factory.make_VMCluster(
69+ name=factory.make_name("cluster"),
70+ project=discovered_cluster.project,
71+ zone=zone,
72+ pool=pool,
73+ pods=0,
74+ )
75+ vmhosts = [
76+ factory.make_Pod(
77+ cluster=cluster,
78+ parameters={"power_address": address},
79+ zone=zone,
80+ pool=pool,
81+ )
82+ for address in discovered_cluster.pod_addresses
83+ ]
84+ successes = {
85+ rack_id: discovered_cluster for rack_id in discovered_racks
86+ }
87+ failures = {
88+ rack_id: factory.make_exception() for rack_id in failed_racks
89+ }
90+ self.patch(vmhost_module, "discover_pod").return_value = (
91+ successes,
92+ failures,
93+ )
94+ discovered_cluster.name = factory.make_name("new_cluster_name")
95+ updated_vmhost = vmhost_module.discover_and_sync_vmhost(
96+ vmhosts[1], factory.make_User()
97+ )
98+ self.assertEqual(updated_vmhost.cluster.name, cluster.name)
99+ hosts = Pod.objects.filter(
100+ name__in=[vmhost.name for vmhost in vmhosts]
101+ )
102+ self.assertEqual(len(vmhosts), len(hosts))
103+ self.assertEqual(updated_vmhost.cluster.id, cluster.id)
104+
105
106 class TestSyncVMClusterAsync(MAASTransactionServerTestCase):
107
108@@ -765,3 +834,99 @@ class TestSyncVMClusterAsync(MAASTransactionServerTestCase):
109
110 name = await deferToDatabase(_get_name)
111 self.assertEqual(name, cluster.name)
112+
113+ @wait_for_reactor
114+ async def test_sync_vmcluster_uses_vmhost_name_when_no_existing_cluster_or_discovered_cluster_name(
115+ self,
116+ ):
117+ (
118+ discovered_cluster,
119+ discovered_racks,
120+ failed_racks,
121+ ) = await deferToDatabase(fake_cluster_discovery, self)
122+ discovered_cluster.name = None
123+ zone = await deferToDatabase(factory.make_Zone)
124+ pool = await deferToDatabase(factory.make_ResourcePool)
125+ vmhost = await deferToDatabase(
126+ factory.make_Pod,
127+ zone=zone,
128+ pool=pool,
129+ )
130+ successes = {
131+ rack_id: discovered_cluster for rack_id in discovered_racks
132+ }
133+ failures = {
134+ rack_id: factory.make_exception() for rack_id in failed_racks
135+ }
136+ self.patch(vmhost_module, "discover_pod").return_value = (
137+ successes,
138+ failures,
139+ )
140+ admin = await deferToDatabase(factory.make_admin)
141+ updated_vmhost = await vmhost_module.sync_vmcluster_async(
142+ discovered_cluster,
143+ ({"cluster": discovered_cluster},),
144+ vmhost,
145+ admin,
146+ )
147+ self.assertEqual(vmhost.name, updated_vmhost.cluster.name)
148+
149+ @wait_for_reactor
150+ async def test_sync_vmcluster_does_not_duplicate_cluster_or_hosts_on_refresh(
151+ self,
152+ ):
153+ (
154+ discovered_cluster,
155+ discovered_racks,
156+ failed_racks,
157+ ) = await deferToDatabase(fake_cluster_discovery, self)
158+ zone = await deferToDatabase(factory.make_Zone)
159+ pool = await deferToDatabase(factory.make_ResourcePool)
160+ cluster = await deferToDatabase(
161+ factory.make_VMCluster,
162+ name=factory.make_name("cluster"),
163+ project=discovered_cluster.project,
164+ zone=zone,
165+ pool=pool,
166+ pods=0,
167+ )
168+
169+ def make_vmhosts():
170+ return [
171+ factory.make_Pod(
172+ cluster=cluster,
173+ parameters={"power_address": address},
174+ zone=zone,
175+ pool=pool,
176+ )
177+ for address in discovered_cluster.pod_addresses
178+ ]
179+
180+ vmhosts = await deferToDatabase(make_vmhosts)
181+
182+ discovered_cluster.name = factory.make_name("new_cluster_name")
183+ admin = await deferToDatabase(factory.make_admin)
184+ updated_vmhost = await vmhost_module.sync_vmcluster_async(
185+ discovered_cluster,
186+ ({"cluster": discovered_cluster},),
187+ vmhosts[1],
188+ admin,
189+ )
190+
191+ def get_updated_cluster():
192+ return updated_vmhost.cluster
193+
194+ updated_cluster = await deferToDatabase(get_updated_cluster)
195+ self.assertEqual(updated_cluster.name, cluster.name)
196+
197+ def get_new_len():
198+ return len(
199+ Pod.objects.filter(
200+ name__in=[vmhost.name for vmhost in vmhosts]
201+ )
202+ )
203+
204+ new_len = await deferToDatabase(get_new_len)
205+
206+ self.assertEqual(len(vmhosts), new_len)
207+ self.assertEqual(updated_cluster.id, cluster.id)
208diff --git a/src/maasserver/vmhost.py b/src/maasserver/vmhost.py
209index 2a67f64..f596844 100644
210--- a/src/maasserver/vmhost.py
211+++ b/src/maasserver/vmhost.py
212@@ -179,10 +179,9 @@ def _get_or_create_clustered_host(
213
214 def sync_vmcluster(discovered_cluster, discovered, vmhost, user):
215 cluster, _ = VMCluster.objects.get_or_create(
216- name=discovered_cluster.name
217- or (
218- vmhost.hints.cluster.name if vmhost.hints.cluster else vmhost.name
219- ),
220+ name=vmhost.cluster.name
221+ if vmhost.cluster
222+ else discovered_cluster.name or vmhost.name,
223 project=discovered_cluster.project,
224 pool=vmhost.pool,
225 zone=vmhost.zone,
226@@ -218,12 +217,9 @@ def sync_vmcluster(discovered_cluster, discovered, vmhost, user):
227 async def sync_vmcluster_async(discovered_cluster, discovered, vmhost, user):
228 def _transaction(discovered_cluster, discovered, vmhost, user):
229 cluster, _ = VMCluster.objects.get_or_create(
230- name=discovered_cluster.name
231- or (
232- vmhost.hints.cluster.name
233- if vmhost.hints.cluster
234- else vmhost.name
235- ),
236+ name=vmhost.hints.cluster.name
237+ if vmhost.cluster
238+ else discovered_cluster.name or vmhost.name,
239 project=discovered_cluster.project,
240 pool=vmhost.pool,
241 zone=vmhost.zone,

Subscribers

People subscribed via source and target branches