|
3 | 3 | import os |
4 | 4 | from pprint import pformat |
5 | 5 |
|
6 | | - |
7 | 6 | from understack_workflows import ironic_node |
8 | 7 | from understack_workflows.bmc import Bmc |
9 | 8 | from understack_workflows.bmc import bmc_for_ip_address |
10 | 9 | 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 |
11 | 13 | from understack_workflows.bmc_credentials import set_bmc_password |
12 | 14 | from understack_workflows.bmc_hostname import bmc_set_hostname |
13 | 15 | from understack_workflows.bmc_settings import update_dell_drac_settings |
14 | | -from understack_workflows.bmc_chassis_info import chassis_info |
15 | 16 | from understack_workflows.helpers import setup_logger |
16 | 17 |
|
17 | 18 | logger = setup_logger(__name__) |
@@ -76,28 +77,52 @@ def enroll_server(bmc: Bmc, old_password: str | None) -> str: |
76 | 77 |
|
77 | 78 | device_info = chassis_info(bmc) |
78 | 79 | logger.info("Discovered %s", pformat(device_info)) |
79 | | - |
80 | 80 | device_name = f"{device_info.manufacturer}-{device_info.serial_number}" |
81 | 81 |
|
82 | 82 | update_dell_drac_settings(bmc) |
83 | 83 |
|
84 | 84 | bmc_set_hostname(bmc, device_info.bmc_hostname, device_name) |
85 | 85 |
|
| 86 | + pxe_interface = guess_pxe_interface(device_info) |
| 87 | + logger.info("Selected %s as PXE interface", pxe_interface) |
| 88 | + |
86 | 89 | # Note the above may require a restart of the DRAC, which in turn may delete |
87 | 90 | # 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) |
89 | 92 |
|
90 | 93 | node = ironic_node.create_or_update( |
91 | 94 | bmc=bmc, |
92 | 95 | name=device_name, |
93 | 96 | manufacturer=device_info.manufacturer, |
94 | 97 | ) |
95 | | - logger.info("%s _ironic_provision_state=%s", device_name, node.provision_state) |
96 | 98 | logger.info("%s complete for %s", __file__, bmc.ip_address) |
97 | 99 |
|
98 | 100 | return node.uuid |
99 | 101 |
|
100 | 102 |
|
| 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 | + |
101 | 126 | def argument_parser(): |
102 | 127 | parser = argparse.ArgumentParser( |
103 | 128 | prog=os.path.basename(__file__), description="Ingest Baremetal Node" |
|
0 commit comments