11import logging
22
3+ import pytest
4+ from ironic .common import exception
35from oslo_utils import uuidutils
46
57from ironic_understack .port_bios_name_hook import PortBiosNameHook
@@ -137,6 +139,7 @@ def test_retaining_physical_network(mocker, caplog):
137139 port = _make_port (
138140 mocker ,
139141 "11:11:11:11:11:11" ,
142+ pxe_enabled = True ,
140143 physical_network = "previous_value" ,
141144 local_link_connection = {
142145 "port_id" : "Ethernet1/19" ,
@@ -156,13 +159,23 @@ def test_retaining_physical_network(mocker, caplog):
156159 assert port .local_link_connection ["port_id" ] == "Ethernet1/19"
157160
158161
159- def test_clears_pxe_on_previously_enabled_port (mocker , caplog ):
160- """Port that was pxe_enabled but no longer matches gets cleared ."""
162+ def test_preserves_pxe_on_post_enroll_ports (mocker , caplog ):
163+ """Post-enrol inspection keeps the existing PXE decision ."""
161164 caplog .set_level (logging .DEBUG )
162165 task = _make_task (mocker , enrolled_pxe_ports = ["NIC.Integrated.1-2-1" ])
163166
164- port1 = _make_port (mocker , "11:11:11:11:11:11" , pxe_enabled = True )
165- port2 = _make_port (mocker , "22:22:22:22:22:22" )
167+ port1 = _make_port (
168+ mocker ,
169+ "11:11:11:11:11:11" ,
170+ pxe_enabled = True ,
171+ physical_network = "f20-1-network" ,
172+ )
173+ port2 = _make_port (
174+ mocker ,
175+ "22:22:22:22:22:22" ,
176+ pxe_enabled = False ,
177+ physical_network = "f20-1-network" ,
178+ )
166179
167180 mocker .patch (
168181 "ironic_understack.port_bios_name_hook.ironic_ports_for_node" ,
@@ -171,28 +184,62 @@ def test_clears_pxe_on_previously_enabled_port(mocker, caplog):
171184
172185 PortBiosNameHook ().__call__ (task , _INVENTORY , {})
173186
174- assert port1 .pxe_enabled is False
175- assert port2 .pxe_enabled is True
187+ assert port1 .pxe_enabled is True
188+ assert port2 .pxe_enabled is False
189+
190+
191+ def test_errors_if_post_enroll_ports_have_no_pxe_enabled_port (mocker , caplog ):
192+ """Post-enrol inspection fails if no PXE-enabled port exists."""
193+ caplog .set_level (logging .DEBUG )
194+ task = _make_task (mocker , enrolled_pxe_ports = ["NIC.Integrated.1-1-1" ])
195+
196+ port1 = _make_port (
197+ mocker ,
198+ "11:11:11:11:11:11" ,
199+ pxe_enabled = False ,
200+ physical_network = "f20-1-network" ,
201+ )
202+ port2 = _make_port (
203+ mocker ,
204+ "22:22:22:22:22:22" ,
205+ pxe_enabled = False ,
206+ physical_network = "f20-1-network" ,
207+ )
208+
209+ mocker .patch (
210+ "ironic_understack.port_bios_name_hook.ironic_ports_for_node" ,
211+ return_value = [port1 , port2 ],
212+ )
213+
214+ with pytest .raises (exception .InvalidNodeInventory , match = "No PXE-enabled ports" ):
215+ PortBiosNameHook ().__call__ (task , _INVENTORY , {})
176216
177217
178218def test_removing_bios_name (mocker , caplog ):
179219 """Port with unknown MAC gets bios_name removed."""
180220 caplog .set_level (logging .DEBUG )
181221 task = _make_task (mocker , enrolled_pxe_ports = ["NIC.Integrated.1-1-1" ])
182222
183- port = _make_port (
223+ unknown_port = _make_port (
184224 mocker ,
185225 "33:33:33:33:33:33" ,
186226 extra = {"bios_name" : "old_name_no_longer_valid" },
187227 name = "original-name" ,
228+ physical_network = "f20-1-network" ,
229+ )
230+ pxe_port = _make_port (
231+ mocker ,
232+ "11:11:11:11:11:11" ,
233+ pxe_enabled = True ,
234+ physical_network = "f20-1-network" ,
188235 )
189236
190237 mocker .patch (
191238 "ironic_understack.port_bios_name_hook.ironic_ports_for_node" ,
192- return_value = [port ],
239+ return_value = [unknown_port , pxe_port ],
193240 )
194241
195242 PortBiosNameHook ().__call__ (task , _INVENTORY , {})
196243
197- assert port .name == "original-name"
198- assert "bios_name" not in port .extra
244+ assert unknown_port .name == "original-name"
245+ assert "bios_name" not in unknown_port .extra
0 commit comments