1111from understack_workflows .bmc_credentials import set_bmc_password
1212from understack_workflows .bmc_hostname import bmc_set_hostname
1313from understack_workflows .bmc_settings import update_dell_drac_settings
14- from understack_workflows .bmc_chassis_info import chassis_info
14+ from understack_workflows .bmc_chassis_info import ChassisInfo , InterfaceInfo , chassis_info
1515from understack_workflows .helpers import setup_logger
1616
1717logger = setup_logger (__name__ )
@@ -76,16 +76,18 @@ def enroll_server(bmc: Bmc, old_password: str | None) -> str:
7676
7777 device_info = chassis_info (bmc )
7878 logger .info ("Discovered %s" , pformat (device_info ))
79-
8079 device_name = f"{ device_info .manufacturer } -{ device_info .serial_number } "
8180
8281 update_dell_drac_settings (bmc )
8382
8483 bmc_set_hostname (bmc , device_info .bmc_hostname , device_name )
8584
85+ pxe_interface = guess_pxe_interface (device_info )
86+ logger .info ("Selected %s as PXE interface" , pxe_interface )
87+
8688 # Note the above may require a restart of the DRAC, which in turn may delete
8789 # any pending BIOS jobs, so do BIOS settings after the DRAC settings.
88- update_dell_bios_settings (bmc )
90+ update_dell_bios_settings (bmc , pxe_interface = pxe_interface )
8991
9092 node = ironic_node .create_or_update (
9193 bmc = bmc ,
@@ -98,6 +100,29 @@ def enroll_server(bmc: Bmc, old_password: str | None) -> str:
98100 return node .uuid
99101
100102
103+ def guess_pxe_interface (device_info : ChassisInfo ) -> str :
104+ interface = max (device_info .interfaces , key = _pxe_preference )
105+ return interface .name
106+
107+
108+ def _pxe_preference (interface : InterfaceInfo ) -> int :
109+ name = interface .name .upper ()
110+ if "DRAC" in name or "ILO" in name or "NIC.EMBEDDED" in name :
111+ return 0
112+
113+ NIC_PREFERENCE = {
114+ "NIC.Integrated.1-1-1" : 100 ,
115+ "NIC.Integrated.1-1" : 99 ,
116+ "NIC.Slot.1-1-1" : 98 ,
117+ "NIC.Slot.1-1" : 97 ,
118+ "NIC.Integrated.1-2-1" : 96 ,
119+ "NIC.Integrated.1-2" : 95 ,
120+ "NIC.Slot.1-2-1" : 94 ,
121+ "NIC.Slot.1-2" : 93 ,
122+ }
123+ return NIC_PREFERENCE .get (interface .name , 50 )
124+
125+
101126def argument_parser ():
102127 parser = argparse .ArgumentParser (
103128 prog = os .path .basename (__file__ ), description = "Ingest Baremetal Node"
0 commit comments