Skip to content

Commit 7160e7d

Browse files
committed
Choose pxe interface based on order of preference of interfaces found
1 parent 489492f commit 7160e7d

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

python/understack-workflows/understack_workflows/main/enroll_server.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from understack_workflows.bmc_credentials import set_bmc_password
1212
from understack_workflows.bmc_hostname import bmc_set_hostname
1313
from 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
1515
from understack_workflows.helpers import setup_logger
1616

1717
logger = 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+
101126
def argument_parser():
102127
parser = argparse.ArgumentParser(
103128
prog=os.path.basename(__file__), description="Ingest Baremetal Node"

0 commit comments

Comments
 (0)