From adf152ee1206aefd9e4f750bf140b378c22980ff Mon Sep 17 00:00:00 2001 From: Christian Manivong Date: Sat, 17 Oct 2026 09:32:09 +0200 Subject: [PATCH] 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). --- CHANGELOG.md | 19 + docs/supermicro-x10.md | 14 +- napalm_redfish/__init__.py | 2 +- napalm_redfish/driver.py | 113 ++- napalm_redfish/transport.py | 18 + pyproject.toml | 2 +- .../supermicro-x10drl-i-3.91/COMMANDS.txt | 9 + .../AccountService/Accounts/2/index.json | 18 + .../AccountService/Accounts/index.json | 12 + .../Roles/Administrator/index.json | 20 + .../AccountService/Roles/Operator/index.json | 15 + .../AccountService/Roles/ReadOnly/index.json | 14 + .../redfish/AccountService/Roles/index.json | 18 + .../redfish/AccountService/index.json | 25 + .../redfish/Chassis/1/Power/index.json | 532 ++++++++++++ .../redfish/Chassis/1/Thermal/index.json | 768 ++++++++++++++++++ .../redfish/Chassis/1/index.json | 51 ++ .../redfish/Chassis/index.json | 12 + .../EventService/Subscriptions/index.json | 8 + .../redfish/EventService/index.json | 38 + .../1/ActiveDirectory/RoleGroups/index.json | 8 + .../Managers/1/ActiveDirectory/index.json | 18 + .../1/EthernetInterfaces/1/index.json | 56 ++ .../Managers/1/EthernetInterfaces/index.json | 13 + .../redfish/Managers/1/FanMode/index.json | 14 + .../redfish/Managers/1/IKVM/index.json | 20 + .../1/IPAccessControl/FilterRules/index.json | 8 + .../Managers/1/IPAccessControl/index.json | 11 + .../redfish/Managers/1/LDAP/index.json | 14 + .../redfish/Managers/1/MouseMode/index.json | 13 + .../redfish/Managers/1/NTP/index.json | 11 + .../Managers/1/NetworkProtocol/index.json | 42 + .../redfish/Managers/1/RADIUS/index.json | 11 + .../redfish/Managers/1/SMCRAKP/index.json | 8 + .../redfish/Managers/1/SMTP/index.json | 13 + .../redfish/Managers/1/SNMP/SNMPv2/index.json | 10 + .../redfish/Managers/1/SNMP/SNMPv3/index.json | 21 + .../redfish/Managers/1/SNMP/index.json | 14 + .../Managers/1/SerialInterfaces/1/index.json | 15 + .../Managers/1/SerialInterfaces/index.json | 13 + .../redfish/Managers/1/Snooping/index.json | 8 + .../redfish/Managers/1/Syslog/index.json | 10 + .../redfish/Managers/1/VM1/CfgCD/index.json | 20 + .../redfish/Managers/1/VM1/index.json | 16 + .../redfish/Managers/1/index.json | 119 +++ .../redfish/Managers/index.json | 13 + .../redfish/STATUS.json | 6 + .../redfish/SessionService/index.json | 17 + .../Systems/1/EthernetInterfaces/1/index.json | 15 + .../Systems/1/EthernetInterfaces/2/index.json | 15 + .../Systems/1/EthernetInterfaces/index.json | 16 + .../1/LogServices/Log1/Entries/1/index.json | 35 + .../1/LogServices/Log1/Entries/2/index.json | 32 + .../1/LogServices/Log1/Entries/index.json | 75 ++ .../Systems/1/LogServices/Log1/index.json | 26 + .../redfish/Systems/1/LogServices/index.json | 13 + .../redfish/Systems/1/Memory/1/index.json | 35 + .../redfish/Systems/1/Memory/2/index.json | 35 + .../redfish/Systems/1/Memory/3/index.json | 35 + .../redfish/Systems/1/Memory/4/index.json | 35 + .../redfish/Systems/1/Memory/5/index.json | 35 + .../redfish/Systems/1/Memory/6/index.json | 35 + .../redfish/Systems/1/Memory/7/index.json | 35 + .../redfish/Systems/1/Memory/8/index.json | 35 + .../redfish/Systems/1/Memory/index.json | 34 + .../redfish/Systems/1/Processors/1/index.json | 28 + .../redfish/Systems/1/Processors/2/index.json | 28 + .../redfish/Systems/1/Processors/index.json | 16 + .../Systems/1/SimpleStorage/index.json | 9 + .../Systems/1/SmcNodeManager/index.json | 62 ++ .../redfish/Systems/1/Storage/index.json | 20 + .../redfish/Systems/1/index.json | 112 +++ .../redfish/Systems/index.json | 13 + .../redfish/TaskService/Tasks/index.json | 8 + .../redfish/TaskService/index.json | 18 + .../redfish/UpdateService/index.json | 20 + .../redfish/index.json | 45 + tests/test_x10_redfish.py | 91 +++ 78 files changed, 3237 insertions(+), 24 deletions(-) create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Accounts/2/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Accounts/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/Administrator/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/Operator/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/ReadOnly/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/Power/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/Thermal/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/EventService/Subscriptions/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/EventService/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/ActiveDirectory/RoleGroups/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/ActiveDirectory/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/EthernetInterfaces/1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/EthernetInterfaces/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/FanMode/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IKVM/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IPAccessControl/FilterRules/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IPAccessControl/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/LDAP/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/MouseMode/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/NTP/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/NetworkProtocol/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/RADIUS/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SMCRAKP/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SMTP/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/SNMPv2/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/SNMPv3/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SerialInterfaces/1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SerialInterfaces/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/Snooping/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/Syslog/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/VM1/CfgCD/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/VM1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/STATUS.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/SessionService/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/2/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/2/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/2/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/3/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/4/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/5/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/6/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/7/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/8/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/2/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/SimpleStorage/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/SmcNodeManager/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Storage/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/TaskService/Tasks/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/TaskService/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/UpdateService/index.json create mode 100644 tests/fixtures/supermicro-x10drl-i-3.91/redfish/index.json create mode 100644 tests/test_x10_redfish.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a39c0d..117c8b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.1] - 2026-10-17 + +First run against real hardware over Redfish: a Supermicro X10DRL-i (BMC 3.91) with the +SFT-OOB-LIC license only, recorded under `tests/fixtures/supermicro-x10drl-i-3.91/redfish/`. + +### Fixed +- A resource the BMC refuses for want of a further license (403 `OemLicenseNotPassed`) no + longer fails the whole getter. The transport raises `RedfishFeatureLicenseError` (a + `RedfishAuthError`); `get_hardware_inventory` reads the drives from `SimpleStorage` + instead of a withheld `Storage`, and `get_firmware_inventory` falls back to the BMC + firmware (`Managers/{id}`) and the BIOS (`Systems/{id}.BiosVersion`) when `UpdateService` + is withheld. +- The model of a system that reports a placeholder ("Super Server" on Supermicro) is the + board: the system's `PartNumber`, else the chassis model. + +### Added +- `get_device_warnings` reports `bmc_license_partial` with the licenses the BMC names and the + parts it withholds (`drives`, `firmware inventory`). + ## [0.3.0] - 2026-10-17 ### Added diff --git a/docs/supermicro-x10.md b/docs/supermicro-x10.md index c3512bb..0e9c650 100644 --- a/docs/supermicro-x10.md +++ b/docs/supermicro-x10.md @@ -33,9 +33,17 @@ curl -sk -u : https:///redfish/v1/Systems/1 | python3 -m js - Older Supermicro BMCs shipped with `ADMIN`/`ADMIN`; newer ones have a unique password on a label. A BMC still on `ADMIN`/`ADMIN` is a test case for netOrk's default-credential audit (NetOrk/netork#141). -- Some out-of-band features (BIOS update and BIOS settings through the BMC) need a - Supermicro license (SFT-OOB-LIC / SFT-DCMS-SINGLE). Reading and power control should not. - Which resources the X10 omits without a license shows up in the recorded responses. +- Verified on the X10DRL-i (3.91): **without any license Redfish is refused altogether**, even + the service root (403 `OemLicenseNotPassed`, naming SUM DCMS OOB). **With SFT-OOB-LIC** + the service root, systems, processors, memory, chassis, thermal, power, managers, network + protocol, accounts and logs answer, and so does `ComputerSystem.Reset`. `Systems/1/Storage` + and `UpdateService` still want DCMS (SFT-DCMS-SINGLE); the driver then reads no drives, + takes the BMC and BIOS versions from `Managers/1` and `Systems/1`, and reports + `bmc_license_partial`. `SimpleStorage` answers but is empty. +- `Systems/1.Model` is "Super Server" on every board; the board is `Systems/1.PartNumber` and + `Chassis/1.Model`, which the driver reports as the model instead. +- The system UUID over Redfish is the server's SMBIOS UUID (MAC-based on the X10), unlike the + IPMI FRU UUID. - Vendor-specific data sits under `Oem.Supermicro` in several resources. ## IPMI on the same board diff --git a/napalm_redfish/__init__.py b/napalm_redfish/__init__.py index afdce1d..8feca5a 100644 --- a/napalm_redfish/__init__.py +++ b/napalm_redfish/__init__.py @@ -7,5 +7,5 @@ takes the first driver class of this package. ``IpmiDriver`` lives in from napalm_redfish.driver import RedfishDriver -__version__ = "0.3.0" +__version__ = "0.3.1" __all__ = ["RedfishDriver"] diff --git a/napalm_redfish/driver.py b/napalm_redfish/driver.py index 2835f2e..2d868a2 100644 --- a/napalm_redfish/driver.py +++ b/napalm_redfish/driver.py @@ -67,6 +67,7 @@ from napalm_redfish.parsers import ( from napalm_redfish.parsers.common import link, link_list, odata_id from napalm_redfish.transport import ( RedfishError, + RedfishFeatureLicenseError, RedfishLicenseError, RedfishNotFound, RedfishTransport, @@ -87,6 +88,11 @@ _PROTOCOLS = { "virtual_media": "VirtualMedia", } _SEVERITIES = ("OK", "Warning", "Critical") +#: The parts a BMC may withhold for want of a license, in the order they are named. +_WITHHELD_ORDER = ("drives", "firmware inventory") +#: Models a system reports when it has none of its own. Supermicro's Redfish calls every +#: 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."}) def _timestamp(created: str | None) -> float | None: @@ -162,6 +168,8 @@ class RedfishDriver(HealthMetricsMixin, ManagementControllerDriver): ) self._cache: _JsonDict = {} self._license_refused: RedfishLicenseError | None = None + #: Parts the BMC withholds for want of a license, with the licenses it names. + self._withheld: dict[str, str] = {} # --- connection ---------------------------------------------------------------------- @@ -171,6 +179,7 @@ class RedfishDriver(HealthMetricsMixin, ManagementControllerDriver): ``get_device_warnings`` says which license is missing. Every other getter raises. """ self._license_refused = None + self._withheld = {} try: self.transport.open() except RedfishLicenseError as exc: @@ -234,6 +243,15 @@ class RedfishDriver(HealthMetricsMixin, ManagementControllerDriver): def _chassis_raw(self) -> _JsonDict: return self._linked_or_first("chassis", "Chassis", "Chassis") + def _server_model(self) -> str: + """The system's model; for a placeholder, the board (PartNumber or chassis model).""" + raw = self._system_raw() + model = (parse_system(raw)["model"] or "").strip() + if model.lower() not in _PLACEHOLDER_MODELS: + return model + board = raw.get("PartNumber") or self._chassis_raw().get("Model") or "" + return str(board).strip() or model + def _members_of(self, resource: _JsonDict, key: str) -> list[_JsonDict]: """Members of the collection ``resource[key]`` links; [] if not linked.""" path = link(resource, key) @@ -271,7 +289,7 @@ class RedfishDriver(HealthMetricsMixin, ManagementControllerDriver): return { "uptime": -1.0, # Redfish has no uptime "vendor": system["manufacturer"] or "", - "model": system["model"] or "", + "model": self._server_model(), "hostname": hostname, "fqdn": fqdn, "os_version": manager["firmware_version"] or "", @@ -355,12 +373,41 @@ class RedfishDriver(HealthMetricsMixin, ManagementControllerDriver): return {"chassis_id": "", "community": communities, "contact": "", "location": ""} def get_device_warnings(self) -> list[_JsonDict]: - """Raw signals for netOrk's warning catalog; presentation is netOrk's.""" + """Raw signals for netOrk's warning catalog; presentation is netOrk's. + + ``bmc_license_required`` when the BMC refuses Redfish altogether; + ``bmc_license_partial`` when it answers but withholds parts (drives, the firmware + inventory) for want of a license. The parts are probed here, so the warning does + not depend on which getters ran before. + """ refused = self._license_refused - if refused is None: + if refused is not None: + return [{"code": "bmc_license_required", + "meta": {"licenses": refused.licenses, "message": refused.detail}}] + self._probe_withheld() + if not self._withheld: return [] - return [{"code": "bmc_license_required", - "meta": {"licenses": refused.licenses, "message": refused.detail}}] + licenses = sorted({name for names in self._withheld.values() for name in names.split()}) + parts = [part for part in _WITHHELD_ORDER if part in self._withheld] + return [{"code": "bmc_license_partial", + "meta": {"licenses": " ".join(licenses), "parts": parts}}] + + def _withhold(self, part: str, exc: RedfishFeatureLicenseError) -> None: + LOG.info("%s: %s withheld by the BMC: %s", self.hostname, part, exc) + self._withheld[part] = exc.licenses + + def _probe_withheld(self) -> None: + """Ask for the license-gated resources once, so ``_withheld`` is complete.""" + storage = link(self._system_raw(), "Storage") + if storage and "drives" not in self._withheld: + try: + self.transport.get(storage) + except RedfishFeatureLicenseError as exc: + self._withhold("drives", exc) + except RedfishError: + pass + if "firmware inventory" not in self._withheld: + self._update_service() # --- role: power ------------------------------------------------------------------- @@ -434,7 +481,7 @@ class RedfishDriver(HealthMetricsMixin, ManagementControllerDriver): system = parse_system(raw) return { "manufacturer": system["manufacturer"] or "", - "model": system["model"] or "", + "model": self._server_model(), "serial_number": system["serial_number"] or "", "system_uuid": (system["uuid"] or "").lower(), "cpus": self._cpus(raw), @@ -471,18 +518,31 @@ class RedfishDriver(HealthMetricsMixin, ManagementControllerDriver): }) return dimms - def _drives(self, system: _JsonDict) -> list[_JsonDict]: + def _storage_drives(self, system: _JsonDict) -> list[_JsonDict] | None: + """Drives from ``Storage``; ``None`` when it is not linked or withheld.""" + if not link(system, "Storage"): + return None + try: + storages = self._members_of(system, "Storage") + except RedfishFeatureLicenseError as exc: + self._withhold("drives", exc) + return None parsed: list[_JsonDict] = [] - if link(system, "Storage"): - seen: set[str] = set() - for storage in self._members_of(system, "Storage"): - for path in parse_storage(storage)["drive_paths"]: - if path not in seen: - seen.add(path) - drive = self.transport.get_optional(path) - if drive is not None: - parsed.append(parse_drive(drive)) - else: + seen: set[str] = set() + for storage in storages: + for path in parse_storage(storage)["drive_paths"]: + if path not in seen: + seen.add(path) + drive = self.transport.get_optional(path) + if drive is not None: + parsed.append(parse_drive(drive)) + return parsed + + def _drives(self, system: _JsonDict) -> list[_JsonDict]: + parsed = self._storage_drives(system) + if parsed is None: + # Older services, and a Supermicro X10 that withholds Storage without DCMS. + parsed = [] for storage in self._members_of(system, "SimpleStorage"): parsed.extend(parse_simple_storage(storage)["drives"]) return [{ @@ -569,10 +629,25 @@ class RedfishDriver(HealthMetricsMixin, ManagementControllerDriver): reverse=True) return entries[:limit] + def _update_service(self) -> _JsonDict | None: + try: + return self._service("UpdateService") + except RedfishFeatureLicenseError as exc: + self._withhold("firmware inventory", exc) + return None + def get_firmware_inventory(self) -> list[_JsonDict]: - service = self._service("UpdateService") + """``UpdateService/FirmwareInventory``. Where the BMC withholds it for want of a + license, the BMC's own firmware and the BIOS, which the manager and the system + state themselves.""" + service = self._update_service() if service is None: - return [] + if "firmware inventory" not in self._withheld: + return [] + bmc = parse_manager(self._manager_raw())["firmware_version"] + bios = self._system_raw().get("BiosVersion") + return [{"name": name, "version": version, "updateable": None} + for name, version in (("BMC", bmc), ("BIOS", bios)) if version] items = [parse_firmware(raw) for raw in self._members_of(service, "FirmwareInventory")] return [{"name": fw["name"] or fw["id"] or "", "version": fw["version"] or "", "updateable": fw["updateable"]} for fw in items] diff --git a/napalm_redfish/transport.py b/napalm_redfish/transport.py index a6596be..bddae5f 100644 --- a/napalm_redfish/transport.py +++ b/napalm_redfish/transport.py @@ -73,6 +73,20 @@ class RedfishAuthError(RedfishError): """Login failed, or the account may not read the resource (HTTP 401/403).""" +class RedfishFeatureLicenseError(RedfishAuthError): + """One resource is refused until a vendor license is activated, the rest answers. + + A Supermicro X10 with only the OOB license reads ``Systems`` and ``Managers`` but + refuses ``Systems/1/Storage`` and ``UpdateService`` for want of DCMS. + """ + + def __init__(self, message: str, *, licenses: str = "", status: int | None = None, + path: str | None = None): + super().__init__(message, status=status, path=path) + #: The licenses the service names, e.g. "DCMS"; empty when it names none. + self.licenses = licenses + + class RedfishHTTPError(RedfishError): """The service answered with an HTTP error status.""" @@ -336,6 +350,10 @@ class RedfishTransport: return data detail = _error_message(data) message = f"{method} {path}: HTTP {status}" + (f": {detail}" if detail else "") + if status == 403 and any(i.endswith(LICENSE_REFUSED) for i in _message_ids(data)): + raise RedfishFeatureLicenseError( + message, licenses=" ".join(" ".join(_message_args(data)).split()), + status=status, path=path) if status in (401, 403): raise RedfishAuthError(message, status=status, path=path) if status == 404: diff --git a/pyproject.toml b/pyproject.toml index 0199e94..29aa678 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "napalm-redfish" -version = "0.3.0" +version = "0.3.1" description = "NAPALM driver for server baseboard management controllers over DMTF Redfish" readme = "README.md" license = { file = "LICENSE" } diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/COMMANDS.txt b/tests/fixtures/supermicro-x10drl-i-3.91/COMMANDS.txt index 8455f11..d182657 100644 --- a/tests/fixtures/supermicro-x10drl-i-3.91/COMMANDS.txt +++ b/tests/fixtures/supermicro-x10drl-i-3.91/COMMANDS.txt @@ -10,3 +10,12 @@ ipmi/ Read over IPMI 2.0 (pyghmi 1.6, lanplus) with a BMC account, 2026-10-13. firmware (get_firmware), inventory (get_inventory), sensors (get_sensor_data, each SensorReading's attributes), health (get_health), event_log (get_event_log). Serial numbers, the system UUID, MAC addresses and IPs are replaced by placeholders. + +redfish/ Read over Redfish with a BMC account on 2026-10-17, after an SFT-OOB-LIC license was + activated (no DCMS). Every resource reachable by @odata.id links from the service root + was fetched with GET, except JsonSchemas, Registries, SessionService/Sessions and + actions: 69 paths, each as /index.json, unmodified apart from + scrubbing. STATUS.json lists the paths that did not answer 200 (Storage and + UpdateService need DCMS; IKVM and the virtual media CfgCD were refused as well); their + files hold the error body the BMC sent. Serial numbers, UUIDs, MAC addresses, IPs, the + host name and the SNMP communities are replaced by placeholders. The server was on. diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Accounts/2/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Accounts/2/index.json new file mode 100644 index 0000000..dbe24e5 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Accounts/2/index.json @@ -0,0 +1,18 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ManagerAccount.ManagerAccount", + "@odata.id": "/redfish/v1/AccountService/Accounts/2", + "@odata.type": "#ManagerAccount.v1_0_0.ManagerAccount", + "Description": "User Account", + "Enabled": true, + "Id": "2", + "Links": { + "Role": { + "@odata.id": "/redfish/v1/AccountService/Roles/Administrator" + } + }, + "Locked": false, + "Name": "User Account", + "Password": "null", + "RoleId": "Administrator", + "UserName": "ADMIN" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Accounts/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Accounts/index.json new file mode 100644 index 0000000..f3fba98 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Accounts/index.json @@ -0,0 +1,12 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ManagerAccountCollection.ManagerAccountCollection", + "@odata.id": "/redfish/v1/AccountService/Accounts", + "@odata.type": "#ManagerAccountCollection.ManagerAccountCollection", + "Members": [ + { + "@odata.id": "/redfish/v1/AccountService/Accounts/2" + } + ], + "Members@odata.count": 1, + "Name": "Accounts Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/Administrator/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/Administrator/index.json new file mode 100644 index 0000000..7eda40b --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/Administrator/index.json @@ -0,0 +1,20 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Role.Role", + "@odata.id": "/redfish/v1/AccountService/Roles/Administrator", + "@odata.type": "#Role.v1_0_0.Role", + "AssignedPrivileges": [ + "Login", + "ConfigureManager", + "ConfigureUsers", + "ConfigureSelf", + "ConfigureComponents" + ], + "Description": "Administrator User Role", + "Id": "Administrator", + "IsPredefined": true, + "Name": "User Role", + "OemPrivileges": [ + "OemClearLog", + "OemPowerControl" + ] +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/Operator/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/Operator/index.json new file mode 100644 index 0000000..0052dec --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/Operator/index.json @@ -0,0 +1,15 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Role.Role", + "@odata.id": "/redfish/v1/AccountService/Roles/Operator", + "@odata.type": "#Role.v1_0_0.Role", + "AssignedPrivileges": [ + "Login", + "ConfigureSelf", + "ConfigureComponents" + ], + "Description": "Operator User Role", + "Id": "Operator", + "IsPredefined": true, + "Name": "User Role", + "OemPrivileges": [] +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/ReadOnly/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/ReadOnly/index.json new file mode 100644 index 0000000..805bc46 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/ReadOnly/index.json @@ -0,0 +1,14 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Role.Role", + "@odata.id": "/redfish/v1/AccountService/Roles/ReadOnly", + "@odata.type": "#Role.v1_0_0.Role", + "AssignedPrivileges": [ + "Login", + "ConfigureSelf" + ], + "Description": "ReadOnly User Role", + "Id": "ReadOnly", + "IsPredefined": true, + "Name": "User Role", + "OemPrivileges": [] +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/index.json new file mode 100644 index 0000000..06833eb --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/Roles/index.json @@ -0,0 +1,18 @@ +{ + "@odata.context": "/redfish/v1/$metadata#RoleCollection.RoleCollection", + "@odata.id": "/redfish/v1/AccountService/Roles", + "@odata.type": "#RoleCollection.RoleCollection", + "Members": [ + { + "@odata.id": "/redfish/v1/AccountService/Roles/Administrator" + }, + { + "@odata.id": "/redfish/v1/AccountService/Roles/Operator" + }, + { + "@odata.id": "/redfish/v1/AccountService/Roles/ReadOnly" + } + ], + "Members@odata.count": 3, + "Name": "Roles Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/index.json new file mode 100644 index 0000000..d21c743 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/AccountService/index.json @@ -0,0 +1,25 @@ +{ + "@odata.context": "/redfish/v1/$metadata#AccountService.AccountService", + "@odata.id": "/redfish/v1/AccountService", + "@odata.type": "#AccountService.v1_0_0.AccountService", + "AccountLockoutCounterResetAfter": 30, + "AccountLockoutDuration": 30, + "AccountLockoutThreshold": 5, + "Accounts": { + "@odata.id": "/redfish/v1/AccountService/Accounts" + }, + "AuthFailureLoggingThreshold": 3, + "Description": "Account Service", + "Id": "AccountService", + "MaxPasswordLength": 19, + "MinPasswordLength": 8, + "Name": "Account Service", + "Roles": { + "@odata.id": "/redfish/v1/AccountService/Roles" + }, + "ServiceEnabled": true, + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/Power/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/Power/index.json new file mode 100644 index 0000000..80ea9f1 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/Power/index.json @@ -0,0 +1,532 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Power.Power", + "@odata.id": "/redfish/v1/Chassis/1/Power", + "@odata.type": "#Power.v1_1_0.Power", + "Id": "Power", + "Name": "Power", + "Oem": {}, + "PowerControl": [ + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/PowerControl/0", + "@odata.type": "#Power.v1_0_0.PowerControl", + "MemberId": "0", + "Name": "System Power Control", + "Oem": {}, + "PowerConsumedWatts": 90, + "PowerMetrics": { + "AverageConsumedWatts": 148, + "IntervalInMin": 5, + "MaxConsumedWatts": 191, + "MinConsumedWatts": 90 + }, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1/Processors/2" + } + ], + "Status": { + "Health": "OK", + "State": "Enabled" + } + } + ], + "PowerSupplies": [ + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/PowerSupplies/0", + "@odata.type": "#Power.v1_1_0.PowerSupply", + "FirmwareVersion": "REV1.3", + "LastPowerOutputWatts": 131, + "LineInputVoltage": 230, + "LineInputVoltageType": "ACMidLine", + "MemberId": "0", + "Model": "PWS-406P-1R", + "Name": "Power Supply Bay 1", + "Oem": {}, + "PowerSupplyType": "AC", + "Redundancy": [ + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Redundancy/0" + } + ], + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "SensorNumber": 200, + "SerialNumber": "SN00000001", + "Status": { + "Health": "OK", + "State": "Enabled" + } + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/PowerSupplies/1", + "@odata.type": "#Power.v1_1_0.PowerSupply", + "MemberId": "1", + "Name": "Power Supply Bay 2", + "Oem": {}, + "SensorNumber": 201, + "Status": { + "State": "Absent" + } + } + ], + "Redundancy": [ + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Redundancy/0", + "@odata.type": "#Redundancy.v1_2_0.Redundancy", + "MaxNumSupported": 4, + "MemberId": "0", + "MinNumNeeded": 1, + "Mode": "Failover", + "Name": "PowerSupply Redundancy Group 1", + "RedundancySet": [ + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/PowerSupplies/0" + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/PowerSupplies/1" + } + ], + "Status": { + "Health": "OK", + "State": "Enabled" + } + } + ], + "Voltages": [ + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/0", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 10.299, + "LowerThresholdFatal": 10.173, + "LowerThresholdNonCritical": 10.74, + "MaxReadingRange": 16.221, + "MemberId": "0", + "MinReadingRange": 0.156, + "Name": "12V", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 11.937, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 48, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 13.26, + "UpperThresholdFatal": 13.386, + "UpperThresholdNonCritical": 12.945 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/1", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 4.298, + "LowerThresholdFatal": 4.246, + "LowerThresholdNonCritical": 4.48, + "MaxReadingRange": 6.794, + "MemberId": "1", + "MinReadingRange": 0.164, + "Name": "5VCC", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 4.922, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 49, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 5.546, + "UpperThresholdFatal": 5.598, + "UpperThresholdNonCritical": 5.39 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/2", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 2.823, + "LowerThresholdFatal": 2.789, + "LowerThresholdNonCritical": 2.959, + "MaxReadingRange": 4.421, + "MemberId": "2", + "MinReadingRange": 0.086, + "Name": "3.3VCC", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 3.35, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 50, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 3.656, + "UpperThresholdFatal": 3.69, + "UpperThresholdNonCritical": 3.554 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/3", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 2.43, + "LowerThresholdFatal": 2.326, + "LowerThresholdNonCritical": 2.508, + "MaxReadingRange": 6.694, + "MemberId": "3", + "MinReadingRange": 0.064, + "Name": "VBAT", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 2.69, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 51, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 3.782, + "UpperThresholdFatal": 3.886, + "UpperThresholdNonCritical": 3.678 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/4", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 1.26, + "LowerThresholdFatal": 1.242, + "LowerThresholdNonCritical": 1.395, + "MaxReadingRange": 2.439, + "MemberId": "4", + "MinReadingRange": 0.144, + "Name": "Vcpu1", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 1.818, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/1" + } + ], + "SensorNumber": 52, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 2.088, + "UpperThresholdFatal": 2.106, + "UpperThresholdNonCritical": 1.899 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/5", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 1.26, + "LowerThresholdFatal": 1.242, + "LowerThresholdNonCritical": 1.395, + "MaxReadingRange": 2.439, + "MemberId": "5", + "MinReadingRange": 0.144, + "Name": "Vcpu2", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 1.818, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/2" + } + ], + "SensorNumber": 54, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 2.088, + "UpperThresholdFatal": 2.106, + "UpperThresholdNonCritical": 1.899 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/6", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 0.975, + "LowerThresholdFatal": 0.948, + "LowerThresholdNonCritical": 1.047, + "MaxReadingRange": 2.37, + "MemberId": "6", + "MinReadingRange": 0.075, + "Name": "VDIMMAB", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 1.2, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 53, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 1.425, + "UpperThresholdFatal": 1.443, + "UpperThresholdNonCritical": 1.344 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/7", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 0.975, + "LowerThresholdFatal": 0.948, + "LowerThresholdNonCritical": 1.047, + "MaxReadingRange": 2.37, + "MemberId": "7", + "MinReadingRange": 0.075, + "Name": "VDIMMCD", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 1.2, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 55, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 1.425, + "UpperThresholdFatal": 1.443, + "UpperThresholdNonCritical": 1.344 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/8", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 0.975, + "LowerThresholdFatal": 0.948, + "LowerThresholdNonCritical": 1.047, + "MaxReadingRange": 2.37, + "MemberId": "8", + "MinReadingRange": 0.075, + "Name": "VDIMMEF", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 1.2, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 58, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 1.425, + "UpperThresholdFatal": 1.443, + "UpperThresholdNonCritical": 1.344 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/9", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 0.975, + "LowerThresholdFatal": 0.948, + "LowerThresholdNonCritical": 1.047, + "MaxReadingRange": 2.37, + "MemberId": "9", + "MinReadingRange": 0.075, + "Name": "VDIMMGH", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 1.2, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 59, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 1.425, + "UpperThresholdFatal": 1.443, + "UpperThresholdNonCritical": 1.344 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/10", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 4.298, + "LowerThresholdFatal": 4.246, + "LowerThresholdNonCritical": 4.48, + "MaxReadingRange": 6.768, + "MemberId": "10", + "MinReadingRange": 0.138, + "Name": "5VSB", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 4.896, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 56, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 5.546, + "UpperThresholdFatal": 5.598, + "UpperThresholdNonCritical": 5.39 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/11", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 2.823, + "LowerThresholdFatal": 2.789, + "LowerThresholdNonCritical": 2.959, + "MaxReadingRange": 4.353, + "MemberId": "11", + "MinReadingRange": 0.018, + "Name": "3.3VSB", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 3.214, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 57, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 3.656, + "UpperThresholdFatal": 3.69, + "UpperThresholdNonCritical": 3.554 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/12", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 1.347, + "LowerThresholdFatal": 1.32, + "LowerThresholdNonCritical": 1.401, + "MaxReadingRange": 2.418, + "MemberId": "12", + "MinReadingRange": 0.123, + "Name": "1.5V PCH", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 1.5, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 60, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 1.671, + "UpperThresholdFatal": 1.698, + "UpperThresholdNonCritical": 1.644 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/13", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 1.047, + "LowerThresholdFatal": 1.02, + "LowerThresholdNonCritical": 1.092, + "MaxReadingRange": 2.343, + "MemberId": "13", + "MinReadingRange": 0.048, + "Name": "1.2V BMC", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 1.209, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 61, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 1.371, + "UpperThresholdFatal": 1.398, + "UpperThresholdNonCritical": 1.344 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Power#/Voltages/14", + "@odata.type": "#Power.v1_0_0.Voltage", + "LowerThresholdCritical": 0.897, + "LowerThresholdFatal": 0.87, + "LowerThresholdNonCritical": 0.942, + "MaxReadingRange": 2.373, + "MemberId": "14", + "MinReadingRange": 0.078, + "Name": "1.05V PCH", + "PhysicalContext": "VoltageRegulator", + "ReadingVolts": 1.05, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 62, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 1.221, + "UpperThresholdFatal": 1.248, + "UpperThresholdNonCritical": 1.194 + } + ] +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/Thermal/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/Thermal/index.json new file mode 100644 index 0000000..e8e92f5 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/Thermal/index.json @@ -0,0 +1,768 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Thermal.Thermal", + "@odata.id": "/redfish/v1/Chassis/1/Thermal", + "@odata.type": "#Thermal.v1_4_0.Thermal", + "Fans": [ + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Fans/0", + "@odata.type": "#Thermal.v1_4_0.Fan", + "LowerThresholdCritical": 0, + "LowerThresholdFatal": 0, + "LowerThresholdNonCritical": 0, + "MaxReadingRange": 0, + "MemberId": "0", + "MinReadingRange": 0, + "Name": "FAN1", + "PhysicalContext": "Fan", + "Reading": 0, + "ReadingUnits": "RPM", + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1" + }, + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "SensorNumber": 65, + "Status": { + "State": "Absent" + }, + "UpperThresholdCritical": 0, + "UpperThresholdFatal": 0, + "UpperThresholdNonCritical": 0 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Fans/1", + "@odata.type": "#Thermal.v1_4_0.Fan", + "LowerThresholdCritical": 500, + "LowerThresholdFatal": 300, + "LowerThresholdNonCritical": 700, + "MaxReadingRange": 25600, + "MemberId": "1", + "MinReadingRange": 200, + "Name": "FAN2", + "PhysicalContext": "Fan", + "Reading": 6900, + "ReadingUnits": "RPM", + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1" + }, + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "SensorNumber": 66, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 25400, + "UpperThresholdFatal": 25500, + "UpperThresholdNonCritical": 25300 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Fans/2", + "@odata.type": "#Thermal.v1_4_0.Fan", + "LowerThresholdCritical": 500, + "LowerThresholdFatal": 300, + "LowerThresholdNonCritical": 700, + "MaxReadingRange": 25600, + "MemberId": "2", + "MinReadingRange": 200, + "Name": "FAN3", + "PhysicalContext": "Fan", + "Reading": 7500, + "ReadingUnits": "RPM", + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1" + }, + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "SensorNumber": 67, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 25400, + "UpperThresholdFatal": 25500, + "UpperThresholdNonCritical": 25300 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Fans/3", + "@odata.type": "#Thermal.v1_4_0.Fan", + "LowerThresholdCritical": 500, + "LowerThresholdFatal": 300, + "LowerThresholdNonCritical": 700, + "MaxReadingRange": 25600, + "MemberId": "3", + "MinReadingRange": 200, + "Name": "FAN4", + "PhysicalContext": "Fan", + "Reading": 7000, + "ReadingUnits": "RPM", + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1" + }, + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "SensorNumber": 68, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 25400, + "UpperThresholdFatal": 25500, + "UpperThresholdNonCritical": 25300 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Fans/4", + "@odata.type": "#Thermal.v1_4_0.Fan", + "LowerThresholdCritical": 0, + "LowerThresholdFatal": 0, + "LowerThresholdNonCritical": 0, + "MaxReadingRange": 0, + "MemberId": "4", + "MinReadingRange": 0, + "Name": "FAN5", + "PhysicalContext": "Fan", + "Reading": 0, + "ReadingUnits": "RPM", + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1" + }, + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "SensorNumber": 69, + "Status": { + "State": "Absent" + }, + "UpperThresholdCritical": 0, + "UpperThresholdFatal": 0, + "UpperThresholdNonCritical": 0 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Fans/5", + "@odata.type": "#Thermal.v1_4_0.Fan", + "LowerThresholdCritical": 0, + "LowerThresholdFatal": 0, + "LowerThresholdNonCritical": 0, + "MaxReadingRange": 0, + "MemberId": "5", + "MinReadingRange": 0, + "Name": "FAN6", + "PhysicalContext": "Fan", + "Reading": 0, + "ReadingUnits": "RPM", + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1" + }, + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "SensorNumber": 70, + "Status": { + "State": "Absent" + }, + "UpperThresholdCritical": 0, + "UpperThresholdFatal": 0, + "UpperThresholdNonCritical": 0 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Fans/6", + "@odata.type": "#Thermal.v1_4_0.Fan", + "LowerThresholdCritical": 0, + "LowerThresholdFatal": 0, + "LowerThresholdNonCritical": 0, + "MaxReadingRange": 0, + "MemberId": "6", + "MinReadingRange": 0, + "Name": "FANA", + "PhysicalContext": "Fan", + "Reading": 0, + "ReadingUnits": "RPM", + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1" + }, + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "SensorNumber": 71, + "Status": { + "State": "Absent" + }, + "UpperThresholdCritical": 0, + "UpperThresholdFatal": 0, + "UpperThresholdNonCritical": 0 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Fans/7", + "@odata.type": "#Thermal.v1_4_0.Fan", + "LowerThresholdCritical": 500, + "LowerThresholdFatal": 300, + "LowerThresholdNonCritical": 700, + "MaxReadingRange": 25600, + "MemberId": "7", + "MinReadingRange": 200, + "Name": "FANB", + "PhysicalContext": "Fan", + "Reading": 5100, + "ReadingUnits": "RPM", + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1" + }, + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "SensorNumber": 72, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 25400, + "UpperThresholdFatal": 25500, + "UpperThresholdNonCritical": 25300 + } + ], + "Id": "Thermal", + "Name": "Thermal", + "Temperatures": [ + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/0", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 0, + "LowerThresholdFatal": 0, + "LowerThresholdNonCritical": 0, + "MaxReadingRangeTemp": 87, + "MemberId": "0", + "MinReadingRangeTemp": -2, + "Name": "CPU1 Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 33, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/1" + } + ], + "SensorNumber": 1, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 85, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/1", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 0, + "LowerThresholdFatal": 0, + "LowerThresholdNonCritical": 0, + "MaxReadingRangeTemp": 87, + "MemberId": "1", + "MinReadingRangeTemp": -2, + "Name": "CPU2 Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 41, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/2" + } + ], + "SensorNumber": 2, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 85, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/2", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": -8, + "LowerThresholdFatal": -11, + "LowerThresholdNonCritical": -5, + "MaxReadingRangeTemp": 102, + "MemberId": "2", + "MinReadingRangeTemp": -13, + "Name": "PCH Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 28, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 10, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 95, + "UpperThresholdFatal": 100, + "UpperThresholdNonCritical": 90 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/3", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": -7, + "LowerThresholdFatal": -9, + "LowerThresholdNonCritical": -5, + "MaxReadingRangeTemp": 92, + "MemberId": "3", + "MinReadingRangeTemp": -11, + "Name": "System Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 18, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 11, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/4", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": -7, + "LowerThresholdFatal": -9, + "LowerThresholdNonCritical": -5, + "MaxReadingRangeTemp": 92, + "MemberId": "4", + "MinReadingRangeTemp": -11, + "Name": "Peripheral Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 39, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 12, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/5", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": -7, + "LowerThresholdFatal": -9, + "LowerThresholdNonCritical": -5, + "MaxReadingRangeTemp": 107, + "MemberId": "5", + "MinReadingRangeTemp": -11, + "Name": "Vcpu1VRM Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 28, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 16, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 100, + "UpperThresholdFatal": 105, + "UpperThresholdNonCritical": 95 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/6", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": -7, + "LowerThresholdFatal": -9, + "LowerThresholdNonCritical": -5, + "MaxReadingRangeTemp": 107, + "MemberId": "6", + "MinReadingRangeTemp": -11, + "Name": "Vcpu2VRM Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 40, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 17, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 100, + "UpperThresholdFatal": 105, + "UpperThresholdNonCritical": 95 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/7", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": -7, + "LowerThresholdFatal": -9, + "LowerThresholdNonCritical": -5, + "MaxReadingRangeTemp": 107, + "MemberId": "7", + "MinReadingRangeTemp": -11, + "Name": "VmemABVRM Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 25, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 18, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 100, + "UpperThresholdFatal": 105, + "UpperThresholdNonCritical": 95 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/8", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": -7, + "LowerThresholdFatal": -9, + "LowerThresholdNonCritical": -5, + "MaxReadingRangeTemp": 107, + "MemberId": "8", + "MinReadingRangeTemp": -11, + "Name": "VmemCDVRM Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 23, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 19, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 100, + "UpperThresholdFatal": 105, + "UpperThresholdNonCritical": 95 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/9", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": -7, + "LowerThresholdFatal": -9, + "LowerThresholdNonCritical": -5, + "MaxReadingRangeTemp": 107, + "MemberId": "9", + "MinReadingRangeTemp": -11, + "Name": "VmemEFVRM Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 37, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 20, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 100, + "UpperThresholdFatal": 105, + "UpperThresholdNonCritical": 95 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/10", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": -7, + "LowerThresholdFatal": -9, + "LowerThresholdNonCritical": -5, + "MaxReadingRangeTemp": 107, + "MemberId": "10", + "MinReadingRangeTemp": -11, + "Name": "VmemGHVRM Temp", + "PhysicalContext": "CPU", + "ReadingCelsius": 35, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "SensorNumber": 21, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 100, + "UpperThresholdFatal": 105, + "UpperThresholdNonCritical": 95 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/11", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 2, + "LowerThresholdFatal": 1, + "LowerThresholdNonCritical": 4, + "MaxReadingRangeTemp": 92, + "MemberId": "11", + "MinReadingRangeTemp": -1, + "Name": "P1-DIMMA1 Temp", + "PhysicalContext": "Memory", + "ReadingCelsius": 26, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/1" + } + ], + "SensorNumber": 176, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/12", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 2, + "LowerThresholdFatal": 1, + "LowerThresholdNonCritical": 4, + "MaxReadingRangeTemp": 92, + "MemberId": "12", + "MinReadingRangeTemp": -1, + "Name": "P1-DIMMB1 Temp", + "PhysicalContext": "Memory", + "ReadingCelsius": 24, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/1" + } + ], + "SensorNumber": 180, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/13", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 2, + "LowerThresholdFatal": 1, + "LowerThresholdNonCritical": 4, + "MaxReadingRangeTemp": 92, + "MemberId": "13", + "MinReadingRangeTemp": -1, + "Name": "P1-DIMMC1 Temp", + "PhysicalContext": "Memory", + "ReadingCelsius": 25, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/1" + } + ], + "SensorNumber": 184, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/14", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 2, + "LowerThresholdFatal": 1, + "LowerThresholdNonCritical": 4, + "MaxReadingRangeTemp": 92, + "MemberId": "14", + "MinReadingRangeTemp": -1, + "Name": "P1-DIMMD1 Temp", + "PhysicalContext": "Memory", + "ReadingCelsius": 22, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/1" + } + ], + "SensorNumber": 188, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/15", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 2, + "LowerThresholdFatal": 1, + "LowerThresholdNonCritical": 4, + "MaxReadingRangeTemp": 92, + "MemberId": "15", + "MinReadingRangeTemp": -1, + "Name": "P2-DIMME1 Temp", + "PhysicalContext": "Memory", + "ReadingCelsius": 27, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/2" + } + ], + "SensorNumber": 208, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/16", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 2, + "LowerThresholdFatal": 1, + "LowerThresholdNonCritical": 4, + "MaxReadingRangeTemp": 92, + "MemberId": "16", + "MinReadingRangeTemp": -1, + "Name": "P2-DIMMF1 Temp", + "PhysicalContext": "Memory", + "ReadingCelsius": 28, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/2" + } + ], + "SensorNumber": 212, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/17", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 2, + "LowerThresholdFatal": 1, + "LowerThresholdNonCritical": 4, + "MaxReadingRangeTemp": 92, + "MemberId": "17", + "MinReadingRangeTemp": -1, + "Name": "P2-DIMMG1 Temp", + "PhysicalContext": "Memory", + "ReadingCelsius": 29, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/2" + } + ], + "SensorNumber": 216, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + }, + { + "@odata.id": "/redfish/v1/Chassis/1/Thermal#/Temperatures/18", + "@odata.type": "#Thermal.v1_4_0.Temperature", + "LowerThresholdCritical": 2, + "LowerThresholdFatal": 1, + "LowerThresholdNonCritical": 4, + "MaxReadingRangeTemp": 92, + "MemberId": "18", + "MinReadingRangeTemp": -1, + "Name": "P2-DIMMH1 Temp", + "PhysicalContext": "Memory", + "ReadingCelsius": 30, + "RelatedItem": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/2" + } + ], + "SensorNumber": 220, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UpperThresholdCritical": 85, + "UpperThresholdFatal": 90, + "UpperThresholdNonCritical": 80 + } + ] +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/index.json new file mode 100644 index 0000000..06c28d5 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/1/index.json @@ -0,0 +1,51 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Chassis.Chassis", + "@odata.id": "/redfish/v1/Chassis/1", + "@odata.type": "#Chassis.v1_4_0.Chassis", + "AssetTag": "", + "ChassisType": "RackMount", + "Id": "1", + "IndicatorLED": "Off", + "Links": { + "ComputerSystems": [ + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "ManagedBy": [ + { + "@odata.id": "/redfish/v1/Managers/1" + } + ] + }, + "Manufacturer": "Supermicro", + "Model": "X10DRL-i", + "Name": "Computer System Chassis", + "Oem": { + "Supermicro": { + "@odata.type": "#SmcChassisExtensions.v1_0_0.Chassis", + "BoardID": "0x831", + "BoardSerialNumber": "ZM000S000001", + "GUID": "43303031-4D53-0CC4-7A72-6F1300000000" + } + }, + "PartNumber": "", + "PhysicalSecurity": { + "IntrusionSensor": "Normal", + "IntrusionSensorNumber": 170, + "IntrusionSensorReArm": "Manual" + }, + "Power": { + "@odata.id": "/redfish/v1/Chassis/1/Power" + }, + "SKU": "", + "SerialNumber": "", + "Status": { + "Health": "OK", + "HealthRollup": "OK", + "State": "Enabled" + }, + "Thermal": { + "@odata.id": "/redfish/v1/Chassis/1/Thermal" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/index.json new file mode 100644 index 0000000..7c4d3a9 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Chassis/index.json @@ -0,0 +1,12 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ChassisCollection.ChassisCollection", + "@odata.id": "/redfish/v1/Chassis", + "@odata.type": "#ChassisCollection.ChassisCollection", + "Members": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "Members@odata.count": 1, + "Name": "Chassis Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/EventService/Subscriptions/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/EventService/Subscriptions/index.json new file mode 100644 index 0000000..c02087a --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/EventService/Subscriptions/index.json @@ -0,0 +1,8 @@ +{ + "@odata.context": "/redfish/v1/$metadata#EventDestinationCollection.EventDestinationCollection", + "@odata.id": "/redfish/v1/EventService/Subscriptions", + "@odata.type": "#EventDestinationCollection.EventDestinationCollection", + "Members": [], + "Members@odata.count": 0, + "Name": "Event Subscriptions Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/EventService/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/EventService/index.json new file mode 100644 index 0000000..036640c --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/EventService/index.json @@ -0,0 +1,38 @@ +{ + "@odata.context": "/redfish/v1/$metadata#EventService.EventService", + "@odata.id": "/redfish/v1/EventService", + "@odata.type": "#EventService.v1_1_0.EventService", + "Actions": { + "#EventService.SubmitTestEvent": { + "EventType@Redfish.AllowableValues": [ + "StatusChange", + "ResourceUpdated", + "ResourceAdded", + "ResourceRemoved", + "Alert" + ], + "target": "/redfish/v1/EventService/Actions/EventService.SubmitTestEvent" + }, + "Oem": {} + }, + "DeliveryRetryAttempts": 3, + "DeliveryRetryIntervalSeconds": 60, + "EventTypesForSubscription": [ + "StatusChange", + "ResourceUpdated", + "ResourceAdded", + "ResourceRemoved", + "Alert" + ], + "Id": "EventService", + "Name": "Event Service", + "Oem": {}, + "ServiceEnabled": true, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "Subscriptions": { + "@odata.id": "/redfish/v1/EventService/Subscriptions" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/ActiveDirectory/RoleGroups/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/ActiveDirectory/RoleGroups/index.json new file mode 100644 index 0000000..411bd7a --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/ActiveDirectory/RoleGroups/index.json @@ -0,0 +1,8 @@ +{ + "@odata.context": "/redfish/v1/$metadata#RoleGroupCollection.RoleGroupCollection", + "@odata.id": "/redfish/v1/Managers/1/ActiveDirectory/RoleGroups", + "@odata.type": "#RoleGroupCollection.RoleGroupCollection", + "Members": [], + "Members@odata.count": 0, + "Name": "Role Group Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/ActiveDirectory/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/ActiveDirectory/index.json new file mode 100644 index 0000000..9ceb096 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/ActiveDirectory/index.json @@ -0,0 +1,18 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ActiveDirectory.ActiveDirectory", + "@odata.id": "/redfish/v1/Managers/1/ActiveDirectory", + "@odata.type": "#ActiveDirectory.v1_0_0.ActiveDirectory", + "AuthenticationEnabled": false, + "AuthenticationOverSSLEnabled": false, + "DCSAddress1": "0.0.0.0", + "DCSAddress2": "0.0.0.0", + "DCSAddress3": "0.0.0.0", + "Id": "Active Directory", + "Name": "Active Directory", + "PortNumber": 389, + "RoleGroups": { + "@odata.id": "/redfish/v1/Managers/1/ActiveDirectory/RoleGroups" + }, + "Timeout": 0, + "UserDomainName": "" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/EthernetInterfaces/1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/EthernetInterfaces/1/index.json new file mode 100644 index 0000000..1a22f6d --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/EthernetInterfaces/1/index.json @@ -0,0 +1,56 @@ +{ + "@odata.context": "/redfish/v1/$metadata#EthernetInterface.EthernetInterface", + "@odata.id": "/redfish/v1/Managers/1/EthernetInterfaces/1", + "@odata.type": "#EthernetInterface.v1_0_0.EthernetInterface", + "AutoNeg": true, + "Description": "Management Network Interface", + "FullDuplex": true, + "HostName": "server01", + "IPv4Addresses": [ + { + "Address": "192.0.2.150", + "AddressOrigin": "DHCP", + "Gateway": "192.0.2.1", + "SubnetMask": "255.255.255.0" + } + ], + "IPv6AddressPolicyTable": [ + { + "Label": 0, + "Precedence": 50, + "Prefix": "::1/128" + } + ], + "IPv6Addresses": [ + { + "Address": "fe80::200:5eff:fe00:5313", + "AddressOrigin": "SLAAC", + "AddressState": "Preferred", + "PrefixLength": 64 + } + ], + "IPv6DefaultGateway": "fe80::200:5eff:fe00:5313", + "IPv6StaticAddresses": [ + { + "Address": "fe80::200:5eff:fe00:5313", + "PrefixLength": 64 + } + ], + "Id": "1", + "InterfaceEnabled": true, + "MACAddress": "00:00:5e:00:53:13", + "MTUSize": 1500, + "Name": "EthernetInterface", + "NameServers": [ + "192.0.2.1" + ], + "SpeedMbps": 1000, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "VLAN": { + "VLANEnable": false, + "VLANId": 0 + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/EthernetInterfaces/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/EthernetInterfaces/index.json new file mode 100644 index 0000000..0b24165 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/EthernetInterfaces/index.json @@ -0,0 +1,13 @@ +{ + "@odata.context": "/redfish/v1/$metadata#EthernetInterfaceCollection.EthernetInterfaceCollection", + "@odata.id": "/redfish/v1/Managers/1/EthernetInterfaces", + "@odata.type": "#EthernetInterfaceCollection.EthernetInterfaceCollection", + "Description": "Collection of EthernetInterfaces for this Manager", + "Members": [ + { + "@odata.id": "/redfish/v1/Managers/1/EthernetInterfaces/1" + } + ], + "Members@odata.count": 1, + "Name": "Ethernet Network Interface Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/FanMode/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/FanMode/index.json new file mode 100644 index 0000000..0d3f13d --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/FanMode/index.json @@ -0,0 +1,14 @@ +{ + "@odata.context": "/redfish/v1/$metadata#FanMode.FanMode", + "@odata.id": "/redfish/v1/Managers/1/FanMode", + "@odata.type": "#FanMode.v1_0_0.FanMode", + "Id": "Fan Mode", + "Mode": "Optimal", + "Mode@Redfish.AllowableValues": [ + "Standard", + "FullSpeed", + "Optimal", + "HeavyIO" + ], + "Name": "FanMode" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IKVM/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IKVM/index.json new file mode 100644 index 0000000..6f066b5 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IKVM/index.json @@ -0,0 +1,20 @@ +{ + "error": { + "@Message.ExtendedInfo": [ + { + "Message": "Not licensed to perform this request. The following licenses DCMS were needed", + "MessageArgs": [ + "DCMS " + ], + "MessageId": "Base.v1_4_0.OemLicenseNotPassed", + "RelatedProperties": [ + "" + ], + "Resolution": "Please activate at least one license in above message.", + "Severity": "Warning" + } + ], + "Message": "A general error has occurred. See ExtendedInfo for more information.", + "code": "Base.v1_4_0.GeneralError" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IPAccessControl/FilterRules/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IPAccessControl/FilterRules/index.json new file mode 100644 index 0000000..26a855d --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IPAccessControl/FilterRules/index.json @@ -0,0 +1,8 @@ +{ + "@odata.context": "/redfish/v1/$metadata#FilterRuleCollection.FilterRuleCollection", + "@odata.id": "/redfish/v1/Managers/1/IPAccessControl/FilterRules", + "@odata.type": "#FilterRuleCollection.FilterRuleCollection", + "Members": [], + "Members@odata.count": 0, + "Name": "Filter Rule Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IPAccessControl/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IPAccessControl/index.json new file mode 100644 index 0000000..3eeb024 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/IPAccessControl/index.json @@ -0,0 +1,11 @@ +{ + "@odata.context": "/redfish/v1/$metadata#IPAccessControl.IPAccessControl", + "@odata.id": "/redfish/v1/Managers/1/IPAccessControl", + "@odata.type": "#IPAccessControl.v1_0_0.IPAccessControl", + "FilterRules": { + "@odata.id": "/redfish/v1/Managers/1/IPAccessControl/FilterRules" + }, + "Id": "IP Access Control", + "Name": "IP Access Control", + "ServiceEnabled": false +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/LDAP/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/LDAP/index.json new file mode 100644 index 0000000..9f6310b --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/LDAP/index.json @@ -0,0 +1,14 @@ +{ + "@odata.context": "/redfish/v1/$metadata#LDAP.LDAP", + "@odata.id": "/redfish/v1/Managers/1/LDAP", + "@odata.type": "#LDAP.v1_0_0.LDAP", + "Id": "LDAP", + "LDAPAuthOverSSL": false, + "LDAPDN": "", + "LDAPEnabled": false, + "LDAPPassword": "", + "LDAPPortNumber": 389, + "LDAPSearchbase": "", + "LDAPServerIP": "0.0.0.0", + "Name": "LDAP" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/MouseMode/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/MouseMode/index.json new file mode 100644 index 0000000..f0ec5f9 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/MouseMode/index.json @@ -0,0 +1,13 @@ +{ + "@odata.context": "/redfish/v1/$metadata#MouseMode.MouseMode", + "@odata.id": "/redfish/v1/Managers/1/MouseMode", + "@odata.type": "#MouseMode.v1_0_0.MouseMode", + "Id": "Mouse Mode", + "Mode": "Absolute", + "Mode@Redfish.AllowableValues": [ + "Absolute", + "Relative", + "Single" + ], + "Name": "MouseMode" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/NTP/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/NTP/index.json new file mode 100644 index 0000000..bdf6391 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/NTP/index.json @@ -0,0 +1,11 @@ +{ + "@odata.context": "/redfish/v1/$metadata#NTP.NTP", + "@odata.id": "/redfish/v1/Managers/1/NTP", + "@odata.type": "#NTP.v1_0_0.NTP", + "DaylightSavingTime": true, + "Id": "NTP", + "NTPEnable": true, + "Name": "NTP Service", + "PrimaryNTPServer": "192.0.2.1", + "SecondaryNTPServer": "" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/NetworkProtocol/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/NetworkProtocol/index.json new file mode 100644 index 0000000..9f8712e --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/NetworkProtocol/index.json @@ -0,0 +1,42 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ManagerNetworkProtocol.ManagerNetworkProtocol", + "@odata.id": "/redfish/v1/Managers/1/NetworkProtocol", + "@odata.type": "#ManagerNetworkProtocol.v1_0_0.ManagerNetworkProtocol", + "Description": "Manager Network Service Status", + "FQDN": "", + "HTTP": { + "Port": 80, + "ProtocolEnabled": true + }, + "HTTPS": { + "Port": 443, + "ProtocolEnabled": true + }, + "HostName": "server01", + "IPMI": { + "Port": 623, + "ProtocolEnabled": true + }, + "Id": "NetworkProtocol", + "KVMIP": { + "Port": 5900, + "ProtocolEnabled": true + }, + "Name": "Manager Network Protocol", + "SNMP": { + "Port": 161, + "ProtocolEnabled": true + }, + "SSH": { + "Port": 22, + "ProtocolEnabled": true + }, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "VirtualMedia": { + "Port": 623, + "ProtocolEnabled": true + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/RADIUS/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/RADIUS/index.json new file mode 100644 index 0000000..5dafb55 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/RADIUS/index.json @@ -0,0 +1,11 @@ +{ + "@odata.context": "/redfish/v1/$metadata#RADIUS.RADIUS", + "@odata.id": "/redfish/v1/Managers/1/RADIUS", + "@odata.type": "#RADIUS.v1_0_1.RADIUS", + "Id": "RADIUS", + "Name": "RADIUS", + "RadiusEnabled": false, + "RadiusPortNumber": 1812, + "RadiusSecret": "null", + "RadiusServerIP": "0.0.0.0" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SMCRAKP/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SMCRAKP/index.json new file mode 100644 index 0000000..1c63841 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SMCRAKP/index.json @@ -0,0 +1,8 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SMCRAKP.SMCRAKP", + "@odata.id": "/redfish/v1/Managers/1/SMCRAKP", + "@odata.type": "#SMCRAKP.v1_0_0.SMCRAKP", + "Id": "SMC RAKP", + "Mode": "Disabled", + "Name": "SMCRAKP" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SMTP/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SMTP/index.json new file mode 100644 index 0000000..3d0bc38 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SMTP/index.json @@ -0,0 +1,13 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SMTP.SMTP", + "@odata.id": "/redfish/v1/Managers/1/SMTP", + "@odata.type": "#SMTP.v1_0_0.SMTP", + "Id": "SMTP", + "Name": "SMTP", + "SmtpPassword": "null", + "SmtpPortNumber": 587, + "SmtpSSLEnabled": false, + "SmtpSenderAddress": "", + "SmtpServer": "", + "SmtpUserName": "" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/SNMPv2/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/SNMPv2/index.json new file mode 100644 index 0000000..45621b9 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/SNMPv2/index.json @@ -0,0 +1,10 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SNMPv2.SNMPv2", + "@odata.id": "/redfish/v1/Managers/1/SNMP/SNMPv2", + "@odata.type": "#SNMPv2.v1_0_0.SNMPv2", + "Id": "1", + "Name": "SNMPv2", + "ROCommunity": "community-ro", + "RWCommunity": "community-rw", + "Snmpv2Enabled": true +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/SNMPv3/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/SNMPv3/index.json new file mode 100644 index 0000000..aea6daa --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/SNMPv3/index.json @@ -0,0 +1,21 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SNMPv3.SNMPv3", + "@odata.id": "/redfish/v1/Managers/1/SNMP/SNMPv3", + "@odata.type": "#SNMPv3.v1_0_0.SNMPv3", + "AuthKey": "", + "AuthProtocol": "MD5", + "AuthProtocol@Redfish.AllowableValues": [ + "SHA1", + "MD5" + ], + "Id": "1", + "Name": "SNMPv3", + "PrivateKey": "", + "PrivateProtocol": "DES", + "PrivateProtocol@Redfish.AllowableValues": [ + "AES", + "DES" + ], + "Snmpv3Enabled": false, + "UserName": "" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/index.json new file mode 100644 index 0000000..243060a --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SNMP/index.json @@ -0,0 +1,14 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SNMP.SNMP", + "@odata.id": "/redfish/v1/Managers/1/SNMP", + "@odata.type": "#SNMP.v1_0_0.SNMP", + "Id": "1", + "Name": "SNMP", + "SNMPv2": { + "@odata.id": "/redfish/v1/Managers/1/SNMP/SNMPv2" + }, + "SNMPv3": { + "@odata.id": "/redfish/v1/Managers/1/SNMP/SNMPv3" + }, + "SnmpEnabled": true +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SerialInterfaces/1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SerialInterfaces/1/index.json new file mode 100644 index 0000000..5a77c52 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SerialInterfaces/1/index.json @@ -0,0 +1,15 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SerialInterface.SerialInterface", + "@odata.id": "/redfish/v1/Managers/1/SerialInterfaces/1", + "@odata.type": "#SerialInterface.v1_0_0.SerialInterface", + "BitRate": "115200", + "DataBits": "8", + "Description": "Serial over LAN", + "FlowControl": "None", + "Id": "1", + "InterfaceEnabled": true, + "Name": "SerialInterface", + "Parity": "None", + "SignalType": "Rs232", + "StopBits": "1" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SerialInterfaces/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SerialInterfaces/index.json new file mode 100644 index 0000000..c566350 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/SerialInterfaces/index.json @@ -0,0 +1,13 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SerialInterfaceCollection.SerialInterfaceCollection", + "@odata.id": "/redfish/v1/Managers/1/SerialInterfaces", + "@odata.type": "#SerialInterfaceCollection.SerialInterfaceCollection", + "Description": "Collection of Serial Interfaces for this Manager", + "Members": [ + { + "@odata.id": "/redfish/v1/Managers/1/SerialInterfaces/1" + } + ], + "Members@odata.count": 1, + "Name": "Serial Interface Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/Snooping/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/Snooping/index.json new file mode 100644 index 0000000..1a8c1d7 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/Snooping/index.json @@ -0,0 +1,8 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Snooping.Snooping", + "@odata.id": "/redfish/v1/Managers/1/Snooping", + "@odata.type": "#Snooping.v1_0_0.Snooping", + "Id": "Snooping", + "Name": "Snooping", + "PostCode": "aa" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/Syslog/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/Syslog/index.json new file mode 100644 index 0000000..fe8c2db --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/Syslog/index.json @@ -0,0 +1,10 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Syslog.Syslog", + "@odata.id": "/redfish/v1/Managers/1/Syslog", + "@odata.type": "#Syslog.v1_0_0.Syslog", + "EnableSyslog": false, + "Id": "Syslog", + "Name": "Syslog", + "SyslogPortNumber": 0, + "SyslogServerIP": "" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/VM1/CfgCD/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/VM1/CfgCD/index.json new file mode 100644 index 0000000..6f066b5 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/VM1/CfgCD/index.json @@ -0,0 +1,20 @@ +{ + "error": { + "@Message.ExtendedInfo": [ + { + "Message": "Not licensed to perform this request. The following licenses DCMS were needed", + "MessageArgs": [ + "DCMS " + ], + "MessageId": "Base.v1_4_0.OemLicenseNotPassed", + "RelatedProperties": [ + "" + ], + "Resolution": "Please activate at least one license in above message.", + "Severity": "Warning" + } + ], + "Message": "A general error has occurred. See ExtendedInfo for more information.", + "code": "Base.v1_4_0.GeneralError" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/VM1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/VM1/index.json new file mode 100644 index 0000000..0da65e7 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/VM1/index.json @@ -0,0 +1,16 @@ +{ + "@odata.context": "/redfish/v1/$metadata#VirtualMediaCollection.VirtualMediaCollection", + "@odata.id": "/redfish/v1/Managers/1/VM1", + "@odata.type": "#VirtualMediaCollection.VirtualMediaCollection", + "Description": "Collection of Virtual Media for this System", + "Members@odata.count": 0, + "Name": "Virtual Media Collection", + "Oem": { + "Supermicro": { + "@odata.type": "#SmcVirtualMediaExtensions.v1_0_0.VirtualMediaCollection", + "VirtualMediaConfig": { + "@odata.id": "/redfish/v1/Managers/1/VM1/CfgCD" + } + } + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/index.json new file mode 100644 index 0000000..b3ffc46 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/1/index.json @@ -0,0 +1,119 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Manager.Manager", + "@odata.id": "/redfish/v1/Managers/1", + "@odata.type": "#Manager.v1_3_2.Manager", + "Actions": { + "#Manager.Reset": { + "target": "/redfish/v1/Managers/1/Actions/Manager.Reset" + }, + "Oem": { + "#ManagerConfig.Reset": { + "target": "/redfish/v1/Managers/1/Actions/Oem/ManagerConfig.Reset" + } + } + }, + "CommandShell": { + "ConnectTypesSupported": [ + "SSH" + ], + "MaxConcurrentSessions": 0, + "ServiceEnabled": true + }, + "DateTime": "2026-10-17T09:24:32+01:00", + "DateTimeLocalOffset": "+01:00", + "Description": "BMC", + "EthernetInterfaces": { + "@odata.id": "/redfish/v1/Managers/1/EthernetInterfaces" + }, + "FirmwareVersion": "3.91", + "GraphicalConsole": { + "ConnectTypesSupported": [ + "KVMIP" + ], + "MaxConcurrentSessions": 4, + "ServiceEnabled": true + }, + "Id": "1", + "Links": { + "ManagerForChassis": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "ManagerForServers": [ + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "Oem": {} + }, + "ManagerType": "BMC", + "Model": "ASPEED", + "Name": "Manager", + "NetworkProtocol": { + "@odata.id": "/redfish/v1/Managers/1/NetworkProtocol" + }, + "Oem": { + "Supermicro": { + "@odata.type": "#SmcManagerExtensions.v1_0_0.Manager", + "ActiveDirectory": { + "@odata.id": "/redfish/v1/Managers/1/ActiveDirectory" + }, + "FanMode": { + "@odata.id": "/redfish/v1/Managers/1/FanMode" + }, + "IKVM": { + "@odata.id": "/redfish/v1/Managers/1/IKVM" + }, + "IPAccessControl": { + "@odata.id": "/redfish/v1/Managers/1/IPAccessControl" + }, + "LDAP": { + "@odata.id": "/redfish/v1/Managers/1/LDAP" + }, + "MouseMode": { + "@odata.id": "/redfish/v1/Managers/1/MouseMode" + }, + "NTP": { + "@odata.id": "/redfish/v1/Managers/1/NTP" + }, + "RADIUS": { + "@odata.id": "/redfish/v1/Managers/1/RADIUS" + }, + "SMCRAKP": { + "@odata.id": "/redfish/v1/Managers/1/SMCRAKP" + }, + "SMTP": { + "@odata.id": "/redfish/v1/Managers/1/SMTP" + }, + "SNMP": { + "@odata.id": "/redfish/v1/Managers/1/SNMP" + }, + "Snooping": { + "@odata.id": "/redfish/v1/Managers/1/Snooping" + }, + "Syslog": { + "@odata.id": "/redfish/v1/Managers/1/Syslog" + } + } + }, + "SerialConsole": { + "ConnectTypesSupported": [ + "SSH", + "IPMI" + ], + "MaxConcurrentSessions": 1, + "ServiceEnabled": true + }, + "SerialInterfaces": { + "@odata.id": "/redfish/v1/Managers/1/SerialInterfaces" + }, + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "UUID": "00000000-0000-0000-0000-00005E005313", + "VirtualMedia": { + "@odata.id": "/redfish/v1/Managers/1/VM1" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/index.json new file mode 100644 index 0000000..5adb002 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Managers/index.json @@ -0,0 +1,13 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ManagerCollection.ManagerCollection", + "@odata.id": "/redfish/v1/Managers", + "@odata.type": "#ManagerCollection.ManagerCollection", + "Description": "Manager Collection", + "Members": [ + { + "@odata.id": "/redfish/v1/Managers/1" + } + ], + "Members@odata.count": 1, + "Name": "Manager Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/STATUS.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/STATUS.json new file mode 100644 index 0000000..cae7ba2 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/STATUS.json @@ -0,0 +1,6 @@ +{ + "/redfish/v1/Managers/1/IKVM": 403, + "/redfish/v1/Managers/1/VM1/CfgCD": 403, + "/redfish/v1/Systems/1/Storage": 403, + "/redfish/v1/UpdateService": 403 +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/SessionService/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/SessionService/index.json new file mode 100644 index 0000000..1f17550 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/SessionService/index.json @@ -0,0 +1,17 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SessionService.SessionService", + "@odata.id": "/redfish/v1/SessionService", + "@odata.type": "#SessionService.v1_0_0.SessionService", + "Description": "Session Service", + "Id": "SessionService", + "Name": "Session Service", + "ServiceEnabled": true, + "SessionTimeout": 300, + "Sessions": { + "@odata.id": "/redfish/v1/SessionService/Sessions" + }, + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/1/index.json new file mode 100644 index 0000000..978d248 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/1/index.json @@ -0,0 +1,15 @@ +{ + "@odata.context": "/redfish/v1/$metadata#EthernetInterface.EthernetInterface", + "@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces/1", + "@odata.type": "#EthernetInterface.v1_0_0.EthernetInterface", + "Description": "OnBoard #1", + "FQDN": "", + "Id": "1", + "MACAddress": "00:00:5e:00:53:4c", + "Name": "OnBoard LAN 1", + "SpeedMbps": 0, + "Status": { + "Health": "OK", + "State": "Disabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/2/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/2/index.json new file mode 100644 index 0000000..468a280 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/2/index.json @@ -0,0 +1,15 @@ +{ + "@odata.context": "/redfish/v1/$metadata#EthernetInterface.EthernetInterface", + "@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces/2", + "@odata.type": "#EthernetInterface.v1_0_0.EthernetInterface", + "Description": "OnBoard #2", + "FQDN": "", + "Id": "2", + "MACAddress": "00:00:5e:00:53:4d", + "Name": "OnBoard LAN 2", + "SpeedMbps": 0, + "Status": { + "Health": "OK", + "State": "Disabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/index.json new file mode 100644 index 0000000..723ca44 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/EthernetInterfaces/index.json @@ -0,0 +1,16 @@ +{ + "@odata.context": "/redfish/v1/$metadata#EthernetInterfaceCollection.EthernetInterfaceCollection", + "@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces", + "@odata.type": "#EthernetInterfaceCollection.EthernetInterfaceCollection", + "Description": "Simple Network Collection", + "Members": [ + { + "@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces/2" + } + ], + "Members@odata.count": 2, + "Name": "Ethernet Network Interface Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/1/index.json new file mode 100644 index 0000000..fdbf6e3 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/1/index.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#LogEntry.LogEntry", + "@odata.id": "/redfish/v1/Systems/1/LogServices/Log1/Entries/1", + "@odata.type": "#LogEntry.v1_3_0.LogEntry", + "Created": "2026-09-30T17:07:31+01:00", + "EntryCode": "Deassert", + "EntryType": "Event", + "Id": "1", + "Links": { + "Oem": {}, + "OriginOfCondition": { + "@odata.id": "/redfish/v1/Chassis/1/Power" + } + }, + "Message": "[ PS2 Status ] Power Supply Failure", + "MessageArgs": [ + "ArrayOfMessageArgs" + ], + "Name": "Log Entry 1", + "Oem": { + "Supermicro": { + "@odata.type": "#SmcLogEntryExtensions.v1_0_0.LogEntry", + "RawEventData": { + "EventData1": "0xF1", + "EventData2": "0xFF", + "EventData3": "0xFF", + "EventDirAndType": "0xEF", + "SensorName": "PS2 Status", + "SensorType": "0x08" + } + } + }, + "SensorNumber": 201, + "SensorType": "Power supply" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/2/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/2/index.json new file mode 100644 index 0000000..6127fc6 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/2/index.json @@ -0,0 +1,32 @@ +{ + "@odata.context": "/redfish/v1/$metadata#LogEntry.LogEntry", + "@odata.id": "/redfish/v1/Systems/1/LogServices/Log1/Entries/2", + "@odata.type": "#LogEntry.v1_3_0.LogEntry", + "Created": "2026-10-17T09:21:22+01:00", + "EntryCode": "Assert", + "EntryType": "Event", + "Id": "2", + "Links": { + "Oem": {} + }, + "Message": "[ OEM ] Activate Node Product Key", + "MessageArgs": [ + "ArrayOfMessageArgs" + ], + "Name": "Log Entry 2", + "Oem": { + "Supermicro": { + "@odata.type": "#SmcLogEntryExtensions.v1_0_0.LogEntry", + "RawEventData": { + "EventData1": "0x18", + "EventData2": "0x00", + "EventData3": "0xFF", + "EventDirAndType": "0x6F", + "SensorName": "OEM", + "SensorType": "0xCA" + } + } + }, + "OemSensorType": "OOB", + "SensorNumber": 255 +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/index.json new file mode 100644 index 0000000..e701309 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/Entries/index.json @@ -0,0 +1,75 @@ +{ + "@odata.context": "/redfish/v1/$metadata#LogEntryCollection.LogEntryCollection", + "@odata.id": "/redfish/v1/Systems/1/LogServices/Log1/Entries", + "@odata.type": "#LogEntryCollection.LogEntryCollection", + "Description": "Collection of Health Event Logs", + "Members": [ + { + "@odata.id": "/redfish/v1/Systems/1/LogServices/Log1/Entries/1", + "@odata.type": "#LogEntry.v1_3_0.LogEntry", + "Created": "2026-09-30T17:07:31+01:00", + "EntryCode": "Deassert", + "EntryType": "Event", + "Id": "1", + "Links": { + "Oem": {}, + "OriginOfCondition": { + "@odata.id": "/redfish/v1/Chassis/1/Power" + } + }, + "Message": "[ PS2 Status ] Power Supply Failure", + "MessageArgs": [ + "ArrayOfMessageArgs" + ], + "Name": "Log Entry 1", + "Oem": { + "Supermicro": { + "@odata.type": "#SmcLogEntryExtensions.v1_0_0.LogEntry", + "RawEventData": { + "EventData1": "0xF1", + "EventData2": "0xFF", + "EventData3": "0xFF", + "EventDirAndType": "0xEF", + "SensorName": "PS2 Status", + "SensorType": "0x08" + } + } + }, + "SensorNumber": 201, + "SensorType": "Power supply" + }, + { + "@odata.id": "/redfish/v1/Systems/1/LogServices/Log1/Entries/2", + "@odata.type": "#LogEntry.v1_3_0.LogEntry", + "Created": "2026-10-17T09:21:22+01:00", + "EntryCode": "Assert", + "EntryType": "Event", + "Id": "2", + "Links": { + "Oem": {} + }, + "Message": "[ OEM ] Activate Node Product Key", + "MessageArgs": [ + "ArrayOfMessageArgs" + ], + "Name": "Log Entry 2", + "Oem": { + "Supermicro": { + "@odata.type": "#SmcLogEntryExtensions.v1_0_0.LogEntry", + "RawEventData": { + "EventData1": "0x18", + "EventData2": "0x00", + "EventData3": "0xFF", + "EventDirAndType": "0x6F", + "SensorName": "OEM", + "SensorType": "0xCA" + } + } + }, + "OemSensorType": "OOB", + "SensorNumber": 255 + } + ], + "Members@odata.count": 2, + "Name": "Health Event Log Service Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/index.json new file mode 100644 index 0000000..836012e --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/Log1/index.json @@ -0,0 +1,26 @@ +{ + "@odata.context": "/redfish/v1/$metadata#LogService.LogService", + "@odata.id": "/redfish/v1/Systems/1/LogServices/Log1", + "@odata.type": "#LogService.v1_1_0.LogService", + "Actions": { + "#LogService.ClearLog": { + "target": "/redfish/v1/Systems/1/LogServices/Log1/Actions/LogService.ClearLog" + }, + "Oem": {} + }, + "DateTime": "2026-10-17T09:24:36+01:00", + "DateTimeLocalOffset": "+01:00", + "Entries": { + "@odata.id": "/redfish/v1/Systems/1/LogServices/Log1/Entries" + }, + "Id": "Log1", + "MaxNumberOfRecords": 512, + "Name": "Health Event Log Service", + "Oem": {}, + "OverWritePolicy": "WrapsWhenFull", + "ServiceEnabled": true, + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/index.json new file mode 100644 index 0000000..e52065a --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/LogServices/index.json @@ -0,0 +1,13 @@ +{ + "@odata.context": "/redfish/v1/$metadata#LogServiceCollection.LogServiceCollection", + "@odata.id": "/redfish/v1/Systems/1/LogServices", + "@odata.type": "#LogServiceCollection.LogServiceCollection", + "Description": "Collection of Health Event Logs", + "Members": [ + { + "@odata.id": "/redfish/v1/Systems/1/LogServices/Log1" + } + ], + "Members@odata.count": 1, + "Name": "Health Event Log Service Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/1/index.json new file mode 100644 index 0000000..a0c5202 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/1/index.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Memory.Memory", + "@odata.id": "/redfish/v1/Systems/1/Memory/1", + "@odata.type": "#Memory.v1_1_0.Memory", + "AllowedSpeedsMHz": [ + 2133 + ], + "BusWidthBits": 72, + "CapacityMiB": 16384, + "DataWidthBits": 64, + "Description": "Memory", + "DeviceLocator": "P1-DIMMA1", + "Id": "1", + "Manufacturer": "Samsung", + "MemoryDeviceType": "DDR4", + "MemoryLocation": { + "Channel": 0, + "MemoryController": 0, + "Slot": 0, + "Socket": 0 + }, + "MemoryMedia": [ + "DRAM" + ], + "MemoryType": "DRAM", + "Name": "P1-DIMMA1", + "OperatingSpeedMhz": 1866, + "PartNumber": "M393A2G40DB0-CPB", + "RankCount": 1, + "SerialNumber": "SN00000002", + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/2/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/2/index.json new file mode 100644 index 0000000..a330754 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/2/index.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Memory.Memory", + "@odata.id": "/redfish/v1/Systems/1/Memory/2", + "@odata.type": "#Memory.v1_1_0.Memory", + "AllowedSpeedsMHz": [ + 2133 + ], + "BusWidthBits": 72, + "CapacityMiB": 16384, + "DataWidthBits": 64, + "Description": "Memory", + "DeviceLocator": "P1-DIMMB1", + "Id": "2", + "Manufacturer": "Samsung", + "MemoryDeviceType": "DDR4", + "MemoryLocation": { + "Channel": 1, + "MemoryController": 0, + "Slot": 0, + "Socket": 0 + }, + "MemoryMedia": [ + "DRAM" + ], + "MemoryType": "DRAM", + "Name": "P1-DIMMB1", + "OperatingSpeedMhz": 1866, + "PartNumber": "M393A2G40DB0-CPB", + "RankCount": 2, + "SerialNumber": "SN00000003", + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/3/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/3/index.json new file mode 100644 index 0000000..b17a6f7 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/3/index.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Memory.Memory", + "@odata.id": "/redfish/v1/Systems/1/Memory/3", + "@odata.type": "#Memory.v1_1_0.Memory", + "AllowedSpeedsMHz": [ + 2133 + ], + "BusWidthBits": 72, + "CapacityMiB": 16384, + "DataWidthBits": 64, + "Description": "Memory", + "DeviceLocator": "P1-DIMMC1", + "Id": "3", + "Manufacturer": "Micron", + "MemoryDeviceType": "DDR4", + "MemoryLocation": { + "Channel": 2, + "MemoryController": 0, + "Slot": 0, + "Socket": 0 + }, + "MemoryMedia": [ + "DRAM" + ], + "MemoryType": "DRAM", + "Name": "P1-DIMMC1", + "OperatingSpeedMhz": 1866, + "PartNumber": "36ASF2G72PZ-2G1A2", + "RankCount": 3, + "SerialNumber": "SN00000004", + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/4/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/4/index.json new file mode 100644 index 0000000..b8816ac --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/4/index.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Memory.Memory", + "@odata.id": "/redfish/v1/Systems/1/Memory/4", + "@odata.type": "#Memory.v1_1_0.Memory", + "AllowedSpeedsMHz": [ + 2133 + ], + "BusWidthBits": 72, + "CapacityMiB": 16384, + "DataWidthBits": 64, + "Description": "Memory", + "DeviceLocator": "P1-DIMMD1", + "Id": "4", + "Manufacturer": "Micron", + "MemoryDeviceType": "DDR4", + "MemoryLocation": { + "Channel": 3, + "MemoryController": 0, + "Slot": 0, + "Socket": 0 + }, + "MemoryMedia": [ + "DRAM" + ], + "MemoryType": "DRAM", + "Name": "P1-DIMMD1", + "OperatingSpeedMhz": 1866, + "PartNumber": "36ASF2G72PZ-2G1A2", + "RankCount": 4, + "SerialNumber": "SN00000005", + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/5/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/5/index.json new file mode 100644 index 0000000..0e70f8d --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/5/index.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Memory.Memory", + "@odata.id": "/redfish/v1/Systems/1/Memory/5", + "@odata.type": "#Memory.v1_1_0.Memory", + "AllowedSpeedsMHz": [ + 2133 + ], + "BusWidthBits": 72, + "CapacityMiB": 16384, + "DataWidthBits": 64, + "Description": "Memory", + "DeviceLocator": "P2-DIMME1", + "Id": "5", + "Manufacturer": "Micron", + "MemoryDeviceType": "DDR4", + "MemoryLocation": { + "Channel": 0, + "MemoryController": 1, + "Slot": 0, + "Socket": 1 + }, + "MemoryMedia": [ + "DRAM" + ], + "MemoryType": "DRAM", + "Name": "P2-DIMME1", + "OperatingSpeedMhz": 1866, + "PartNumber": "36ASF2G72PZ-2G1A2", + "RankCount": 5, + "SerialNumber": "SN00000006", + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/6/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/6/index.json new file mode 100644 index 0000000..8a5289e --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/6/index.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Memory.Memory", + "@odata.id": "/redfish/v1/Systems/1/Memory/6", + "@odata.type": "#Memory.v1_1_0.Memory", + "AllowedSpeedsMHz": [ + 2133 + ], + "BusWidthBits": 72, + "CapacityMiB": 16384, + "DataWidthBits": 64, + "Description": "Memory", + "DeviceLocator": "P2-DIMMF1", + "Id": "6", + "Manufacturer": "Micron", + "MemoryDeviceType": "DDR4", + "MemoryLocation": { + "Channel": 1, + "MemoryController": 1, + "Slot": 0, + "Socket": 1 + }, + "MemoryMedia": [ + "DRAM" + ], + "MemoryType": "DRAM", + "Name": "P2-DIMMF1", + "OperatingSpeedMhz": 1866, + "PartNumber": "36ASF2G72PZ-2G1A2", + "RankCount": 6, + "SerialNumber": "SN00000007", + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/7/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/7/index.json new file mode 100644 index 0000000..a23bc23 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/7/index.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Memory.Memory", + "@odata.id": "/redfish/v1/Systems/1/Memory/7", + "@odata.type": "#Memory.v1_1_0.Memory", + "AllowedSpeedsMHz": [ + 2133 + ], + "BusWidthBits": 72, + "CapacityMiB": 16384, + "DataWidthBits": 64, + "Description": "Memory", + "DeviceLocator": "P2-DIMMG1", + "Id": "7", + "Manufacturer": "Samsung", + "MemoryDeviceType": "DDR4", + "MemoryLocation": { + "Channel": 2, + "MemoryController": 1, + "Slot": 0, + "Socket": 1 + }, + "MemoryMedia": [ + "DRAM" + ], + "MemoryType": "DRAM", + "Name": "P2-DIMMG1", + "OperatingSpeedMhz": 1866, + "PartNumber": "M393A2G40DB0-CPB", + "RankCount": 7, + "SerialNumber": "SN00000008", + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/8/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/8/index.json new file mode 100644 index 0000000..8fdedbc --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/8/index.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Memory.Memory", + "@odata.id": "/redfish/v1/Systems/1/Memory/8", + "@odata.type": "#Memory.v1_1_0.Memory", + "AllowedSpeedsMHz": [ + 2133 + ], + "BusWidthBits": 72, + "CapacityMiB": 16384, + "DataWidthBits": 64, + "Description": "Memory", + "DeviceLocator": "P2-DIMMH1", + "Id": "8", + "Manufacturer": "Samsung", + "MemoryDeviceType": "DDR4", + "MemoryLocation": { + "Channel": 3, + "MemoryController": 1, + "Slot": 0, + "Socket": 1 + }, + "MemoryMedia": [ + "DRAM" + ], + "MemoryType": "DRAM", + "Name": "P2-DIMMH1", + "OperatingSpeedMhz": 1866, + "PartNumber": "M393A2G40DB0-CPB", + "RankCount": 8, + "SerialNumber": "SN00000009", + "Status": { + "Health": "OK", + "State": "Enabled" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/index.json new file mode 100644 index 0000000..0ccfc6f --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Memory/index.json @@ -0,0 +1,34 @@ +{ + "@odata.context": "/redfish/v1/$metadata#MemoryCollection.MemoryCollection", + "@odata.id": "/redfish/v1/Systems/1/Memory", + "@odata.type": "#MemoryCollection.MemoryCollection", + "Description": "Memory Collection", + "Members": [ + { + "@odata.id": "/redfish/v1/Systems/1/Memory/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1/Memory/2" + }, + { + "@odata.id": "/redfish/v1/Systems/1/Memory/3" + }, + { + "@odata.id": "/redfish/v1/Systems/1/Memory/4" + }, + { + "@odata.id": "/redfish/v1/Systems/1/Memory/5" + }, + { + "@odata.id": "/redfish/v1/Systems/1/Memory/6" + }, + { + "@odata.id": "/redfish/v1/Systems/1/Memory/7" + }, + { + "@odata.id": "/redfish/v1/Systems/1/Memory/8" + } + ], + "Members@odata.count": 8, + "Name": "Memory Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/1/index.json new file mode 100644 index 0000000..6331665 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/1/index.json @@ -0,0 +1,28 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Processor.Processor", + "@odata.id": "/redfish/v1/Systems/1/Processors/1", + "@odata.type": "#Processor.v1_0_0.Processor", + "Description": "Processor", + "Id": "1", + "InstructionSet": "x86-64", + "Manufacturer": "Intel", + "MaxSpeedMHz": 4000, + "Model": "Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz", + "Name": "Processor1", + "ProcessorArchitecture": "x86", + "ProcessorId": { + "EffectiveFamily": "0x6", + "EffectiveModel": "0x3F", + "IdentificationRegisters": "0xBFEBFBFF000306F2", + "Step": "0x2", + "VendorId": "GenuineIntel" + }, + "ProcessorType": "CPU", + "Socket": "CPU1", + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "TotalCores": 6, + "TotalThreads": 12 +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/2/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/2/index.json new file mode 100644 index 0000000..a2b0d04 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/2/index.json @@ -0,0 +1,28 @@ +{ + "@odata.context": "/redfish/v1/$metadata#Processor.Processor", + "@odata.id": "/redfish/v1/Systems/1/Processors/2", + "@odata.type": "#Processor.v1_0_0.Processor", + "Description": "Processor", + "Id": "2", + "InstructionSet": "x86-64", + "Manufacturer": "Intel", + "MaxSpeedMHz": 4000, + "Model": "Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz", + "Name": "Processor2", + "ProcessorArchitecture": "x86", + "ProcessorId": { + "EffectiveFamily": "0x6", + "EffectiveModel": "0x3F", + "IdentificationRegisters": "0xBFEBFBFF000306F2", + "Step": "0x2", + "VendorId": "GenuineIntel" + }, + "ProcessorType": "CPU", + "Socket": "CPU2", + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "TotalCores": 6, + "TotalThreads": 12 +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/index.json new file mode 100644 index 0000000..688e57c --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Processors/index.json @@ -0,0 +1,16 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ProcessorCollection.ProcessorCollection", + "@odata.id": "/redfish/v1/Systems/1/Processors", + "@odata.type": "#ProcessorCollection.ProcessorCollection", + "Description": "Processors Collection", + "Members": [ + { + "@odata.id": "/redfish/v1/Systems/1/Processors/1" + }, + { + "@odata.id": "/redfish/v1/Systems/1/Processors/2" + } + ], + "Members@odata.count": 2, + "Name": "Processors Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/SimpleStorage/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/SimpleStorage/index.json new file mode 100644 index 0000000..9f4f82a --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/SimpleStorage/index.json @@ -0,0 +1,9 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SimpleStorageCollection.SimpleStorageCollection", + "@odata.id": "/redfish/v1/Systems/1/SimpleStorage", + "@odata.type": "#SimpleStorageCollection.SimpleStorageCollection", + "Description": "Simple Storage Collection", + "Members": [], + "Members@odata.count": 0, + "Name": "Simple Storage Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/SmcNodeManager/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/SmcNodeManager/index.json new file mode 100644 index 0000000..66985f8 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/SmcNodeManager/index.json @@ -0,0 +1,62 @@ +{ + "@odata.context": "/redfish/v1/$metadata#SmcNodeManager.SmcNodeManager", + "@odata.id": "/redfish/v1/Systems/1/SmcNodeManager", + "@odata.type": "#SmcNodeManager.v1_0_0.SmcNodeManager", + "Actions": { + "#SmcNodeManager.ClearAllPolicies": { + "target": "/redfish/v1/Systems/1/SmcNodeManager/Actions/SmcNodeManager.ClearAllPolicies" + } + }, + "Capabilities": [ + { + "DomainID": "Entire platform", + "DomainLimitingScope": 16, + "MaxConcurrentSettings": 16, + "MaxCorrectionTime": 600000, + "MaxReportingPeriod": 3600, + "MaxValueAfterReset": 32767, + "MinCorrectionTime": 6000, + "MinReportingPeriod": 1, + "MinValueAfterReset": 1, + "PolicyType": "Power Control Policy" + } + ], + "Id": "Node Manager", + "Name": "Node Manager", + "Policy": [ + { + "CorrectionTimeLimit": 0, + "DomainID": "Entire platform", + "PolicyExceptionActions": 0, + "PolicyID": 1, + "PolicyTriggerLimit": 0, + "PolicyType": 0, + "PowerLimit": 0, + "StatReportingPeriod": 0 + } + ], + "Selftest": { + "ImageFlags": "Operational", + "MajorCode": 85, + "MinorCode": 0 + }, + "Statistics": [ + { + "AverageValue": 101, + "CurrentValue": 90, + "DomainID": "Entire platform", + "MaximumValue": 221, + "MinimumValue": 8, + "Mode": "Global power statistics", + "ReportingPeriod": 1800145, + "Timestamp": "2026-10-17T07:24:33+01:00" + } + ], + "Version": { + "IPMIVersion": "Intel NM IPMI version 3.0", + "IntelNMVersion": "Supported Intel NM 3.0", + "MajorRevision": 3, + "MinorRevision": 19, + "PatchVersion": 0 + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Storage/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Storage/index.json new file mode 100644 index 0000000..6f066b5 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/Storage/index.json @@ -0,0 +1,20 @@ +{ + "error": { + "@Message.ExtendedInfo": [ + { + "Message": "Not licensed to perform this request. The following licenses DCMS were needed", + "MessageArgs": [ + "DCMS " + ], + "MessageId": "Base.v1_4_0.OemLicenseNotPassed", + "RelatedProperties": [ + "" + ], + "Resolution": "Please activate at least one license in above message.", + "Severity": "Warning" + } + ], + "Message": "A general error has occurred. See ExtendedInfo for more information.", + "code": "Base.v1_4_0.GeneralError" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/index.json new file mode 100644 index 0000000..a19687e --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/1/index.json @@ -0,0 +1,112 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ComputerSystem.ComputerSystem", + "@odata.id": "/redfish/v1/Systems/1", + "@odata.type": "#ComputerSystem.v1_3_0.ComputerSystem", + "Actions": { + "#ComputerSystem.Reset": { + "ResetType@Redfish.AllowableValues": [ + "On", + "ForceOff", + "GracefulShutdown", + "GracefulRestart", + "ForceRestart", + "Nmi", + "ForceOn" + ], + "target": "/redfish/v1/Systems/1/Actions/ComputerSystem.Reset" + } + }, + "BiosVersion": "3.1c", + "Boot": { + "BootSourceOverrideEnabled": "Disabled", + "BootSourceOverrideTarget": "None", + "BootSourceOverrideTarget@Redfish.AllowableValues": [ + "None", + "Pxe", + "Hdd", + "Diags", + "CD/DVD", + "BiosSetup", + "FloppyRemovableMedia", + "UsbKey", + "UsbHdd", + "UsbFloppy", + "UsbCd", + "UefiUsbKey", + "UefiCd", + "UefiHdd", + "UefiUsbHdd", + "UefiUsbCd" + ] + }, + "Description": "Description of server", + "EthernetInterfaces": { + "@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces" + }, + "Id": "1", + "IndicatorLED": "Off", + "Links": { + "Chassis": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "ManagedBy": [ + { + "@odata.id": "/redfish/v1/Managers/1" + } + ], + "Oem": {} + }, + "LogServices": { + "@odata.id": "/redfish/v1/Systems/1/LogServices" + }, + "Manufacturer": "Supermicro", + "Memory": { + "@odata.id": "/redfish/v1/Systems/1/Memory" + }, + "MemorySummary": { + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "TotalSystemMemoryGiB": 128 + }, + "Model": "Super Server", + "Name": "System", + "Oem": { + "Supermicro": { + "@odata.type": "#SmcSystemExtensions.v1_0_0.System", + "SmcNodeManager": { + "@odata.id": "/redfish/v1/Systems/1/SmcNodeManager" + } + } + }, + "PartNumber": "X10DRL-i", + "PowerState": "On", + "ProcessorSummary": { + "Count": 2, + "Model": "Intel(R) Xeon(R) processor", + "Status": { + "Health": "OK", + "State": "Enabled" + } + }, + "Processors": { + "@odata.id": "/redfish/v1/Systems/1/Processors" + }, + "SKU": "Default string", + "SerialNumber": "ZM000S000001", + "SimpleStorage": { + "@odata.id": "/redfish/v1/Systems/1/SimpleStorage" + }, + "Status": { + "Health": "Critical", + "State": "Enabled" + }, + "Storage": { + "@odata.id": "/redfish/v1/Systems/1/Storage" + }, + "SystemType": "Physical", + "UUID": "00000000-0000-0000-0000-00005E00534C" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/index.json new file mode 100644 index 0000000..6fd1394 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/Systems/index.json @@ -0,0 +1,13 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ComputerSystemCollection.ComputerSystemCollection", + "@odata.id": "/redfish/v1/Systems", + "@odata.type": "#ComputerSystemCollection.ComputerSystemCollection", + "Description": "Computer System Collection", + "Members": [ + { + "@odata.id": "/redfish/v1/Systems/1" + } + ], + "Members@odata.count": 1, + "Name": "Computer System Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/TaskService/Tasks/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/TaskService/Tasks/index.json new file mode 100644 index 0000000..beba25a --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/TaskService/Tasks/index.json @@ -0,0 +1,8 @@ +{ + "@odata.context": "/redfish/v1/$metadata#TaskCollection.TaskCollection", + "@odata.id": "/redfish/v1/TaskService/Tasks", + "@odata.type": "#TaskCollection.TaskCollection", + "Members": [], + "Members@odata.count": 0, + "Name": "Task Collection" +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/TaskService/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/TaskService/index.json new file mode 100644 index 0000000..f9e48f5 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/TaskService/index.json @@ -0,0 +1,18 @@ +{ + "@odata.context": "/redfish/v1/$metadata#TaskService.TaskService", + "@odata.id": "/redfish/v1/TaskService", + "@odata.type": "#TaskService.v1_0_0.TaskService", + "CompletedTaskOverWritePolicy": "Manual", + "DateTime": "2026-10-17T09:24:32+01:00", + "Id": "TaskService", + "Name": "Tasks Service", + "Oem": {}, + "ServiceEnabled": false, + "Status": { + "Health": "OK", + "State": "Disabled" + }, + "Tasks": { + "@odata.id": "/redfish/v1/TaskService/Tasks" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/UpdateService/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/UpdateService/index.json new file mode 100644 index 0000000..6f066b5 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/UpdateService/index.json @@ -0,0 +1,20 @@ +{ + "error": { + "@Message.ExtendedInfo": [ + { + "Message": "Not licensed to perform this request. The following licenses DCMS were needed", + "MessageArgs": [ + "DCMS " + ], + "MessageId": "Base.v1_4_0.OemLicenseNotPassed", + "RelatedProperties": [ + "" + ], + "Resolution": "Please activate at least one license in above message.", + "Severity": "Warning" + } + ], + "Message": "A general error has occurred. See ExtendedInfo for more information.", + "code": "Base.v1_4_0.GeneralError" + } +} diff --git a/tests/fixtures/supermicro-x10drl-i-3.91/redfish/index.json b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/index.json new file mode 100644 index 0000000..ae07d38 --- /dev/null +++ b/tests/fixtures/supermicro-x10drl-i-3.91/redfish/index.json @@ -0,0 +1,45 @@ +{ + "@odata.context": "/redfish/v1/$metadata#ServiceRoot.ServiceRoot", + "@odata.id": "/redfish/v1/", + "@odata.type": "#ServiceRoot.v1_1_0.ServiceRoot", + "AccountService": { + "@odata.id": "/redfish/v1/AccountService" + }, + "Chassis": { + "@odata.id": "/redfish/v1/Chassis" + }, + "EventService": { + "@odata.id": "/redfish/v1/EventService" + }, + "Id": "RootService", + "JsonSchemas": { + "@odata.id": "/redfish/v1/JsonSchemas" + }, + "Links": { + "Sessions": { + "@odata.id": "/redfish/v1/SessionService/Sessions" + } + }, + "Managers": { + "@odata.id": "/redfish/v1/Managers" + }, + "Name": "Root Service", + "Oem": {}, + "RedfishVersion": "1.0.1", + "Registries": { + "@odata.id": "/redfish/v1/Registries" + }, + "SessionService": { + "@odata.id": "/redfish/v1/SessionService" + }, + "Systems": { + "@odata.id": "/redfish/v1/Systems" + }, + "Tasks": { + "@odata.id": "/redfish/v1/TaskService" + }, + "UUID": "00000000-0000-0000-0000-00005E005313", + "UpdateService": { + "@odata.id": "/redfish/v1/UpdateService" + } +} diff --git a/tests/test_x10_redfish.py b/tests/test_x10_redfish.py new file mode 100644 index 0000000..9151220 --- /dev/null +++ b/tests/test_x10_redfish.py @@ -0,0 +1,91 @@ +"""RedfishDriver against a recording of a real Supermicro X10DRL-i (BMC 3.91, Redfish 1.0.1). + +Recorded 2026-10-17 with an SFT-OOB-LIC license only: the service root and most resources +answer, but ``Systems/1/Storage`` and ``UpdateService`` want the DCMS license as well (403, +``OemLicenseNotPassed``). Serial numbers, UUIDs, MACs, addresses, the host name and the SNMP +communities are scrubbed. ``STATUS.json`` lists the paths that did not answer 200; their +files hold the error body the BMC sent. +""" + +import json + +import pytest +from napalm_device_types import models + +from napalm_redfish import RedfishDriver +from tests.conftest import BASE_URL, FIXTURES, MockupServer + +MOCKUP = "supermicro-x10drl-i-3.91/redfish" +REFUSED = json.loads((FIXTURES / MOCKUP / "STATUS.json").read_text()) + + +@pytest.fixture +def x10(http): + server = MockupServer(http, MOCKUP) + for path, status in REFUSED.items(): + body = json.loads((FIXTURES / MOCKUP / path[len("/redfish/v1/"):] / "index.json") + .read_text()) + server.override("GET", path, status, body) + return server + + +@pytest.fixture +def driver(x10): + d = RedfishDriver(BASE_URL.removeprefix("https://"), "netork", "secret", + optional_args={"verify_ssl": False}) + d.open() + yield d + d.close() + + +def test_the_facts_name_the_board_not_super_server(driver): + facts = driver.get_facts() + assert facts["vendor"] == "Supermicro" + # Systems/1 says "Super Server"; the board is its PartNumber and the chassis model. + assert facts["model"] == "X10DRL-i" + assert facts["os_version"] == "3.91" + assert facts["serial_number"] == "ZM000S000001" + + +def test_the_inventory_survives_the_storage_it_may_not_read(driver): + inv = driver.get_hardware_inventory() + assert set(inv) == set(models.HardwareInventoryDict.__annotations__) + assert inv["model"] == "X10DRL-i" + assert inv["system_uuid"] == "00000000-0000-0000-0000-00005e00534c" + assert len(inv["cpus"]) == 2 + assert len(inv["memory"]) == 8 + assert inv["drives"] == [] + + +def test_the_firmware_comes_from_the_manager_and_the_system_without_updateservice(driver): + assert driver.get_firmware_inventory() == [ + {"name": "BMC", "version": "3.91", "updateable": None}, + {"name": "BIOS", "version": "3.1c", "updateable": None}, + ] + + +def test_the_missing_license_is_named_with_what_it_withholds(driver): + assert driver.get_device_warnings() == [{ + "code": "bmc_license_partial", + "meta": {"licenses": "DCMS", "parts": ["drives", "firmware inventory"]}, + }] + + +def test_the_power_actions_are_the_ones_the_bmc_advertises(driver): + assert driver.get_power_state() == { + "state": "On", + "actions": ["GracefulShutdown", "ForceOff", "GracefulRestart", "ForceRestart"], + } + + +def test_the_protocols_report_ipmi_over_lan_on(driver): + protocols = driver.get_management_protocols() + assert protocols["ipmi"] == {"enabled": True, "port": 623} + assert protocols["https"] == {"enabled": True, "port": 443} + + +def test_the_sensors_and_the_event_log_read(driver): + env = driver.get_environment() + assert len(env["temperature"]) == 19 + assert len(env["fans"]) == 4 + assert isinstance(driver.get_event_log(limit=5), list)