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:
1 parent
adf152ee12
commit
e9ad7951cd
9 files changed
+412
-23
No files matched your search
+21
-16
@@ -94,6 +94,25 @@ _WITHHELD_ORDER = ("drives", "firmware inventory")
|
||||
#: system "Super Server"; the board is the system's PartNumber and the chassis model.
|
||||
_PLACEHOLDER_MODELS = frozenset({"super server", "default string", "to be filled by o.e.m."})
|
||||
|
||||
#: What discovery recognises a BMC by; the ``bmc`` driver carries them (0.4.0), so a BMC
|
||||
#: found is suggested with the driver that works with and without a license.
|
||||
#: Every Redfish service answers ``GET /redfish/v1/`` without credentials. The port
|
||||
#: itself is worth nothing: every switch with a web UI answers on 443.
|
||||
BMC_PORT_SPECS = [PortSpec("https", 443, ("/redfish/v1/",), weight=0.0)]
|
||||
#: Rules in one group are alternatives and count once towards the maximum
|
||||
#: (napalm-device-types' ``rules_max_weight``).
|
||||
BMC_HTTP_FINGERPRINT = [
|
||||
# The service root, or the error body a service refuses it with (an unlicensed
|
||||
# Supermicro X10 answers 403 with a Redfish error).
|
||||
FingerprintRule("redfishversion", 10.0, group="redfish_answer"),
|
||||
FingerprintRule("@message.extendedinfo", 8.0, group="redfish_answer"),
|
||||
FingerprintRule("#serviceroot.", 5.0),
|
||||
# Landing pages of the BMC web UIs: Supermicro X9-X11 (ATEN firmware), iDRAC, iLO.
|
||||
FingerprintRule("aten international", 6.0, group="landing_page"),
|
||||
FingerprintRule("idrac", 6.0, group="landing_page"),
|
||||
FingerprintRule("integrated lights-out", 6.0, group="landing_page"),
|
||||
]
|
||||
|
||||
|
||||
def _timestamp(created: str | None) -> float | None:
|
||||
"""Unix time of a Redfish ``Created`` value; a time without offset counts as UTC."""
|
||||
@@ -124,22 +143,8 @@ class RedfishDriver(HealthMetricsMixin, ManagementControllerDriver):
|
||||
|
||||
platform = "redfish"
|
||||
DRIVER_NAME = "redfish"
|
||||
#: Every Redfish service answers ``GET /redfish/v1/`` without credentials. The port
|
||||
#: itself is worth nothing: every switch with a web UI answers on 443.
|
||||
PORT_SPECS = [PortSpec("https", 443, ("/redfish/v1/",), weight=0.0)]
|
||||
#: Rules in one group are alternatives and count once towards the maximum
|
||||
#: (napalm-device-types' ``rules_max_weight``).
|
||||
HTTP_FINGERPRINT = [
|
||||
# The service root, or the error body a service refuses it with (an unlicensed
|
||||
# Supermicro X10 answers 403 with a Redfish error).
|
||||
FingerprintRule("redfishversion", 10.0, group="redfish_answer"),
|
||||
FingerprintRule("@message.extendedinfo", 8.0, group="redfish_answer"),
|
||||
FingerprintRule("#serviceroot.", 5.0),
|
||||
# Landing pages of the BMC web UIs: Supermicro X9-X11 (ATEN firmware), iDRAC, iLO.
|
||||
FingerprintRule("aten international", 6.0, group="landing_page"),
|
||||
FingerprintRule("idrac", 6.0, group="landing_page"),
|
||||
FingerprintRule("integrated lights-out", 6.0, group="landing_page"),
|
||||
]
|
||||
# No fingerprint of its own: discovery suggests ``bmc`` (BMC_PORT_SPECS and
|
||||
# BMC_HTTP_FINGERPRINT below), which also reads a BMC that refuses Redfish.
|
||||
#: A BMC restart takes a few minutes before Redfish answers again.
|
||||
REBOOT_SETTLE_SECONDS = 180
|
||||
|
||||
|
||||
Reference in new issue
Block a user