Skip to content

Commit d4347d9

Browse files
committed
Choose pxe interface based on order of preference of interfaces found
1 parent 21d0502 commit d4347d9

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

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

Lines changed: 30 additions & 5 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,28 +77,52 @@ 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,
9295
name=device_name,
9396
manufacturer=device_info.manufacturer,
9497
)
95-
logger.info("%s _ironic_provision_state=%s", device_name, node.provision_state)
9698
logger.info("%s complete for %s", __file__, bmc.ip_address)
9799

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)