# nv-redfish

A modular Redfish client stack for Rust.

## Repository structure

- core: Semantic-unaware foundation used by code generated from CSDL
  - Primitives and traits: `Bmc`, `EntityTypeRef`, `Expandable`, `NavProperty<T>`, `Action<T,R>`, `ODataId`, `ODataETag`, `EdmDateTimeOffset`, `EdmDuration`, `Empty`
  - Optional HTTP client behind the `reqwest` feature (enabled by default) in `core::http` (`ReqwestClient`, `HttpBmc`)
  - Goal: provide the minimum building blocks for generated code; no service-specific logic

- redfish: High-level ergonomic wrappers over generated Redfish schema types
  - Feature-gated services (enable only what you need)
  - OEM extensions are feature-gated by vendor/product
  - Patch support (`redfish::patch_support`) to handle vendor quirks while maintaining compatibility
  - Uses generated types included via `redfish::schema` (autogenerated by the CSDL compiler)

- csdl-compiler: CSDL (OData) schema compiler and Rust code generator
  - Reads Redfish (and OEM) CSDL XML, compiles a subset, and generates Rust code
  - Two primary compilation modes:
    - Compile: compile a subset rooted at specific singletons (e.g., `Service`)
    - CompileOem: compile OEM schemas and include them in the root set
  - Entity type inclusion can be controlled with wildcard patterns; only needed types are compiled
  - The generator produces Rust modules and types consumed by the `redfish` crate
  - CLI: `csdl-compiler` with subcommands in `csdl-compiler/src/commands.rs`

## How the pieces fit together

1. Choose features in `nv-redfish` (services, OEM flags). The selected features determine which schemas to include (see `features.toml`) and which high-level wrappers are built.
2. The build uses `csdl-compiler` to generate only the required schema types into the `redfish` crate (via `build.rs`), keeping the binary lightweight.
3. The high-level `nv-redfish` APIs (e.g., `ServiceRoot`, `accounts`) operate over the generated types and the `core` primitives.
4. Provide a `Bmc` implementation. With `core`’s `reqwest` feature, use `HttpBmc<ReqwestClient>`; otherwise, plug in your own transport.

## Feature flags

- core: `reqwest` (default) enables the HTTP client implementation.
- redfish:
  - `std-redfish`: convenience bundle of common service features.
  - Service features: `accounts`, `assembly`, `bios`, `boot-options`, `chassis`, `computer-systems`, `ethernet-interfaces`, `log-services`, `managers`, `memory`, `network-adapters`, `pcie-devices`, `power`, `power-supplies`, `processors`, `secure-boot`, `sensors`, `storages`, `thermal`, `update-service` (plus helper `resource-status`).
  - OEM vendor features: `oem`, `oem-ami`, `oem-dell`, `oem-hpe`, `oem-lenovo`, `oem-supermicro`, `oem-nvidia`.
  - OEM product features: `oem-nvidia-bluefield`, `oem-nvidia-baseboard`.

Use `std-redfish` for broad support and fast onboarding.
For smaller binaries and faster compilation, enable only the specific service/OEM features your client needs.

## Example

Minimal shape:

```rust
// Recursion limit is need to be increased because Redfish has deep
// tree of types reference to each other.
#![recursion_limit = "256"]

use nv_redfish::ServiceRoot;
use nv_redfish_bmc_http::reqwest::Client;
use nv_redfish_bmc_http::{BmcCredentials, CacheSettings, HttpBmc};
use std::sync::Arc;
use url::Url;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let http_client = Client::new()?;
    let bmc = Arc::new(HttpBmc::new(
        http_client,
        Url::parse("https://example.com")?,
        BmcCredentials::new("admin".into(), "password".into()),
        CacheSettings::default(),
    ));

    let root = ServiceRoot::new(Arc::clone(&bmc)).await?;
    println!("BMC vendor: {:?}", root.vendor());
    Ok(())
}
```

## Goals

- Be as lightweight as possible:
  - Compile only schemas referenced by enabled features (`features.toml` driven).
  - Keep the core minimal and transport-agnostic.
- Support a variety of vendors compatibly:
  - Feature-gated OEM extensions.
  - Patch support for schema deviations in real-world BMCs.

## License

See workspace `Cargo.toml`.

This project includes Redfish schema files as submodule from DMTF’s [Redfish-Publications repository](https://github.com/DMTF/Redfish-Publications/tree/main), licensed under the [BSD-3-Clause license](https://github.com/DMTF/Redfish-Publications/blob/main/LICENSE.md).

This project includes Swordfish schema files as submodule from SNIA’s [Swordfish-Publications repository](https://github.com/SNIA/Swordfish-Publications), licensed under the [BSD-3-Clause license](https://github.com/SNIA/Swordfish-Publications/blob/main/LICENSE).

## Contributing

Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details.
