A lightweight Python SDK for managing server BMCs (Baseboard Management Controllers) via the DMTF Redfish protocol. Covers system inventory, hardware inspection, power control, boot management, event subscriptions, and more.
- Comprehensive hardware queries — CPU, memory, drives, GPU, NIC, PCIe, PSU, fans — one line of code each
- Power & boot management — power on/off, restart, PXE/HDD/BIOS boot source switching
- Multi-vendor compatible — auto-adapts to OEM extensions from Huawei, xFusion, Lenovo, HPE, Dell, and others
- Pydantic v2 models — all return values are strongly-typed objects with full IDE autocompletion
- Context manager —
withstatement support for automatic connection cleanup - Minimal dependencies — only
requests,pydantic, andurllib3
- Python >= 3.9
- A network-reachable Redfish-compliant BMC endpoint
# Install from PyPI
pip install redfish-python-sdk
# Or install from GitHub
pip install git+https://github.com/rednote-infra/redfish-python-sdk.git
# Install a specific version
pip install redfish-python-sdk==1.0.0
pip install git+https://github.com/rednote-infra/redfish-python-sdk.git@v1.0.0
# In requirements.txt
# redfish-python-sdk>=1.0.0Credential management: All BMC credentials should be injected via environment variables. Never hardcode them in your source code. Before running examples or tests, set
export BMC_IP=...,export BMC_USER=...,export BMC_PASSWORD=....
import os
from redfish_sdk import RedfishClient
# Connect to BMC (credentials from environment variables)
client = RedfishClient(
host=os.environ["BMC_IP"],
username=os.environ["BMC_USER"],
password=os.environ["BMC_PASSWORD"],
)
# Get system info
system = client.systems.get()
print(f"Server: {system.manufacturer} {system.model}")
print(f"SN: {system.serial_number}")
print(f"Power: {system.power_state}")
# Get CPU info
for cpu in client.get_processors():
print(f"CPU: {cpu.model}, {cpu.total_cores} cores / {cpu.total_threads} threads")
# Get memory info
for mem in client.get_memory():
print(f"DIMM: {mem.manufacturer} {(mem.capacity_mib or 0) // 1024} GB")
# Get drive info
for drive in client.get_drives():
print(f"Drive: {drive.model} {(drive.capacity_bytes or 0) / 1e12:.1f} TB")
# Don't forget to close
client.close()# Run unit tests (no BMC or env vars required)
pytest tests/test_models_mock.py tests/test_client_mock.py -v
# Run offline tests (using pre-collected JSON data)
export REDFISH_JSON_DIR="./testdata"
pytest tests/test_offline_json.py -v
# Run integration tests (requires a real BMC)
export BMC_IP="<your-bmc-ip>"
export BMC_USER="<your-bmc-user>"
export BMC_PASSWORD="<your-bmc-password>"
pytest tests/test_real_bmc.py -vContributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the BSD 3-Clause License.