mod metric_definition;
mod metric_report;
mod metric_report_definition;
use crate::schema::redfish::metric_definition::MetricDefinition as MetricDefinitionSchema;
use crate::schema::redfish::metric_report_definition::MetricReportDefinition as MetricReportDefinitionSchema;
use crate::schema::redfish::telemetry_service::TelemetryService as TelemetryServiceSchema;
use crate::schema::redfish::telemetry_service::TelemetryServiceUpdate;
use crate::Error;
use crate::NvBmc;
use crate::Resource;
use crate::ResourceSchema;
use crate::ServiceRoot;
use nv_redfish_core::Bmc;
use nv_redfish_core::EntityTypeRef as _;
use nv_redfish_core::ModificationResponse;
use nv_redfish_core::NavProperty;
use std::sync::Arc;
#[doc(inline)]
pub use metric_definition::MetricDefinition;
#[doc(inline)]
pub use metric_definition::MetricDefinitionCreate;
#[doc(inline)]
pub use metric_definition::MetricDefinitionUpdate;
#[doc(inline)]
pub use metric_report::MetricReportRef;
#[doc(inline)]
pub use metric_report_definition::MetricReportDefinition;
#[doc(inline)]
pub use metric_report_definition::MetricReportDefinitionCreate;
#[doc(inline)]
pub use metric_report_definition::MetricReportDefinitionType;
#[doc(inline)]
pub use metric_report_definition::MetricReportDefinitionUpdate;
#[doc(inline)]
pub use metric_report_definition::ReportActionsEnum;
#[doc(inline)]
pub use metric_report_definition::Wildcard;
#[doc(inline)]
pub use metric_report_definition::WildcardUpdate;
pub struct TelemetryService<B: Bmc> {
data: Arc<TelemetryServiceSchema>,
bmc: NvBmc<B>,
}
impl<B: Bmc> TelemetryService<B> {
pub(crate) async fn new(
bmc: &NvBmc<B>,
root: &ServiceRoot<B>,
) -> Result<Option<Self>, Error<B>> {
if let Some(service_ref) = &root.root.telemetry_service {
let data = service_ref.get(bmc.as_ref()).await.map_err(Error::Bmc)?;
Ok(Some(Self {
data,
bmc: bmc.clone(),
}))
} else {
Ok(None)
}
}
#[must_use]
pub fn raw(&self) -> Arc<TelemetryServiceSchema> {
self.data.clone()
}
pub async fn set_enabled(&self, enabled: bool) -> Result<Option<Self>, Error<B>> {
let update = TelemetryServiceUpdate::builder()
.with_service_enabled(enabled)
.build();
match self
.bmc
.as_ref()
.update::<_, NavProperty<TelemetryServiceSchema>>(
self.data.odata_id(),
self.data.etag(),
&update,
)
.await
.map_err(Error::Bmc)?
{
ModificationResponse::Entity(nav) => {
let data = nav.get(self.bmc.as_ref()).await.map_err(Error::Bmc)?;
Ok(Some(Self {
data,
bmc: self.bmc.clone(),
}))
}
ModificationResponse::Task(_) | ModificationResponse::Empty => Ok(None),
}
}
pub async fn metric_reports(&self) -> Result<Option<Vec<MetricReportRef<B>>>, Error<B>> {
if let Some(collection_ref) = &self.data.metric_reports {
let collection = collection_ref
.get(self.bmc.as_ref())
.await
.map_err(Error::Bmc)?;
let mut items = Vec::with_capacity(collection.members.len());
for m in &collection.members {
items.push(MetricReportRef::new(
&self.bmc,
NavProperty::new_reference(m.id().clone()),
));
}
Ok(Some(items))
} else {
Ok(None)
}
}
pub async fn metric_definitions(&self) -> Result<Option<Vec<MetricDefinition<B>>>, Error<B>> {
if let Some(collection_ref) = &self.data.metric_definitions {
let collection = self.bmc.expand_property(collection_ref).await?;
let mut items = Vec::with_capacity(collection.members.len());
for m in &collection.members {
items.push(MetricDefinition::new(&self.bmc, m).await?);
}
Ok(Some(items))
} else {
Ok(None)
}
}
pub async fn metric_report_definitions(
&self,
) -> Result<Option<Vec<MetricReportDefinition<B>>>, Error<B>> {
if let Some(collection_ref) = &self.data.metric_report_definitions {
let collection = self.bmc.expand_property(collection_ref).await?;
let mut items = Vec::with_capacity(collection.members.len());
for m in &collection.members {
items.push(MetricReportDefinition::new(&self.bmc, m).await?);
}
Ok(Some(items))
} else {
Ok(None)
}
}
pub async fn create_metric_definition(
&self,
create: &MetricDefinitionCreate,
) -> Result<Option<MetricDefinition<B>>, Error<B>> {
let collection_ref = self
.data
.metric_definitions
.as_ref()
.ok_or(Error::MetricDefinitionsNotAvailable)?;
match self
.bmc
.as_ref()
.create::<_, NavProperty<MetricDefinitionSchema>>(collection_ref.id(), create)
.await
.map_err(Error::Bmc)?
{
ModificationResponse::Entity(nav) => {
MetricDefinition::new(&self.bmc, &nav).await.map(Some)
}
ModificationResponse::Task(_) | ModificationResponse::Empty => Ok(None),
}
}
pub async fn create_metric_report_definition(
&self,
create: &MetricReportDefinitionCreate,
) -> Result<Option<MetricReportDefinition<B>>, Error<B>> {
let collection_ref = self
.data
.metric_report_definitions
.as_ref()
.ok_or(Error::MetricReportDefinitionsNotAvailable)?;
match self
.bmc
.as_ref()
.create::<_, NavProperty<MetricReportDefinitionSchema>>(collection_ref.id(), create)
.await
.map_err(Error::Bmc)?
{
ModificationResponse::Entity(nav) => {
MetricReportDefinition::new(&self.bmc, &nav).await.map(Some)
}
ModificationResponse::Task(_) | ModificationResponse::Empty => Ok(None),
}
}
}
impl<B: Bmc> Resource for TelemetryService<B> {
fn resource_ref(&self) -> &ResourceSchema {
&self.data.as_ref().base
}
}