Merge ~adam-collard/maas:vmcluster-tracked-vms-websocket into maas:master

Proposed by Adam Collard
Status: Merged
Approved by: Adam Collard
Approved revision: ccce0d6e2d4ba7ea231d1fb2410578561115b15d
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~adam-collard/maas:vmcluster-tracked-vms-websocket
Merge into: maas:master
Diff against target: 283 lines (+99/-19)
5 files modified
src/maasserver/models/tests/test_vmcluster.py (+32/-0)
src/maasserver/models/vmcluster.py (+6/-1)
src/maasserver/testing/factory.py (+13/-9)
src/maasserver/websockets/handlers/tests/test_vmcluster.py (+38/-5)
src/maasserver/websockets/handlers/vmcluster.py (+10/-4)
Reviewer Review Type Date Requested Status
MAAS Lander Needs Fixing
Alberto Donato (community) Approve
Review via email: mp+411329@code.launchpad.net

Commit message

LP:1949720: Only expose VMs in the VMCluster's project in dehydrate

To post a comment you must log in.
Revision history for this message
Alberto Donato (ack) wrote :

+1!

small nit inline

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

UNIT TESTS
-b vmcluster-tracked-vms-websocket lp:~adam-collard/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11452/console
COMMIT: c93c0536997573e216a0ca3392fc98ca3efd04df

review: Needs Fixing
Revision history for this message
Adam Collard (adam-collard) wrote :

jenkins: !test

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

UNIT TESTS
-b vmcluster-tracked-vms-websocket lp:~adam-collard/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11453/console
COMMIT: c93c0536997573e216a0ca3392fc98ca3efd04df

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

UNIT TESTS
-b vmcluster-tracked-vms-websocket lp:~adam-collard/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11454/console
COMMIT: 158c9f898eea6b22b48743e647350579cf95039c

review: Needs Fixing
Revision history for this message
Adam Collard (adam-collard) wrote :

jenkins: !test

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

UNIT TESTS
-b vmcluster-tracked-vms-websocket lp:~adam-collard/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 158c9f898eea6b22b48743e647350579cf95039c

review: Approve
ccce0d6... by Adam Collard

Add test for vmcluster vm_count

Pass project through to Pod in factory

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

UNIT TESTS
-b vmcluster-tracked-vms-websocket lp:~adam-collard/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11457/console
COMMIT: f38a333224e45799316f439145f0ca9250f58d92

