use crate::schema::redfish::processor::Processor as ProcessorSchema;
use crate::schema::redfish::processor_metrics::ProcessorMetrics;
use crate::Error;
use crate::NvBmc;
use crate::Resource;
use crate::ResourceSchema;
use nv_redfish_core::Bmc;
use nv_redfish_core::NavProperty;
use std::sync::Arc;
#[cfg(feature = "sensors")]
use crate::extract_sensor_uris;
#[cfg(feature = "sensors")]
use crate::sensor::extract_environment_sensors;
#[cfg(feature = "sensors")]
use crate::sensor::SensorRef;
pub struct Processor<B: Bmc> {
bmc: NvBmc<B>,
data: Arc<ProcessorSchema>,
}
impl<B: Bmc> Processor<B> {
pub(crate) async fn new(
bmc: &NvBmc<B>,
nav: &NavProperty<ProcessorSchema>,
) -> Result<Self, Error<B>> {
nav.get(bmc.as_ref())
.await
.map_err(crate::Error::Bmc)
.map(|data| Self {
bmc: bmc.clone(),
data,
})
}
#[must_use]
pub fn raw(&self) -> Arc<ProcessorSchema> {
self.data.clone()
}
pub async fn metrics(&self) -> Result<Option<Arc<ProcessorMetrics>>, Error<B>> {
if let Some(metrics_ref) = &self.data.metrics {
metrics_ref
.get(self.bmc.as_ref())
.await
.map_err(Error::Bmc)
.map(Some)
} else {
Ok(None)
}
}
#[cfg(feature = "sensors")]
pub async fn environment_sensors(&self) -> Result<Vec<SensorRef<B>>, Error<B>> {
let sensor_refs = if let Some(env_ref) = &self.data.environment_metrics {
extract_environment_sensors(env_ref, self.bmc.as_ref()).await?
} else {
Vec::new()
};
Ok(sensor_refs
.into_iter()
.map(|r| SensorRef::new(self.bmc.clone(), r))
.collect())
}
#[cfg(feature = "sensors")]
pub async fn metrics_sensors(&self) -> Result<Vec<SensorRef<B>>, Error<B>> {
let sensor_refs = if let Some(metrics_ref) = &self.data.metrics {
metrics_ref
.get(self.bmc.as_ref())
.await
.map_err(Error::Bmc)
.map(|m| {
extract_sensor_uris!(m,
single: core_voltage,
)
})?
} else {
Vec::new()
};
Ok(sensor_refs
.into_iter()
.map(|r| SensorRef::new(self.bmc.clone(), r))
.collect())
}
}
impl<B: Bmc> Resource for Processor<B> {
fn resource_ref(&self) -> &ResourceSchema {
&self.data.as_ref().base
}
}