Skip to main content

rackfish - Dynamic Redfish Client

PyPI version Python Versions License: MIT Build Status codecov Code style: black

A lightweight, dynamic Python client for interacting with Redfish BMC (Baseboard Management Controller) APIs. Provides intuitive access to server hardware management through lazy-loaded object graphs, automatic OEM property surfacing, and validated action invocation.

🎯 Why rackfish?

  • 🚀 Zero Dependencies (except requests) - Minimal footprint
  • ⚡ Lazy Loading - Resources fetched on-demand for performance
  • 🎨 Pythonic Interface - JSON properties become Python attributes
  • 🔧 OEM Support - Vendor extensions (Huawei, Dell, HPE) automatically accessible
  • 🔗 Smart Navigation - Related resources directly navigable via Links
  • ✅ Action Validation - Parameter validation using ActionInfo schemas
  • 📚 Collection Support - Iterate Redfish collections naturally
  • 🔐 Flexible Auth - Session tokens or Basic authentication

Installation

pip install rackfish

From source

git clone https://github.com/thefrolov/rackfish.git
cd rackfish
pip install -e .

Development installation

pip install -e ".[dev]"

Quick Start

from rackfish import RedfishClient

# Connect to BMC
client = RedfishClient("https://bmc.example.com", "admin", "password", 
                       use_session=True, verify_ssl=False)
root = client.connect()

# Power control - multiple ways to access systems
system = next(iter(client.Systems))  # Traditional iteration
system = client.Systems.Members[0]    # Direct member access
system = client.System                # Singular form (if only one member!)

system.Reset(ResetType="GracefulRestart")

# Access OEM properties (auto-surfaced)
if hasattr(system, "BootMode"):
    print(f"Boot Mode: {system.BootMode}")

# Navigate linked resources
for chassis in system.Chassis:
    print(f"Chassis: {chassis.Name}")

# Logout
client.logout()

Documentation

Common Use Cases

User Management

accounts = client.AccountService.Accounts
new_user = accounts.create({"UserName": "operator", "Password": "pass", "RoleId": "Operator"})
new_user.RoleId = "Administrator"
new_user.delete()

Storage Management

storage = next(iter(client.Systems)).Storage[0]
volume = storage.Volumes.create({"Name": "DataVol", "CapacityBytes": 500*1024**3})

Network Configuration

port = client.Managers[0].EthernetInterfaces[0]
port.patch({"IPv4Addresses": [{"Address": "192.168.1.100", "SubnetMask": "255.255.255.0"}]})

Event Subscriptions

subs = client.EventService.Subscriptions
sub = subs.create({"Destination": "https://listener/events", "EventTypes": ["Alert"]})

Firmware Updates

client.UpdateService.SimpleUpdate(ImageURI="http://server/fw.bin", TransferProtocol="HTTP")

System Health Monitoring

for temp in chassis.Thermal.Temperatures:
    print(f"{temp.Name}: {temp.ReadingCelsius}°C")

See docs/EXAMPLES.md for 100+ more examples covering:

  • BIOS configuration
  • Certificate management
  • Virtual media (KVM)
  • LDAP authentication
  • Boot order configuration
  • SEL/log collection
  • And much more...

Project Structure

rackfish/
├── rackfish/          # Main package
│   ├── __init__.py       # Package initialization
│   └── client.py         # Core library implementation
├── tests/                # Test suite
│   ├── __init__.py
│   ├── test_common_usage.py
│   ├── test_oem_links_surfacing.py
│   └── test_recursion_fix.py
├── examples/             # Usage examples
│   ├── examples_comprehensive.py
│   ├── demo_surfacing_comprehensive.py
│   └── example_oem_links.py
├── docs/                 # Documentation
│   ├── INDEX.md
│   ├── EXAMPLES.md
│   ├── USE_CASES.md
│   ├── TESTS.md
│   ├── OEM_LINKS_SURFACING.md
│   └── COMPLETION_SUMMARY.md
├── .github/
│   └── copilot-instructions.md
├── README.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── pyproject.toml
└── requirements.txt

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Architecture

