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
diff --git a/src/maasserver/models/bmc.py b/src/maasserver/models/bmc.py
index f0b4fca..5fe306b 100644
--- a/src/maasserver/models/bmc.py
+++ b/src/maasserver/models/bmc.py
@@ -1145,14 +1145,13 @@ class Pod(BMC):
11451145
1146 vm = getattr(existing_machine, "virtualmachine", None)1146 vm = getattr(existing_machine, "virtualmachine", None)
1147 if vm is None:1147 if vm is None:
1148 vm = VirtualMachine.objects.create(1148 vm, _ = VirtualMachine.objects.get_or_create(
1149 identifier=existing_machine.instance_power_parameters[1149 identifier=existing_machine.instance_power_parameters[
1150 "instance_name"1150 "instance_name"
1151 ],1151 ],
1152 bmc=self,1152 bmc=self,
1153 machine=existing_machine,
1154 )1153 )
11551154 vm.machine = existing_machine
1156 vm.memory = discovered_machine.memory1155 vm.memory = discovered_machine.memory
1157 vm.hugepages_backed = discovered_machine.hugepages_backed1156 vm.hugepages_backed = discovered_machine.hugepages_backed
1158 vm.pinned_cores = discovered_machine.pinned_cores1157 vm.pinned_cores = discovered_machine.pinned_cores
@@ -1411,6 +1410,19 @@ class Pod(BMC):
1411 % (self.name, remove_machine.hostname)1410 % (self.name, remove_machine.hostname)
1412 )1411 )
14131412
1413 # delete entries for VirtualMachines if the corresponding VM has been
1414 # removed on the host
1415 existing_instance_names = set(
1416 machine.power_parameters.get("instance_name")
1417 for machine in discovered_machines
1418 )
1419 existing_instance_names.discard(None)
1420 from maasserver.models.virtualmachine import VirtualMachine
1421
1422 VirtualMachine.objects.filter(bmc=self).exclude(
1423 identifier__in=existing_instance_names
1424 ).delete()
1425
1414 def sync_storage_pools(self, discovered_storage_pools):1426 def sync_storage_pools(self, discovered_storage_pools):
1415 """Sync the storage pools for the pod."""1427 """Sync the storage pools for the pod."""
1416 storage_pools_by_id = {1428 storage_pools_by_id = {
diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py
index fa05273..5d506b4 100644
--- a/src/maasserver/models/node.py
+++ b/src/maasserver/models/node.py
@@ -3001,6 +3001,12 @@ class Node(CleanSave, TimestampedModel):
3001 )3001 )
3002 self.bmc.delete()3002 self.bmc.delete()
30033003
3004 # XXX always delete the VM associated to the machine, if present.
3005 # Ideally we should only delete VMs when the vM is decomposed.
3006 # See LP:#1904758 for details
3007 from maasserver.models.virtualmachine import VirtualMachine
3008
3009 VirtualMachine.objects.filter(machine_id=self.id).delete()
3004 super().delete(*args, **kwargs)3010 super().delete(*args, **kwargs)
30053011
3006 def set_random_hostname(self):3012 def set_random_hostname(self):
diff --git a/src/maasserver/models/tests/test_bmc.py b/src/maasserver/models/tests/test_bmc.py
index 64db20d..249a093 100644
--- a/src/maasserver/models/tests/test_bmc.py
+++ b/src/maasserver/models/tests/test_bmc.py
@@ -1130,6 +1130,39 @@ class TestPod(MAASServerTestCase):
1130 Equals(len(discovered.machines)),1130 Equals(len(discovered.machines)),
1131 )1131 )
11321132
1133 def test_sync_for_lxd_pod_links_existing_vm(self):
1134 discovered_machine = self.make_discovered_machine()
1135 discovered_pod = self.make_discovered_pod(
1136 machines=[discovered_machine]
1137 )
1138 instance_name = discovered_machine.power_parameters["instance_name"]
1139
1140 pod = factory.make_Pod(pod_type="lxd")
1141 virtual_machine = factory.make_VirtualMachine(
1142 identifier=instance_name, bmc=pod
1143 )
1144 self.patch(Machine, "start_commissioning")
1145 pod.sync(discovered_pod, factory.make_User())
1146 machine = Machine.objects.get(hostname=instance_name)
1147 self.assertEqual(machine.virtualmachine, virtual_machine)
1148
1149 def test_sync_for_lxd_pod_removes_unknown_vms(self):
1150 discovered_pod = self.make_discovered_pod(machines=[])
1151 pod = factory.make_Pod(pod_type="lxd")
1152 machine1 = factory.make_Machine(bmc=pod)
1153 # a VM linked to a machine that's been removed on the VM host
1154 factory.make_VirtualMachine(
1155 identifier=machine1.hostname,
1156 bmc=pod,
1157 machine=machine1,
1158 )
1159 # a VM not linked to a machine that's been removed on the VM host
1160 factory.make_VirtualMachine(bmc=pod)
1161 self.patch(Machine, "start_commissioning")
1162 pod.sync(discovered_pod, factory.make_User())
1163 self.assertFalse(Machine.objects.exists())
1164 self.assertFalse(VirtualMachine.objects.exists())
1165
1133 def test_sync_pod_upgrades_default_storage_pool(self):1166 def test_sync_pod_upgrades_default_storage_pool(self):
1134 discovered = self.make_discovered_pod(machines=[])1167 discovered = self.make_discovered_pod(machines=[])
1135 discovered_default = discovered.storage_pools[2]1168 discovered_default = discovered.storage_pools[2]
@@ -2081,7 +2114,10 @@ class TestPod(MAASServerTestCase):
2081 ),2114 ),
2082 )2115 )
2083 vm = factory.make_VirtualMachine(2116 vm = factory.make_VirtualMachine(
2084 bmc=pod, machine=machine, hugepages_backed=False2117 identifier=machine.hostname,
2118 bmc=pod,
2119 machine=machine,
2120 hugepages_backed=False,
2085 )2121 )
2086 discovered_interface = self.make_discovered_interface(2122 discovered_interface = self.make_discovered_interface(
2087 mac_address=machine.interface_set.first().mac_address,2123 mac_address=machine.interface_set.first().mac_address,
@@ -2091,6 +2127,8 @@ class TestPod(MAASServerTestCase):
2091 )2127 )
2092 discovered_machine.hugepages_backed = True2128 discovered_machine.hugepages_backed = True
2093 discovered_machine.pinned_cores = [0, 1, 2]2129 discovered_machine.pinned_cores = [0, 1, 2]
2130 discovered_machine.hostname = machine.hostname
2131 discovered_machine.power_parameters["instance_name"] = machine.hostname
2094 discovered_pod = self.make_discovered_pod(2132 discovered_pod = self.make_discovered_pod(
2095 machines=[discovered_machine]2133 machines=[discovered_machine]
2096 )2134 )
diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
index 939976f..a5a5aa7 100644
--- a/src/maasserver/models/tests/test_node.py
+++ b/src/maasserver/models/tests/test_node.py
@@ -1620,7 +1620,7 @@ class TestNode(MAASServerTestCase):
1620 node.delete()1620 node.delete()
1621 self.assertIsNotNone(reload_object(pod))1621 self.assertIsNotNone(reload_object(pod))
16221622
1623 def test_delete_doesnt_delete_existing_virtual_machine(self):1623 def test_delete_deletes_existing_virtual_machine(self):
1624 pod = factory.make_Pod()1624 pod = factory.make_Pod()
1625 machine = factory.make_Machine(1625 machine = factory.make_Machine(
1626 bmc=pod, creation_type=NODE_CREATION_TYPE.PRE_EXISTING1626 bmc=pod, creation_type=NODE_CREATION_TYPE.PRE_EXISTING
@@ -1629,7 +1629,7 @@ class TestNode(MAASServerTestCase):
1629 vm.save()1629 vm.save()
1630 with post_commit_hooks:1630 with post_commit_hooks:
1631 machine.delete()1631 machine.delete()
1632 self.assertIsNotNone(reload_object(vm))1632 self.assertIsNone(reload_object(vm))
16331633
1634 def test_delete_node_deletes_related_interface(self):1634 def test_delete_node_deletes_related_interface(self):
1635 node = factory.make_Node()1635 node = factory.make_Node()

Subscribers

People subscribed via source and target branches