Skip to content

Commit f9ddbee

Browse files
committed
Choose pxe interface based on order of preference of interfaces found
1 parent 6327f97 commit f9ddbee

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

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

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33
import os
44
from pprint import pformat
55

6-
76
from understack_workflows import ironic_node
87
from understack_workflows.bmc import Bmc
98
from understack_workflows.bmc import bmc_for_ip_address
109
from 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
1113
from understack_workflows.bmc_credentials import set_bmc_password
1214
from understack_workflows.bmc_hostname import bmc_set_hostname
1315
from understack_workflows.bmc_settings import update_dell_drac_settings
14-
from understack_workflows.bmc_chassis_info import chassis_info
1516
from understack_workflows.helpers import setup_logger
1617

1718
logger = 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+
101127
def argument_parser():
102128
parser = argparse.ArgumentParser(
103129
prog=os.path.basename(__file__), description="Ingest Baremetal Node"

0 commit comments

Comments
 (0)