Core Components

  • RedfishClient - HTTP session management, authentication, base URL handling
  • RedfishResource - Dynamic resource representation with lazy loading
  • _convert - Recursive JSON-to-object mapping with link stub creation
  • _hydrate - Property mapping, OEM/Links surfacing, action binding

Key Design Patterns

  1. Lazy Loading - Link stubs defer fetching until attribute access
  2. OEM Surfacing - Vendor properties promoted to main object (collision-safe)
  3. Links Surfacing - Related resources directly accessible (collision-safe)
  4. Action Methods - Redfish Actions bound as callable instance methods
  5. ActionInfo Validation - Parameter schemas fetched and enforced

Recursion Guard

Deeply nested JSON structures are handled safely by deferring hydration (fetched=False) for all embedded resources, preventing stack overflow.

Supported Use Cases

The library supports 150+ common Redfish operations including:

System Management

  • Power control (Reset, ForceOff, GracefulRestart)
  • Boot order configuration
  • System health monitoring

Storage

  • Logical drive creation/deletion
  • Storage controller management
  • Drive inventory and status

Network

  • IP configuration (IPv4/IPv6)
  • VLAN management
  • DNS/NTP configuration
  • SNMP trap configuration

User & Security

  • User account CRUD
  • Role assignment
  • Password policies
  • LDAP integration

Certificates

  • CSR generation
  • SSL/TLS certificate import
  • SSH public key management
  • Two-factor authentication certs

Firmware & BIOS

  • Firmware updates
  • BIOS configuration
  • BMC reset/rollback

Monitoring & Logs

  • Temperature sensors
  • Fan speeds
  • Voltage readings
  • System event logs (SEL)

Virtual Media

  • ISO mounting (KVM)
  • VNC/KVM configuration
  • Virtual media operations

See EXAMPLES.md for complete list and code samples.

OEM Vendor Support

Works with any Redfish-compliant BMC including:

  • Huawei - TaiShan servers, FruControl, custom boot modes
  • Dell - iDRAC, DellAttributes
  • HPE - iLO, HPE-specific extensions
  • Lenovo - XClarity
  • Supermicro - IPMI/Redfish hybrid
  • And any other vendor implementing Redfish standard

OEM extensions are automatically surfaced to the main object for easy access.

Advanced Features

Generic Request Helpers

For operations not exposed as methods:

response = client.get("/redfish/v1/custom/path")
client.post("/redfish/v1/Actions/Custom", data={"param": "value"})
client.patch("/redfish/v1/Systems/1", data={"AssetTag": "NEW"})
client.delete("/redfish/v1/Collection/Item")

Allowable Values

Get valid parameter values:

reset_types = system.get_allowable_values("ResetType")
print(f"Valid reset types: {reset_types}")

Raw JSON Access

raw_data = resource.to_dict()

Contributing

See .github/copilot-instructions.md for development guidelines and architecture details.

License

See LICENSE file.

Version

Current version: 1.0.3

Requirements

  • Python 3.8+
  • requests library

Support

For issues, questions, or contributions, please refer to the project repository.

Metadata

Release files for rackfish 1.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rackfish 1.0.3
File Size Uploaded
rackfish-1.0.3.tar.gz 55.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for rackfish 1.0.3
File Interpreter ABI Platform
rackfish-1.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 68.3 kB

Release files / rackfish-1.0.3.tar.gz

Download URL rackfish-1.0.3.tar.gz
Size 55.0 kB
Tags Source
SHA-256 checksum
How to use checksums
e27f9fe0705a83d0da2e2bf0170924576f1c62f03368cfbe8ccea716aa1c1c6c
BLAKE2b-256 checksum
How to use checksums
4a590360e22a3aac6757ec2ec364701a20e2c0397decdfdfea488c10b12ffb11
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2025.

Transparency log

Release files / rackfish-1.0.3-py3-none-any.whl

Download URL rackfish-1.0.3-py3-none-any.whl
Size 13.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9e7608ab21cc55673ae24a04eb2b58eb51bc0f7f3a4e355f1dffb63bfdf7e038
BLAKE2b-256 checksum
How to use checksums
317faeba4593b8ddc9f40c966c95dd6c79023d4d45a98b71c448527591289186
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.3 This release

2 release files

1.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page