Merge ~ack/maas:1904758-lxd-pod-refresh-fix into maas:master

Proposed by Alberto Donato
Status: Merged
Approved by: Alberto Donato
Approved revision: 5c4d65c836d17118ab1f58d74099562d52ae4e94
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ack/maas:1904758-lxd-pod-refresh-fix
Merge into: maas:master
Diff against target: 145 lines (+62/-6)
4 files modified
src/maasserver/models/bmc.py (+15/-3)
src/maasserver/models/node.py (+6/-0)
src/maasserver/models/tests/test_bmc.py (+39/-1)
src/maasserver/models/tests/test_node.py (+2/-2)
Reviewer Review Type Date Requested Status
Björn Tillenius Approve
MAAS Lander Approve
Review via email: mp+394201@code.launchpad.net

Commit message

LP: #1904758 - reuse existing VirtualMachine object when refreshing if one
already exists.

VirtualMachine objects are not deleted when the linked machine is removed.
This means when refreshing if a machine get re-added to maas, a VirtualMachine
entry for it already exists.

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

UNIT TESTS
-b 1904758-lxd-pod-refresh-fix lp:~ack/maas/+git/maas into -b master lp:~maas-committers/maas

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

review: Needs Fixing
Revision history for this message
Alberto Donato (ack) wrote :

jenkins: !test

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

UNIT TESTS
-b 1904758-lxd-pod-refresh-fix lp:~ack/maas/+git/maas into -b master lp:~maas-committers/maas

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

review: Needs Fixing
Revision history for this message
Björn Tillenius (bjornt) :
review: Needs Information
Revision history for this message
Alberto Donato (ack) wrote :

jenkins: !test

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

UNIT TESTS
-b 1904758-lxd-pod-refresh-fix lp:~ack/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 5c4d65c836d17118ab1f58d74099562d52ae4e94

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

+1 with a nitpick.

review: Approve
Revision history for this message
Alberto Donato (ack) :