review: Needs Fixing

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/models/tests/test_vmcluster.py b/src/maasserver/models/tests/test_vmcluster.py
2index fa1db30..09fe42f 100644
3--- a/src/maasserver/models/tests/test_vmcluster.py
4+++ b/src/maasserver/models/tests/test_vmcluster.py
5@@ -510,6 +510,19 @@ class TestVMCluster(MAASServerTestCase):
6 cluster = VMCluster(name=cluster_name, project=project)
7 self.assertEqual(list(cluster.virtual_machines()), [])
8
9+ def test_tracked_virtual_machines(self):
10+ our_project = factory.make_name("project")
11+ other_project = factory.make_name("project")
12+ cluster = factory.make_VMCluster(project=our_project, vms=3)
13+
14+ pod = cluster.hosts().get()
15+ # a VM that we're not tracking, since it's in another project
16+ untracked_vm = factory.make_VirtualMachine(
17+ memory=1024, bmc=pod, project=other_project
18+ )
19+ self.assertNotIn(untracked_vm, cluster.tracked_virtual_machines())
20+ self.assertIn(untracked_vm, cluster.virtual_machines())
21+
22 def test_update_cluster_certificate_updates_peers_with_same_cert(self):
23 cluster = factory.make_VMCluster(pods=3)
24 cert = SAMPLE_CERT.certificate_pem()
25@@ -589,3 +602,22 @@ class TestVMClusterUpdate(MAASTransactionServerTestCase):
26 pod2_pool = yield deferToDatabase(lambda: reload_object(pod2).pool)
27 self.assertEqual(pool, pod1_pool)
28 self.assertEqual(pool, pod2_pool)
29+
30+
31+class TestVMClusterVMCount(MAASServerTestCase):
32+ def test_untracked_vms_counted(self):
33+ our_project = factory.make_name("project")
34+ other_project = factory.make_name("project")
35+
36+ cluster = factory.make_VMCluster(project=our_project, vms=3)
37+
38+ pod = cluster.hosts().get()
39+ # a VM that we're not tracking, since it's in another project
40+ factory.make_VirtualMachine(
41+ memory=1024, bmc=pod.as_bmc(), project=other_project
42+ )
43+
44+ resources = cluster.total_resources()
45+ self.assertEqual(3, resources.vm_count.tracked)
46+ self.assertEqual(1, resources.vm_count.other)
47+ self.assertEqual(4, resources.vm_count.total)
48diff --git a/src/maasserver/models/vmcluster.py b/src/maasserver/models/vmcluster.py
49index 08f5b08..66bf485 100644
50--- a/src/maasserver/models/vmcluster.py
51+++ b/src/maasserver/models/vmcluster.py
52@@ -194,11 +194,16 @@ class VMCluster(CleanSave, TimestampedModel):
53 return cluster_resources
54
55 def virtual_machines(self):
56+ """All VirtualMachines on this cluster, includes untracked VMs"""
57 from maasserver.models.virtualmachine import VirtualMachine
58
59 hosts = self.hosts()
60 return VirtualMachine.objects.filter(bmc__in=hosts)
61
62+ def tracked_virtual_machines(self):
63+ """VirtualMachines that are part of this project."""
64+ return self.virtual_machines().filter(project=self.project)
65+
66 def storage_pools(self):
67 from maasserver.models.virtualmachine import get_vm_host_storage_pools
68
69@@ -349,7 +354,7 @@ class VMClusterVMCount:
70
71 @property
72 def total(self):
73- return self.tracked - self.other
74+ return self.tracked + self.other
75
76
77 @dataclass
78diff --git a/src/maasserver/testing/factory.py b/src/maasserver/testing/factory.py
79index 562d610..6e7ceda 100644
80--- a/src/maasserver/testing/factory.py
81+++ b/src/maasserver/testing/factory.py
82@@ -656,7 +656,7 @@ class Factory(maastesting.factory.Factory):
83 def make_BMC(
84 self, power_type=None, power_parameters=None, ip_address=None, **kwargs
85 ):
86- """Make a :class:`BMC`. """
87+ """Make a :class:`BMC`."""
88 # If an IP address was specified, we need to present it in the BMC
89 # power_parameters, or it will be overwritten.
90 if ip_address is not None:
91@@ -699,6 +699,7 @@ class Factory(maastesting.factory.Factory):
92 parameters=None,
93 ip_address=None,
94 host=None,
95+ project=None,
96 cluster=None,
97 **kwargs,
98 ):
99@@ -718,6 +719,8 @@ class Factory(maastesting.factory.Factory):
100 }
101 elif pod_type == "lxd":
102 parameters = {"power_address": f"{ip}:8443"}
103+ if project:
104+ parameters["project"] = project
105 pod = Pod(
106 power_type=pod_type,
107 power_parameters=parameters,
108@@ -3014,9 +3017,9 @@ class Factory(maastesting.factory.Factory):
109 disk_size=None,
110 ):
111 if name is None:
112- name = factory.make_name("name")
113+ name = self.make_name("name")
114 if project is None:
115- project = factory.make_name("project")
116+ project = self.make_name("project")
117 if zone is None:
118 zone = self.make_Zone()
119
120@@ -3028,25 +3031,26 @@ class Factory(maastesting.factory.Factory):
121 )
122
123 for _ in range(0, pods):
124- pod = factory.make_Pod(
125+ pod = self.make_Pod(
126 pod_type="lxd",
127- host=None,
128 cores=cores,
129 memory=memory,
130 cluster=cluster,
131+ project=project,
132 )
133- pool = factory.make_PodStoragePool(pod=pod, storage=storage)
134+ pool = self.make_PodStoragePool(pod=pod, storage=storage)
135
136 for _ in range(0, vms):
137- node = factory.make_Node(bmc=pod)
138- vm = factory.make_VirtualMachine(
139+ node = self.make_Node(bmc=pod)
140+ vm = self.make_VirtualMachine(
141 machine=node,
142 memory=vm_memory,
143 pinned_cores=[0, 2],
144 hugepages_backed=False,
145 bmc=pod,
146+ project=project,
147 )
148- factory.make_VirtualMachineDisk(
149+ self.make_VirtualMachineDisk(
150 vm=vm, backing_pool=pool, size=disk_size
151 )
152
153diff --git a/src/maasserver/websockets/handlers/tests/test_vmcluster.py b/src/maasserver/websockets/handlers/tests/test_vmcluster.py
154index 176e015..1b59b43 100644
155--- a/src/maasserver/websockets/handlers/tests/test_vmcluster.py
156+++ b/src/maasserver/websockets/handlers/tests/test_vmcluster.py
157@@ -31,7 +31,9 @@ class TestVMClusterHandler(MAASTransactionServerTestCase):
158 ]
159 vms = [
160 factory.make_VirtualMachine(
161- bmc=vmhost.as_bmc(), machine=factory.make_Machine()
162+ bmc=vmhost.as_bmc(),
163+ machine=factory.make_Machine(),
164+ project=cluster.project,
165 )
166 for vmhost in vmhosts
167 ]
168@@ -62,7 +64,9 @@ class TestVMClusterHandler(MAASTransactionServerTestCase):
169 if with_vms:
170 vms = [
171 factory.make_VirtualMachine(
172- bmc=vmhost.as_bmc(), machine=factory.make_Machine()
173+ bmc=vmhost.as_bmc(),
174+ machine=factory.make_Machine(),
175+ project=cluster.project,
176 )
177 for vmhost in vmhosts
178 ]
179@@ -201,11 +205,13 @@ class TestVMClusterHandler(MAASTransactionServerTestCase):
180 def test_full_dehydrate(self):
181 cluster = factory.make_VMCluster(pods=3)
182 vmhosts = cluster.hosts()
183- _ = [factory.make_PodStoragePool(pod=vmhost) for vmhost in vmhosts]
184+ [factory.make_PodStoragePool(pod=vmhost) for vmhost in vmhosts]
185
186 vms = [
187 factory.make_VirtualMachine(
188- bmc=vmhost.as_bmc(), machine=factory.make_Machine()
189+ bmc=vmhost.as_bmc(),
190+ machine=factory.make_Machine(),
191+ project=cluster.project,
192 )
193 for vmhost in vmhosts
194 ]
195@@ -216,6 +222,31 @@ class TestVMClusterHandler(MAASTransactionServerTestCase):
196
197 self._assert_dehydrated_cluster_equal(result, cluster, vmhosts, vms)
198
199+ def test_full_dehydrate_with_untracked_vms(self):
200+ cluster = factory.make_VMCluster()
201+ vmhost = cluster.hosts().get()
202+ factory.make_PodStoragePool(pod=vmhost)
203+
204+ tracked_vm = factory.make_VirtualMachine(
205+ bmc=vmhost.as_bmc(),
206+ machine=factory.make_Machine(),
207+ project=cluster.project,
208+ )
209+ # Untracked VM in a separate project
210+ factory.make_VirtualMachine(
211+ bmc=vmhost.as_bmc(),
212+ machine=None,
213+ project=factory.make_name("project"),
214+ )
215+
216+ handler = VMClusterHandler(factory.make_admin(), {}, None)
217+
218+ result = handler.full_dehydrate(cluster)
219+
220+ self._assert_dehydrated_cluster_equal(
221+ result, cluster, [vmhost], [tracked_vm]
222+ )
223+
224 def test_dehydrate(self):
225 cluster = factory.make_VMCluster(pods=0)
226 vmhosts = [factory.make_Pod(cluster=cluster) for _ in range(3)]
227@@ -223,7 +254,9 @@ class TestVMClusterHandler(MAASTransactionServerTestCase):
228
229 vms = [
230 factory.make_VirtualMachine(
231- bmc=vmhost.as_bmc(), machine=factory.make_Machine()
232+ bmc=vmhost.as_bmc(),
233+ machine=factory.make_Machine(),
234+ project=cluster.project,
235 )
236 for vmhost in vmhosts
237 ]
238diff --git a/src/maasserver/websockets/handlers/vmcluster.py b/src/maasserver/websockets/handlers/vmcluster.py
239index 07f20a1..fdeaaa6 100644
240--- a/src/maasserver/websockets/handlers/vmcluster.py
241+++ b/src/maasserver/websockets/handlers/vmcluster.py
242@@ -98,7 +98,10 @@ class VMClusterHandler(TimestampedModelHandler):
243
244 def full_dehydrate(self, obj, for_list=False):
245 return self.dehydrate(
246- obj, obj.hosts(), obj.total_resources(), obj.virtual_machines()
247+ obj,
248+ obj.hosts(),
249+ obj.total_resources(),
250+ obj.tracked_virtual_machines(),
251 )
252
253 def dehydrate(self, cluster, vmhosts, resources, vms):
254@@ -136,7 +139,7 @@ class VMClusterHandler(TimestampedModelHandler):
255 cluster,
256 cluster.hosts(),
257 cluster.total_resources(),
258- cluster.virtual_machines(),
259+ cluster.tracked_virtual_machines(),
260 )
261 for cluster in objs
262 }
263@@ -160,7 +163,7 @@ class VMClusterHandler(TimestampedModelHandler):
264 cluster,
265 cluster.hosts(),
266 cluster.total_resources(),
267- cluster.virtual_machines(),
268+ cluster.tracked_virtual_machines(),
269 )
270 for cluster in phys_cluster
271 ]
272@@ -181,7 +184,10 @@ class VMClusterHandler(TimestampedModelHandler):
273 @transactional
274 def render_object(obj):
275 return self.dehydrate(
276- obj, obj.hosts(), obj.total_resources(), obj.virtual_machines()
277+ obj,
278+ obj.hosts(),
279+ obj.total_resources(),
280+ obj.tracked_virtual_machines(),
281 )
282
283 cluster = await deferToDatabase(get_object, params["id"])

Subscribers

People subscribed via source and target branches