feat: a bmc driver that takes the best of Redfish and IPMI (0.4.0)

bmc (napalm_redfish.bmc:BmcDriver) reads a BMC over Redfish where it
answers. A BMC that refuses Redfish (no license) is read and switched over
IPMI. A getter that fails over Redfish is asked over IPMI where IPMI has it;
IPMI is opened only then. Power control goes over Redfish when it answers,
and a refusal is final. The BMC is reset over Redfish only. Same account
for both; ipmi_port in optional_args.

Discovery suggests bmc for a BMC it finds: the fingerprint rules moved from
RedfishDriver to BmcDriver.
This commit is contained in:
Christian Manivong committed 2026-10-17 10:34:20 +02:00
1 parent adf152ee12
commit e9ad7951cd
9 files changed
+412 -23

No files matched your search

+14
View File
@@ -45,3 +45,17 @@ Via `pyghmi`: device ID and FRU data for `get_facts`, sensor data repository for
via ACPI, `ForceOff` → power down, `ForceRestart` → hard reset). IPMI has no graceful
restart, and pyghmi offers no power cycle, so `get_power_state` never offers those two.
No BMC reset over IPMI.
## Redfish and IPMI together (`bmc` entry point)
`BmcDriver` holds a `RedfishDriver` and an `IpmiDriver` for the same BMC and account:
| Situation | Used |
|---|---|
| Redfish answers | Redfish for every getter; IPMI is not opened |
| A getter fails over Redfish (`RedfishError`, `ConnectionException`) | that getter over IPMI, if IPMI has it (Redfish-only getters re-raise) |
| The service root refuses Redfish for want of a license, or Redfish does not answer | IPMI for everything; Redfish-only getters raise `NotImplementedError` |
| `set_power_state` | Redfish when it answers; a refusal (`RuntimeError`) is final |
| `reboot_host` | Redfish only (`Manager.Reset`) |
| `get_management_protocols` over IPMI | `{"ipmi": {"enabled": True, "port": 623}}` |