33import os
44from pprint import pformat
55
6-
76from understack_workflows import ironic_node
87from understack_workflows .bmc import Bmc
98from understack_workflows .bmc import bmc_for_ip_address
109from understack_workflows .bmc_bios import update_dell_bios_settings
10+ from understack_workflows .bmc_chassis_info import ChassisInfo
11+ from understack_workflows .bmc_chassis_info import InterfaceInfo
12+ from understack_workflows .bmc_chassis_info import chassis_info
1113from understack_workflows .bmc_credentials import set_bmc_password
1214from understack_workflows .bmc_hostname import bmc_set_hostname
1315from understack_workflows .bmc_settings import update_dell_drac_settings
14- from understack_workflows .bmc_chassis_info import chassis_info
1516from understack_workflows .helpers import setup_logger
1617
1718logger = setup_logger (__name__ )
@@ -76,16 +77,18 @@ def enroll_server(bmc: Bmc, old_password: str | None) -> str:
7677
7778 device_info = chassis_info (bmc )
7879 logger .info ("Discovered %s" , pformat (device_info ))
79-
8080 device_name = f"{ device_info .manufacturer } -{ device_info .serial_number } "
8181
8282 update_dell_drac_settings (bmc )
8383
8484 bmc_set_hostname (bmc , device_info .bmc_hostname , device_name )
8585
86+ pxe_interface = guess_pxe_interface (device_info )
87+ logger .info ("Selected %s as PXE interface" , pxe_interface )
88+
8689 # Note the above may require a restart of the DRAC, which in turn may delete
8790 # any pending BIOS jobs, so do BIOS settings after the DRAC settings.
88- update_dell_bios_settings (bmc )
91+ update_dell_bios_settings (bmc , pxe_interface = pxe_interface )
8992
9093 node = ironic_node .create_or_update (
9194 bmc = bmc ,
@@ -98,6 +101,29 @@ def enroll_server(bmc: Bmc, old_password: str | None) -> str:
98101 return node .uuid
99102
100103
104+ def guess_pxe_interface (device_info : ChassisInfo ) -> str :
105+ interface = max (device_info .interfaces , key = _pxe_preference )
106+ return interface .name
107+
108+
109+ def _pxe_preference (interface : InterfaceInfo ) -> int :
110+ name = interface .name .upper ()
111+ if "DRAC" in name or "ILO" in name or "NIC.EMBEDDED" in name :
112+ return 0
113+
114+ NIC_PREFERENCE = {
115+ "NIC.Integrated.1-1-1" : 100 ,
116+ "NIC.Integrated.1-1" : 99 ,
117+ "NIC.Slot.1-1-1" : 98 ,
118+ "NIC.Slot.1-1" : 97 ,
119+ "NIC.Integrated.1-2-1" : 96 ,
120+ "NIC.Integrated.1-2" : 95 ,
121+ "NIC.Slot.1-2-1" : 94 ,
122+ "NIC.Slot.1-2" : 93 ,
123+ }
124+ return NIC_PREFERENCE .get (interface .name , 50 )
125+
126+
101127def argument_parser ():
102128 parser = argparse .ArgumentParser (
103129 prog = os .path .basename (__file__ ), description = "Ingest Baremetal Node"
0 commit comments