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.
74 lines
2.6 KiB
Python
74 lines
2.6 KiB
Python
"""What netOrk's discovery scores the driver on, checked against recorded pages.
|
|
|
|
netOrk lowercases the page (title, Server header, body) and matches each rule's
|
|
pattern as a substring; a port that answers adds its PortSpec weight.
|
|
"""
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
from napalm_redfish import RedfishDriver
|
|
from napalm_redfish.bmc import BmcDriver
|
|
from napalm_redfish.ipmi import IpmiDriver
|
|
|
|
X10 = Path(__file__).parent / "fixtures" / "supermicro-x10drl-i-3.91"
|
|
|
|
|
|
def _score(text: str) -> float:
|
|
text = " ".join(text.lower().split())
|
|
return sum(rule.weight for rule in BmcDriver.HTTP_FINGERPRINT if rule.pattern in text)
|
|
|
|
|
|
def test_discovery_suggests_the_bmc_driver_only():
|
|
# bmc works with and without a license; two drivers on the same rules would tie.
|
|
assert BmcDriver.HTTP_FINGERPRINT
|
|
assert RedfishDriver.HTTP_FINGERPRINT == []
|
|
assert not RedfishDriver.PORT_SPECS
|
|
assert IpmiDriver.HTTP_FINGERPRINT == []
|
|
|
|
|
|
def test_an_open_https_port_proves_nothing():
|
|
# Every switch with a web UI answers on 443; the port alone made six of
|
|
# them look like BMCs.
|
|
assert [spec.weight for spec in BmcDriver.PORT_SPECS if spec.port == 443] == [0.0]
|
|
|
|
|
|
def test_service_root_is_still_probed():
|
|
assert any("/redfish/v1/" in spec.paths for spec in BmcDriver.PORT_SPECS)
|
|
|
|
|
|
def test_supermicro_landing_page_is_recognised():
|
|
assert _score((X10 / "landing_page.html").read_text()) >= 6.0
|
|
|
|
|
|
def test_redfish_error_body_is_recognised():
|
|
# An unlicensed X10 refuses even the service root, but the refusal is
|
|
# unmistakably Redfish.
|
|
assert _score(json.dumps(json.loads((X10 / "service_root_403.json").read_text()))) >= 6.0
|
|
|
|
|
|
def test_idrac_and_ilo_landing_pages_are_recognised():
|
|
assert _score("<title>iDRAC9 - Login</title>") >= 6.0
|
|
assert _score("<title>iLO 5</title> HPE Integrated Lights-Out") >= 6.0
|
|
|
|
|
|
def test_a_switch_page_scores_nothing():
|
|
page = "<html><head><title>Loading...</title></head><body>Web Switch</body></html>"
|
|
assert _score(page) == 0.0
|
|
|
|
|
|
def test_alternatives_count_once_towards_the_maximum():
|
|
# One Redfish answer (service root or error), the service root's type marker, and one
|
|
# landing page: 10 + 5 + 6. Summing every alternative (41) let a bare "linux" in the
|
|
# BMC's SNMP sysDescr (5 of 18) beat the Supermicro landing page (6 of 41).
|
|
from napalm_device_types import rules_max_weight
|
|
|
|
assert rules_max_weight(BmcDriver.HTTP_FINGERPRINT) == 21.0
|
|
|
|
|
|
def test_supermicro_landing_page_alone_outranks_a_linux_sysdescr():
|
|
from napalm_device_types import rules_max_weight
|
|
|
|
page = _score((X10 / "landing_page.html").read_text())
|
|
assert page / rules_max_weight(BmcDriver.HTTP_FINGERPRINT) > 5.0 / 18.0
|