Commit Graph
15 Commits
Author SHA1 Message Date
Christian Manivong b08ae66318 chore(release): 0.6.0
driver / standard (pull_request) Successful in 13s
driver / lint (pull_request) Successful in 11s
driver / types (pull_request) Successful in 46s
driver / test (3.10) (pull_request) Successful in 51s
driver / test (3.11) (pull_request) Successful in 50s
driver / test (3.12) (pull_request) Successful in 50s
driver / test (3.13) (pull_request) Successful in 45s
driver / lowest (pull_request) Successful in 24s
driver / security (pull_request) Successful in 49s
driver / build (pull_request) Successful in 22s
CI / driver (pull_request) Successful in 6m1s
driver / publish (pull_request) Skipped
2026-10-23 10:29:00 +02:00
Christian Manivong 8dac2e67dd chore: adopt the NAPALM driver standard
driver / standard (pull_request) Successful in 13s
driver / lint (pull_request) Successful in 11s
driver / types (pull_request) Successful in 46s
driver / test (3.10) (pull_request) Successful in 51s
driver / test (3.11) (pull_request) Successful in 55s
driver / test (3.12) (pull_request) Successful in 49s
driver / test (3.13) (pull_request) Successful in 43s
driver / lowest (pull_request) Successful in 26s
driver / security (pull_request) Successful in 49s
driver / build (pull_request) Successful in 22s
CI / driver (pull_request) Successful in 6m5s
driver / publish (pull_request) Skipped
- CI arrives in .gitea/workflows/ci.yml and calls the shared driver
  workflow of NAPALM/driver-standard; the repo had none before.
- setuptools>=77 and the SPDX license string PEP 639 wants, without the
  License classifier; py.typed; Repository, Issues and Changelog links on
  git.netork.io; napalm-device-types>=4.21.1 from PyPI.
- True floors, found by running the tests at them: redfish>=3.4.1 (older
  releases return no response with max_retry=0) and pyghmi>=1.5.1 (1.5.0
  imports python-dateutil without declaring it).
- The test extra becomes the dev extra of the standard, plus responses,
  which the tests mock the BMC with. pytest puts the repo root on the
  path, so tests.conftest also imports under a bare pytest.
- mypy strict; exempt for now (50 errors, most of them getters returning
  dicts where the role declares TypedDicts): napalm_redfish.bmc, .driver,
  .ipmi, .transport and parsers.common, .environment, .manager, .system.
  They are recorded in tests/quality_baseline.json with seven functions
  over complexity 10.
- Coverage floor 94 % (measured 94.27 %).
- The README's development steps install from PyPI.
2026-10-23 08:46:19 +02:00
Christian Manivong 09029ca0a4 style: ruff format and the lint rules of the driver standard
Mechanical: ruff format, and ruff check --fix with the rule set every NAPALM
driver uses (E, F, I, UP, B at line length 100, Python 3.10). Mapping and
Iterable come from collections.abc, imports are sorted. What ruff cannot
fix comes in the next commit.
2026-10-23 08:39:45 +02:00
Christian Manivong 5b24675a12 feat: report the licenses a BMC asks for as facts (0.5.0)
get_licenses (napalm-device-types LicenseMixin, 4.15) on redfish and bmc,
for NetOrk/netork#1111.

- A BMC that refuses Redfish altogether reports each license it names as
  missing, with its message.
- One that answers but withholds parts reports the license with withholds,
  e.g. DCMS withholding drives and the firmware inventory on an X10 with
  only SFT-OOB-LIC.
- ipmi knows no licenses.

get_device_warnings keeps its two codes until netOrk derives them.
2026-10-17 11:32:59 +02:00
Christian Manivong e9ad7951cd 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.
2026-10-17 10:34:20 +02:00
Christian Manivong adf152ee12 fix: read a Supermicro X10 with only the OOB license over Redfish (0.3.1)
First run against real hardware over Redfish: an X10DRL-i (BMC 3.91) with
SFT-OOB-LIC. Its Redfish tree is recorded under
tests/fixtures/supermicro-x10drl-i-3.91/redfish, scrubbed.

- A resource refused for want of a further license (403 OemLicenseNotPassed)
  no longer fails the getter. Storage then falls back to SimpleStorage. The
  firmware list falls back to the BMC and BIOS versions when UpdateService
  is withheld.
- get_device_warnings reports bmc_license_partial with the licenses and the
  withheld parts (drives, firmware inventory).
- A placeholder system model ("Super Server") is replaced by the board
  (PartNumber, else the chassis model).
2026-10-17 09:32:09 +02:00
Christian Manivong 6c60f7ac60 feat: switch the server's power over IPMI (0.3.0)
IpmiDriver.set_power_state sends an IPMI chassis control: On, GracefulShutdown,
ForceOff and ForceRestart. get_power_state now offers what fits the server's
state: On when it is off, the other three when it is on. IPMI has no graceful
restart and pyghmi offers no power cycle, so neither is offered. The driver
still does not reset the BMC.

