feat: add ManagementControllerDriver for server BMCs
A role base for baseboard management controllers (Supermicro, Dell iDRAC, HPE iLO, Lenovo XCC), reached over Redfish or IPMI, not SSH. It declares, under TYPE_CHECKING only: get_power_state, set_power_state (Redfish ResetType actions), get_hardware_inventory (CPUs, DIMMs, drives, PSUs, NICs, and the server's serial, system UUID and NIC MACs), get_event_log, get_firmware_inventory and get_management_protocols. reboot_host restarts the BMC itself (Manager.Reset), never the managed server, which goes through set_power_state. No HealthMetricsMixin and no command channel; sensors come through NAPALM's get_environment.
This commit is contained in:
1 parent
dd8977750d
commit
e509445572
7 files changed
+364
-2
No files matched your search
@@ -22,6 +22,7 @@ from napalm_device_types import (
|
||||
DeviceTypeDriver,
|
||||
FirewallDriver,
|
||||
HypervisorDriver,
|
||||
ManagementControllerDriver,
|
||||
MediaDriver,
|
||||
OSDriver,
|
||||
PhoneDriver,
|
||||
@@ -35,6 +36,7 @@ ROLE_BASES = [
|
||||
AccessPointDriver,
|
||||
FirewallDriver,
|
||||
HypervisorDriver,
|
||||
ManagementControllerDriver,
|
||||
MediaDriver,
|
||||
OSDriver,
|
||||
PhoneDriver,
|
||||
@@ -84,6 +86,12 @@ class TestDeclaredMethodsDoNotExistAtRuntime:
|
||||
(ResidentialGatewayDriver, "get_wan_status"),
|
||||
(PhoneDriver, "get_sip_accounts"),
|
||||
(MediaDriver, "get_playback_state"),
|
||||
(ManagementControllerDriver, "get_power_state"),
|
||||
(ManagementControllerDriver, "set_power_state"),
|
||||
(ManagementControllerDriver, "get_hardware_inventory"),
|
||||
(ManagementControllerDriver, "get_event_log"),
|
||||
(ManagementControllerDriver, "get_firmware_inventory"),
|
||||
(ManagementControllerDriver, "get_management_protocols"),
|
||||
],
|
||||
)
|
||||
def test_absent_until_a_driver_implements_it(self, base, method):
|
||||
@@ -139,3 +147,57 @@ class TestRoleIntrospection:
|
||||
|
||||
assert roles_of(Bare) == []
|
||||
assert primary_role_of(Bare) is None
|
||||
|
||||
|
||||
class TestManagementController:
|
||||
"""A BMC is reached over Redfish or IPMI, and it is not the server it manages."""
|
||||
|
||||
def test_role_key_and_transport(self):
|
||||
assert ManagementControllerDriver.ROLE == "management_controller"
|
||||
assert ManagementControllerDriver.USES_SSH is False
|
||||
|
||||
def test_power_actions_are_redfish_reset_types(self):
|
||||
from napalm_device_types import POWER_ACTIONS
|
||||
|
||||
assert POWER_ACTIONS == (
|
||||
"On",
|
||||
"GracefulShutdown",
|
||||
"ForceOff",
|
||||
"GracefulRestart",
|
||||
"ForceRestart",
|
||||
"PowerCycle",
|
||||
)
|
||||
|
||||
def test_carries_neither_snmp_health_metrics_nor_a_command_channel(self):
|
||||
"""Health metrics are SNMP; the BMC's sensors come through get_environment."""
|
||||
from napalm_device_types import HealthMetricsMixin
|
||||
|
||||
assert not issubclass(ManagementControllerDriver, HealthMetricsMixin)
|
||||
assert not hasattr(ManagementControllerDriver, "get_health_metrics")
|
||||
assert not hasattr(ManagementControllerDriver, "run_command")
|
||||
assert not hasattr(ManagementControllerDriver, "open_stream")
|
||||
|
||||
def test_docstring_says_reboot_host_restarts_the_bmc_not_the_server(self):
|
||||
doc = ManagementControllerDriver.__doc__ or ""
|
||||
assert "reboot_host" in doc and "Manager.Reset" in doc
|
||||
assert "set_power_state" in doc
|
||||
assert "get_environment" in doc
|
||||
|
||||
def test_its_return_types_are_exported(self):
|
||||
import napalm_device_types as package
|
||||
|
||||
for name in (
|
||||
"PowerAction",
|
||||
"PowerStateDict",
|
||||
"HardwareInventoryDict",
|
||||
"EventLogEntryDict",
|
||||
"FirmwareDict",
|
||||
"ManagementProtocolsDict",
|
||||
):
|
||||
assert name in package.__all__ and hasattr(package, name), name
|
||||
|
||||
def test_a_server_driver_can_rank_it_first(self):
|
||||
class Idrac(ManagementControllerDriver):
|
||||
pass
|
||||
|
||||
assert primary_role_of(Idrac) == "management_controller"
|
||||
@@ -5,6 +5,7 @@ from napalm_device_types import (
|
||||
AccessPointDriver,
|
||||
FirewallDriver,
|
||||
HypervisorDriver,
|
||||
ManagementControllerDriver,
|
||||
OSDriver,
|
||||
ResidentialGatewayDriver,
|
||||
StorageDriver,
|
||||
@@ -16,6 +17,7 @@ BASE_CLASSES = [
|
||||
(AccessPointDriver, "Access Point"),
|
||||
(FirewallDriver, "Firewall"),
|
||||
(HypervisorDriver, "Hypervisor"),
|
||||
(ManagementControllerDriver, "Management Controller"),
|
||||
(OSDriver, "OS"),
|
||||
(ResidentialGatewayDriver, "Gateway"),
|
||||
(StorageDriver, "Storage"),
|
||||
|
||||
Reference in new issue
Block a user