Merge ~troyanov/maas:backport-cfb432e-3.3 into maas:3.3

Proposed by Anton Troyanov
Status: Merged
Approved by: Anton Troyanov
Approved revision: f55eca3c46e25df39ee767462632418e549bbed4
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~troyanov/maas:backport-cfb432e-3.3
Merge into: maas:3.3
Diff against target: 106 lines (+66/-2)
2 files modified
src/maasserver/api/tests/test_machine.py (+64/-2)
src/maasserver/models/node.py (+2/-0)
Reviewer Review Type Date Requested Status
Anton Troyanov Approve
MAAS Lander Approve
Review via email: mp+453658@code.launchpad.net

Commit message

fix: force save model object changes

Resolves LP:2015411 StaticIPAddress matching query does not exist

(cherry picked from commit cfb432e6e41ab097950c9550b5c61d3ca6d6bbb2)

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

UNIT TESTS
-b backport-cfb432e-3.3 lp:~troyanov/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: f55eca3c46e25df39ee767462632418e549bbed4

review: Approve
Revision history for this message
Anton Troyanov (troyanov) wrote :

Self-approve backport

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/api/tests/test_machine.py b/src/maasserver/api/tests/test_machine.py
2index a2bd82c..459f1a2 100644
3--- a/src/maasserver/api/tests/test_machine.py
4+++ b/src/maasserver/api/tests/test_machine.py
5@@ -73,10 +73,14 @@ from maastesting.matchers import (
6 MockNotCalled,
7 )
8 from metadataserver.builtin_scripts import load_builtin_scripts
9+from metadataserver.builtin_scripts.tests import test_hooks
10 from metadataserver.enum import SCRIPT_TYPE
11-from metadataserver.models import NodeKey, NodeUserData
12+from metadataserver.models import NodeKey, NodeUserData, ScriptSet
13 from metadataserver.nodeinituser import get_node_init_user
14-from provisioningserver.refresh.node_info_scripts import NODE_INFO_SCRIPTS
15+from provisioningserver.refresh.node_info_scripts import (
16+ COMMISSIONING_OUTPUT_NAME,
17+ NODE_INFO_SCRIPTS,
18+)
19 from provisioningserver.utils.enum import map_enum
20
21
22@@ -3565,6 +3569,64 @@ class TestRestoreNetworkingConfiguration(APITestCase.ForUser):
23 self.assertThat(mock_set_initial_networking_config, MockCalledOnce())
24 self.assertThat(mock_restore_network_interfaces, MockCalledOnce())
25
26+ def test_restore_networking_configuration_no_gateway_link_ipv4_conflict(
27+ self,
28+ ):
29+ # See also LP#2015411
30+ self.become_admin()
31+ machine = factory.make_Machine_with_Interface_on_Subnet(
32+ status=NODE_STATUS.READY
33+ )
34+
35+ lxd_script = factory.make_Script(
36+ name=COMMISSIONING_OUTPUT_NAME,
37+ script_type=SCRIPT_TYPE.COMMISSIONING,
38+ )
39+ commissioning_script_set = (
40+ ScriptSet.objects.create_commissioning_script_set(
41+ machine, scripts=[lxd_script.name]
42+ )
43+ )
44+ machine.current_commissioning_script_set = commissioning_script_set
45+ output = test_hooks.make_lxd_output_json()
46+ factory.make_ScriptResult(
47+ script_set=commissioning_script_set,
48+ script=lxd_script,
49+ exit_status=0,
50+ output=output,
51+ stdout=output,
52+ )
53+ # Create NUMA nodes.
54+ test_hooks.create_numa_nodes(machine)
55+
56+ interface = factory.make_Interface(
57+ INTERFACE_TYPE.PHYSICAL, node=machine
58+ )
59+ network = factory.make_ipv4_network()
60+ subnet = factory.make_Subnet(cidr=str(network.cidr))
61+
62+ link_v4 = factory.make_StaticIPAddress(
63+ alloc_type=IPADDRESS_TYPE.STICKY,
64+ ip=factory.pick_ip_in_network(network),
65+ subnet=subnet,
66+ interface=interface,
67+ )
68+ machine.gateway_link_ipv4 = link_v4
69+ machine.save()
70+
71+ machine.restore_network_interfaces()
72+ machine.set_initial_networking_configuration()
73+
74+ response = self.client.post(
75+ self.get_machine_uri(machine),
76+ {"op": "restore_networking_configuration"},
77+ )
78+
79+ self.assertEqual(http.client.OK, response.status_code)
80+ self.assertEqual(
81+ machine.system_id, json_load_bytes(response.content)["system_id"]
82+ )
83+
84 def test_restore_networking_configuration_requires_admin(self):
85 machine = factory.make_Machine()
86 response = self.client.post(
87diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py
88index e1c6923..37c8a71 100644
89--- a/src/maasserver/models/node.py
90+++ b/src/maasserver/models/node.py
91@@ -4792,6 +4792,7 @@ class Node(CleanSave, TimestampedModel):
92 update_node_network_information(
93 self, data, NUMANode.objects.filter(node=self)
94 )
95+ self.save()
96
97 def get_commissioning_resources(self):
98 script = self.current_commissioning_script_set.find_script_result(
99@@ -4852,6 +4853,7 @@ class Node(CleanSave, TimestampedModel):
100 continue
101 if interface.enabled:
102 interface.ensure_link_up()
103+ self.save()
104
105 def set_networking_configuration_from_node(self, source_node):
106 """Set the networking configuration for this node from the source

Subscribers

People subscribed via source and target branches