Merge ~bjornt/maas:bug-2056740-3.5 into maas:3.5

Proposed by Björn Tillenius
Status: Merged
Approved by: Björn Tillenius
Approved revision: 3469f13b0842b909f1099b2a97d6394372aef645
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~bjornt/maas:bug-2056740-3.5
Merge into: maas:3.5
Diff against target: 255 lines (+8/-74)
4 files modified
src/maasserver/models/node.py (+0/-11)
src/maasserver/models/tests/test_node.py (+0/-11)
src/provisioningserver/drivers/power/amt.py (+5/-23)
src/provisioningserver/drivers/power/tests/test_amt.py (+3/-29)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Björn Tillenius Approve
Review via email: mp+462333@code.launchpad.net

Commit message

Bug #2056740: Can't commission/deploy AMT machines

The maas-power script was passed "--boot-mode pxe" for AMT machines
and failed, since such a parameter wasn't defined.

All other power drivers, including the newer AMT one, sets PXE boot every
time the machine is powered on. I changed things, so that "boot-mode" is
no longer passed, and the older AMT driver also sets the machine to PXE
boot whenever it's turned on.

(cherry picked from commit 116ccedb102a78136d9e1d62d3144850e861947e)

To post a comment you must log in.
Revision history for this message
Björn Tillenius (bjornt) wrote :

Self-approve backport.

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