For boards that offer nothing but IPMI, such as a Supermicro X10 without a
Redfish license.
2026-10-17 01:04:43 +02:00
christianmanivong 0e38e18e26 fix: IPMI polls after the first failed; BMC drivers collect SNMP health (0.2.1)
The second IPMI poll of a BMC in the same worker process failed with
"'<' not supported between instances of 'float' and 'NoneType'".
pyghmi files a session in Session.initting_sessions under the
credentials as str and deletes it only under bytes, so the entry stays
and the next Command got the old, logged-out session back. The driver
drops that entry itself before open() and after close(). Reproduced and
verified live against the Supermicro X10DRL-i: three polls in one
process now succeed.

IpmiDriver and RedfishDriver mix in HealthMetricsMixin, so netOrk's
SNMP health poll reads the BMC's own load, memory and interfaces where
the BMC runs net-snmp with the UCD-MIB, as the X10's does.
2026-10-13 11:24:29 +02:00
christianmanivong 332e6090a7 feat: read-only IPMI driver; report a missing Redfish license (0.2.0)
A Supermicro X10DRL-i refuses Redfish without a license (SUM, DCMS or
OOB), even the service root. IPMI answers without one.

- New entry point `ipmi` (napalm_redfish.ipmi.IpmiDriver) on
  ManagementControllerDriver, over pyghmi: facts and inventory from the
  FRU (serial number, system UUID), the BMC's LAN interface, sensors
  (temperatures, fans, power supplies), the power state, the event log
  and the BMC firmware. Read-only: no power control, no BMC reset.
  Tested against recordings of the X10 with serials, the UUID, MACs and
  IPs replaced.
- RedfishDriver.open() no longer fails on a license refusal: get_facts
  returns what is known without Redfish, get_device_warnings reports
  bmc_license_required with the licenses the BMC names, every other
  getter raises. netOrk then shows the reason instead of an offline BMC.
- IpmiDriver is not exported from the package: NAPALM's own
  get_network_driver("redfish") takes the first driver class of
  napalm_redfish.
2026-10-13 10:53:51 +02:00
christianmanivong bfbeb19255 fix: group alternative fingerprint rules (0.1.2)
One Redfish answer (the service root or the error a service refuses it
with) and one landing page (Supermicro/ATEN, iDRAC or iLO) can match,
never all of them. Grouped, the driver's maximum in netOrk's discovery
is 21 instead of 41, and a Supermicro landing page alone (6 of 21)
outranks the "linux" its BMC reports over SNMP (5 of 18).

Requires napalm-device-types 4.8 for FingerprintRule.group.
2026-10-13 10:19:56 +02:00
christianmanivong 93bbc63f3d fix: stop scoring every HTTPS port as a BMC; name the missing license
netOrk's discovery took six switches for BMCs: the PortSpec for 443
added 5 points to every device with a web UI, and nothing else scored
them. The port now carries no weight.

The real BMC, a Supermicro X10DRL-i, was not recognised at all. Its web
UI (ATEN firmware) gets a rule, as do iDRAC and iLO; discovery fetches
those landing pages today. A rule for a Redfish error body covers the
service root once discovery reads it.

That board refuses Redfish without a Supermicro license, even the
service root (403 OemLicenseNotPassed, "SUM DCMS OOB"). The library
reports only the status, so open() reads the error body once more and
raises RedfishLicenseError naming the licenses.

Release 0.1.1.
2026-10-13 09:58:40 +02:00
Christian Manivong 2090b1cf8c Release 0.1.0 2026-10-13 05:13:45 +00:00
Christian Manivong 05731d4b0f Require napalm-device-types 4.7 2026-10-13 05:10:02 +00:00
Christian Manivong 42940d7e90 Add RedfishDriver on ManagementControllerDriver
The redfish driver implements get_facts, get_interfaces, get_interfaces_ip, get_environment, get_users, get_ntp_servers and get_snmp_information for the BMC, and the role methods get_power_state, set_power_state, get_hardware_inventory, get_event_log, get_firmware_inventory and get_management_protocols for the managed server. reboot_host resets the BMC through Manager.Reset, never the server.

Registered as the napalm.drivers entry point redfish; depends on napalm and napalm-device-types >= 4.6.
2026-10-13 05:02:58 +00:00
Christian Manivong 17d515d035 Add package skeleton
pyproject.toml (Apache-2.0, Python >= 3.10, depends on the DMTF redfish library) and an empty napalm_redfish package. No napalm.drivers entry point yet: the driver class waits for the ManagementControllerDriver role base.
2026-10-12 23:42:14 +00:00