There was an error fetching revisions from git servers. Please try again in a few minutes. If the problem persists, contact Launchpad support.

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 f0b4fca..5fe306b 100644
3--- a/src/maasserver/models/bmc.py
4+++ b/src/maasserver/models/bmc.py
5@@ -1145,14 +1145,13 @@ class Pod(BMC):
6
7 vm = getattr(existing_machine, "virtualmachine", None)
8 if vm is None:
9- vm = VirtualMachine.objects.create(
10+ vm, _ = VirtualMachine.objects.get_or_create(
11 identifier=existing_machine.instance_power_parameters[
12 "instance_name"
13 ],
14 bmc=self,
15- machine=existing_machine,
16 )
17-
18+ vm.machine = existing_machine
19 vm.memory = discovered_machine.memory
20 vm.hugepages_backed = discovered_machine.hugepages_backed
21 vm.pinned_cores = discovered_machine.pinned_cores
22@@ -1411,6 +1410,19 @@ class Pod(BMC):
23 % (self.name, remove_machine.hostname)
24 )
25
26+ # delete entries for VirtualMachines if the corresponding VM has been
27+ # removed on the host
28+ existing_instance_names = set(
29+ machine.power_parameters.get("instance_name")
30+ for machine in discovered_machines
31+ )
32+ existing_instance_names.discard(None)
33+ from maasserver.models.virtualmachine import VirtualMachine
34+
35+ VirtualMachine.objects.filter(bmc=self).exclude(
36+ identifier__in=existing_instance_names
37+ ).delete()
38+
39 def sync_storage_pools(self, discovered_storage_pools):
40 """Sync the storage pools for the pod."""
41 storage_pools_by_id = {
42diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py
43index fa05273..5d506b4 100644
44--- a/src/maasserver/models/node.py
45+++ b/src/maasserver/models/node.py
46@@ -3001,6 +3001,12 @@ class Node(CleanSave, TimestampedModel):
47 )
48 self.bmc.delete()
49
50+ # XXX always delete the VM associated to the machine, if present.
51+ # Ideally we should only delete VMs when the vM is decomposed.
52+ # See LP:#1904758 for details
53+ from maasserver.models.virtualmachine import VirtualMachine
54+
55+ VirtualMachine.objects.filter(machine_id=self.id).delete()
56 super().delete(*args, **kwargs)
57
58 def set_random_hostname(self):
59diff --git a/src/maasserver/models/tests/test_bmc.py b/src/maasserver/models/tests/test_bmc.py
60index 64db20d..249a093 100644
61--- a/src/maasserver/models/tests/test_bmc.py
62+++ b/src/maasserver/models/tests/test_bmc.py
63@@ -1130,6 +1130,39 @@ class TestPod(MAASServerTestCase):
64 Equals(len(discovered.machines)),
65 )
66
67+ def test_sync_for_lxd_pod_links_existing_vm(self):
68+ discovered_machine = self.make_discovered_machine()
69+ discovered_pod = self.make_discovered_pod(
70+ machines=[discovered_machine]
71+ )
72+ instance_name = discovered_machine.power_parameters["instance_name"]
73+
74+ pod = factory.make_Pod(pod_type="lxd")
75+ virtual_machine = factory.make_VirtualMachine(
76+ identifier=instance_name, bmc=pod
77+ )
78+ self.patch(Machine, "start_commissioning")
79+ pod.sync(discovered_pod, factory.make_User())
80+ machine = Machine.objects.get(hostname=instance_name)
81+ self.assertEqual(machine.virtualmachine, virtual_machine)
82+
83+ def test_sync_for_lxd_pod_removes_unknown_vms(self):
84+ discovered_pod = self.make_discovered_pod(machines=[])
85+ pod = factory.make_Pod(pod_type="lxd")
86+ machine1 = factory.make_Machine(bmc=pod)
87+ # a VM linked to a machine that's been removed on the VM host
88+ factory.make_VirtualMachine(
89+ identifier=machine1.hostname,
90+ bmc=pod,
91+ machine=machine1,
92+ )
93+ # a VM not linked to a machine that's been removed on the VM host
94+ factory.make_VirtualMachine(bmc=pod)
95+ self.patch(Machine, "start_commissioning")
96+ pod.sync(discovered_pod, factory.make_User())
97+ self.assertFalse(Machine.objects.exists())
98+ self.assertFalse(VirtualMachine.objects.exists())
99+
100 def test_sync_pod_upgrades_default_storage_pool(self):
101 discovered = self.make_discovered_pod(machines=[])
102 discovered_default = discovered.storage_pools[2]
103@@ -2081,7 +2114,10 @@ class TestPod(MAASServerTestCase):
104 ),
105 )
106 vm = factory.make_VirtualMachine(
107- bmc=pod, machine=machine, hugepages_backed=False
108+ identifier=machine.hostname,
109+ bmc=pod,
110+ machine=machine,
111+ hugepages_backed=False,
112 )
113 discovered_interface = self.make_discovered_interface(
114 mac_address=machine.interface_set.first().mac_address,
115@@ -2091,6 +2127,8 @@ class TestPod(MAASServerTestCase):
116 )
117 discovered_machine.hugepages_backed = True
118 discovered_machine.pinned_cores = [0, 1, 2]
119+ discovered_machine.hostname = machine.hostname
120+ discovered_machine.power_parameters["instance_name"] = machine.hostname
121 discovered_pod = self.make_discovered_pod(
122 machines=[discovered_machine]
123 )
124diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
125index 939976f..a5a5aa7 100644
126--- a/src/maasserver/models/tests/test_node.py
127+++ b/src/maasserver/models/tests/test_node.py
128@@ -1620,7 +1620,7 @@ class TestNode(MAASServerTestCase):
129 node.delete()
130 self.assertIsNotNone(reload_object(pod))
131
132- def test_delete_doesnt_delete_existing_virtual_machine(self):
133+ def test_delete_deletes_existing_virtual_machine(self):
134 pod = factory.make_Pod()
135 machine = factory.make_Machine(
136 bmc=pod, creation_type=NODE_CREATION_TYPE.PRE_EXISTING
137@@ -1629,7 +1629,7 @@ class TestNode(MAASServerTestCase):
138 vm.save()
139 with post_commit_hooks:
140 machine.delete()
141- self.assertIsNotNone(reload_object(vm))
142+ self.assertIsNone(reload_object(vm))
143
144 def test_delete_node_deletes_related_interface(self):
145 node = factory.make_Node()

Subscribers

People subscribed via source and target branches