use serde::{Deserialize, Deserializer, Serialize};
use serde_json::Value;
use tracing::debug;
use super::oem::ChassisExtensions;
use super::resource::OData;
use super::{ODataId, ODataLinks, OnOff, PCIeFunction, ResourceStatus};
use crate::NetworkDeviceFunction;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ChassisActions {
#[serde(rename = "#Chassis.Reset")]
pub chassis_reset: Option<ChassisAction>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ChassisAction {
#[serde(rename = "@Redfish.ActionInfo")]
pub title: Option<String>,
pub target: Option<String>, }
#[derive(Debug, Serialize, Deserialize, Default, Copy, Clone, Eq, PartialEq)]
pub enum ChassisType {
Rack,
Blade,
Enclosure,
StandAlone,
RackMount,
Card,
Cartridge,
Row,
Pod,
Expansion,
Sidecar,
Zone,
Sled,
Shelf,
Drawer,
Module,
Component,
IPBasedDrive,
RackGroup,
StorageEnclosure,
ImmersionTank,
HeatExchanger,
#[default]
Other,
}
fn ok_or_default<'a, T, D>(deserializer: D) -> Result<T, D::Error>
where
T: Deserialize<'a> + Default,
D: Deserializer<'a>,
{
let v: Value = Deserialize::deserialize(deserializer)?;
Ok(T::deserialize(v).unwrap_or_else(|e1| {
debug!("Deserialization err: {}. Using default", e1);
T::default()
}))
}
impl std::fmt::Display for ChassisType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Debug::fmt(self, f)
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct Chassis {
#[serde(flatten)]
pub odata: Option<ODataLinks>,
pub actions: Option<ChassisActions>,
pub assembly: Option<ODataId>,
#[serde(default, deserialize_with = "ok_or_default")]
pub chassis_type: Option<ChassisType>,
pub controls: Option<ODataId>,
pub environment_metrics: Option<ODataId>,
pub id: Option<String>,
pub location: Option<Location>,
pub manufacturer: Option<String>,
pub model: Option<String>,
pub name: Option<String>,
pub network_adapters: Option<ODataId>,
#[serde(rename = "PCIeDevices")]
pub pcie_devices: Option<ODataId>,
#[serde(rename = "PCIeSlots")]
pub pcie_slots: Option<ODataId>,
pub part_number: Option<String>,
pub power: Option<ODataId>,
#[serde(default)] pub power_state: Option<OnOff>,
pub power_subsystem: Option<ODataId>,
pub sensors: Option<ODataId>,
pub serial_number: Option<String>,
pub status: Option<ResourceStatus>,
pub thermal: Option<ODataId>,
pub thermal_subsystem: Option<ODataId>,
pub trusted_components: Option<ODataId>,
pub oem: Option<ChassisExtensions>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct NetworkAdapter {
#[serde(flatten)]
pub odata: OData,
pub id: String,
pub manufacturer: Option<String>,
pub model: Option<String>,
pub part_number: Option<String>,
pub serial_number: Option<String>,
pub ports: Option<ODataId>,
pub network_device_functions: Option<ODataId>,
pub name: Option<String>,
pub status: Option<ResourceStatus>,
pub controllers: Option<Vec<NetworkAdapterController>>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct NetworkAdapterController {
pub firmware_package_version: Option<String>,
pub links: Option<NetworkAdapterControllerLinks>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct NetworkAdapterControllerLinks {
pub network_device_functions: Option<Vec<ODataId>>,
pub ports: Option<Vec<ODataId>>,
pub network_ports: Option<Vec<ODataId>>,
#[serde(default, rename = "PCIeDevices")]
pub pcie_devices: Option<Vec<ODataId>>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct Location {
pub part_location: Option<PartLocation>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct PartLocation {
pub location_type: Option<String>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct Assembly {
#[serde(flatten)]
pub odata: Option<ODataLinks>,
#[serde(default)]
pub assemblies: Vec<AssemblyData>,
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct AssemblyData {
#[serde(rename = "@odata.id")]
pub odata_id: Option<String>,
pub location: Option<Location>,
#[serde(default)]
pub member_id: String,
pub model: Option<String>,
pub name: Option<String>,
pub part_number: Option<String>,
pub physical_context: Option<String>,
pub production_date: Option<String>,
pub serial_number: Option<String>,
pub vendor: Option<String>,
pub version: Option<String>,
}
pub struct MachineNetworkAdapter {
pub is_dpu: bool,
pub mac_address: Option<String>,
pub network_device_function: NetworkDeviceFunction,
pub pcie_function: PCIeFunction,
}