UNIT TESTS
-b bug-2056740-3.5 lp:~bjornt/maas/+git/maas into -b 3.5 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 3469f13b0842b909f1099b2a97d6394372aef645

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py
2index e34f5d4..e9a3ac2 100644
3--- a/src/maasserver/models/node.py
4+++ b/src/maasserver/models/node.py
5@@ -3134,17 +3134,6 @@ class Node(CleanSave, TimestampedModel):
6 if self.bmc is not None and self.bmc.power_type == "ipmi":
7 power_params.setdefault("power_off_mode", "")
8
9- # boot_mode is something that tells the template whether this is
10- # a PXE boot or a local HD boot.
11- if self.bmc is not None and self.bmc.power_type == "amt":
12- if (
13- self.status == NODE_STATUS.DEPLOYED
14- or self.node_type != NODE_TYPE.MACHINE
15- ):
16- power_params["boot_mode"] = "local"
17- else:
18- power_params["boot_mode"] = "pxe"
19-
20 return power_params
21
22 def get_effective_power_info(self):
23diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
24index 6195c28..5802bf5 100644
25--- a/src/maasserver/models/tests/test_node.py
26+++ b/src/maasserver/models/tests/test_node.py
27@@ -1579,17 +1579,6 @@ class TestNode(MAASServerTestCase):
28 params = node.get_effective_power_parameters()
29 self.assertEqual("qemu://localhost/system", params["power_address"])
30
31- def test_get_effective_power_parameters_sets_local_boot_mode(self):
32- node = factory.make_Node(status=NODE_STATUS.DEPLOYED, power_type="amt")
33- params = node.get_effective_power_parameters()
34- self.assertEqual("local", params["boot_mode"])
35-
36- def test_get_effective_power_parameters_sets_pxe_boot_mode(self):
37- status = factory.pick_enum(NODE_STATUS, but_not=[NODE_STATUS.DEPLOYED])
38- node = factory.make_Node(status=status, power_type="amt")
39- params = node.get_effective_power_parameters()
40- self.assertEqual("pxe", params["boot_mode"])
41-
42 def test_get_effective_power_info_is_False_for_unset_power_type(self):
43 node = factory.make_Node(power_type=None)
44 self.assertEqual(
45diff --git a/src/provisioningserver/drivers/power/amt.py b/src/provisioningserver/drivers/power/amt.py
46index 63ecb29..8c7279b 100644
47--- a/src/provisioningserver/drivers/power/amt.py
48+++ b/src/provisioningserver/drivers/power/amt.py
49@@ -178,13 +178,12 @@ class AMTPowerDriver(PowerDriver):
50 cmd: str,
51 ip_address: str,
52 power_pass: str,
53- amttool_boot_mode=None,
54 stdin=None,
55 ) -> bytes:
56 """Perform a command using amttool."""
57 command = ("amttool", ip_address, cmd)
58 if cmd in ("power-cycle", "powerup"):
59- command += (amttool_boot_mode,)
60+ command += ("pxe",)
61 return self._run(command, power_pass, stdin=stdin)
62
63 def _issue_wsman_command(
64@@ -304,17 +303,16 @@ class AMTPowerDriver(PowerDriver):
65 "Got unknown power state from node: %s" % state
66 )
67
68- def amttool_restart(self, ip_address, power_pass, amttool_boot_mode):
69+ def amttool_restart(self, ip_address, power_pass):
70 """Restart the node via amttool."""
71 self._issue_amttool_command(
72 "power_cycle",
73 ip_address,
74 power_pass,
75- amttool_boot_mode=amttool_boot_mode,
76 stdin=b"yes",
77 )
78
79- def amttool_power_on(self, ip_address, power_pass, amttool_boot_mode):
80+ def amttool_power_on(self, ip_address, power_pass):
81 """Power on the node via amttool."""
82 # Try several times. Power commands often fail the first time.
83 for _ in range(10):
84@@ -323,7 +321,6 @@ class AMTPowerDriver(PowerDriver):
85 "powerup",
86 ip_address,
87 power_pass,
88- amttool_boot_mode=amttool_boot_mode,
89 stdin=b"yes",
90 )
91 if self.amttool_query_state(ip_address, power_pass) == "on":
92@@ -413,16 +410,6 @@ class AMTPowerDriver(PowerDriver):
93 else:
94 return "amttool"
95
96- def _get_amttool_boot_mode(self, boot_mode):
97- """Set amttool boot mode."""
98- # boot_mode tells us whether we're pxe booting or local booting.
99- # For local booting, the argument to amttool must be empty
100- # (NOT 'hd', it doesn't work!).
101- if boot_mode == "local":
102- return ""
103- else:
104- return boot_mode
105-
106 def _get_wsman_command(self, *args):
107 base_path = snap.SnapPaths.from_environ().snap or "/"
108 return (
109@@ -455,15 +442,10 @@ class AMTPowerDriver(PowerDriver):
110 power_pass = context.get("power_pass")
111 amt_command = self._get_amt_command(ip_address, power_pass)
112 if amt_command == "amttool":
113- amttool_boot_mode = self._get_amttool_boot_mode(
114- context.get("boot_mode")
115- )
116 if self.amttool_query_state(ip_address, power_pass) == "on":
117- self.amttool_restart(ip_address, power_pass, amttool_boot_mode)
118+ self.amttool_restart(ip_address, power_pass)
119 else:
120- self.amttool_power_on(
121- ip_address, power_pass, amttool_boot_mode
122- )
123+ self.amttool_power_on(ip_address, power_pass)
124 elif amt_command == "wsman":
125 if self.wsman_query_state(ip_address, power_pass) == "on":
126 self.wsman_power_on(ip_address, power_pass, restart=True)
127diff --git a/src/provisioningserver/drivers/power/tests/test_amt.py b/src/provisioningserver/drivers/power/tests/test_amt.py
128index db207d8..4ab4bae 100644
129--- a/src/provisioningserver/drivers/power/tests/test_amt.py
130+++ b/src/provisioningserver/drivers/power/tests/test_amt.py
131@@ -75,7 +75,6 @@ def make_context():
132 "power_address": factory.make_name("power_address"),
133 "ip_address": factory.make_ipv4_address(),
134 "power_pass": factory.make_name("power_pass"),
135- "boot_mode": factory.make_name("boot_mode"),
136 }
137
138
139@@ -245,10 +244,9 @@ class TestAMTPowerDriver(MAASTestCase):
140 amt_power_driver = AMTPowerDriver()
141 ip_address = factory.make_ipv4_address()
142 power_pass = factory.make_name("power_pass")
143- amttool_boot_mode = factory.make_name("amttool_boot_mode")
144 stdin = factory.make_name("stdin").encode("utf-8")
145 cmd = choice(["power-cycle", "powerup"])
146- command = "amttool", ip_address, cmd, amttool_boot_mode
147+ command = "amttool", ip_address, cmd, "pxe"
148 _run_mock = self.patch(amt_power_driver, "_run")
149 _run_mock.return_value = b"output"
150
151@@ -256,7 +254,6 @@ class TestAMTPowerDriver(MAASTestCase):
152 cmd,
153 ip_address,
154 power_pass,
155- amttool_boot_mode=amttool_boot_mode,
156 stdin=stdin,
157 )
158
159@@ -440,20 +437,16 @@ class TestAMTPowerDriver(MAASTestCase):
160 amt_power_driver = AMTPowerDriver()
161 ip_address = factory.make_ipv4_address()
162 power_pass = factory.make_name("power_pass")
163- amttool_boot_mode = factory.make_name("amttool_boot_mode")
164 _issue_amttool_command_mock = self.patch(
165 amt_power_driver, "_issue_amttool_command"
166 )
167
168- amt_power_driver.amttool_restart(
169- ip_address, power_pass, amttool_boot_mode
170- )
171+ amt_power_driver.amttool_restart(ip_address, power_pass)
172
173 _issue_amttool_command_mock.assert_called_once_with(
174 "power_cycle",
175 ip_address,
176 power_pass,
177- amttool_boot_mode=amttool_boot_mode,
178 stdin=b"yes",
179 )
180
181@@ -461,7 +454,6 @@ class TestAMTPowerDriver(MAASTestCase):
182 amt_power_driver = AMTPowerDriver()
183 ip_address = factory.make_ipv4_address()
184 power_pass = factory.make_name("power_pass")
185- amttool_boot_mode = factory.make_name("amttool_boot_mode")
186 _issue_amttool_command_mock = self.patch(
187 amt_power_driver, "_issue_amttool_command"
188 )
189@@ -470,15 +462,12 @@ class TestAMTPowerDriver(MAASTestCase):
190 )
191 amttool_query_state_mock.return_value = "on"
192
193- amt_power_driver.amttool_power_on(
194- ip_address, power_pass, amttool_boot_mode
195- )
196+ amt_power_driver.amttool_power_on(ip_address, power_pass)
197
198 _issue_amttool_command_mock.assert_called_once_with(
199 "powerup",
200 ip_address,
201 power_pass,
202- amttool_boot_mode=amttool_boot_mode,
203 stdin=b"yes",
204 )
205 amttool_query_state_mock.assert_called_once_with(
206@@ -489,7 +478,6 @@ class TestAMTPowerDriver(MAASTestCase):
207 amt_power_driver = AMTPowerDriver()
208 ip_address = factory.make_ipv4_address()
209 power_pass = factory.make_name("power_pass")
210- amttool_boot_mode = factory.make_name("amttool_boot_mode")
211 self.patch(amt_power_driver, "_issue_amttool_command")
212 amttool_query_state_mock = self.patch(
213 amt_power_driver, "amttool_query_state"
214@@ -501,7 +489,6 @@ class TestAMTPowerDriver(MAASTestCase):
215 amt_power_driver.amttool_power_on,
216 ip_address,
217 power_pass,
218- amttool_boot_mode,
219 )
220
221 def test_amttool_power_off_powers_off(self):
222@@ -787,17 +774,6 @@ class TestAMTPowerDriver(MAASTestCase):
223 factory.make_name("power_pass"),
224 )
225
226- def test_get_amttool_boot_mode_local_boot(self):
227- amt_power_driver = AMTPowerDriver()
228- result = amt_power_driver._get_amttool_boot_mode("local")
229- self.assertEqual(result, "")
230-
231- def test_get_ammtool_boot_mode_pxe_booting(self):
232- amt_power_driver = AMTPowerDriver()
233- boot_mode = factory.make_name("boot_mode")
234- result = amt_power_driver._get_amttool_boot_mode(boot_mode)
235- self.assertEqual(result, boot_mode)
236-
237 def test_get_ip_address_returns_ip_address(self):
238 amt_power_driver = AMTPowerDriver()
239 power_address = factory.make_name("power_address")
240@@ -841,7 +817,6 @@ class TestAMTPowerDriver(MAASTestCase):
241 amttool_restart_mock.assert_called_once_with(
242 context["ip_address"],
243 context["power_pass"],
244- context["boot_mode"],
245 )
246
247 def test_power_on_powers_on_with_amttool_when_already_off(self):
248@@ -870,7 +845,6 @@ class TestAMTPowerDriver(MAASTestCase):
249 amttool_power_on_mock.assert_called_once_with(
250 context["ip_address"],
251 context["power_pass"],
252- context["boot_mode"],
253 )
254
255 def test_power_on_powers_on_with_wsman_when_already_on(self):

Subscribers

People subscribed via source and target branches