use crate::schema::manager::Manager as ManagerSchema;
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 = "ethernet-interfaces")]
use crate::ethernet_interface::EthernetInterfaceCollection;
#[cfg(feature = "host-interfaces")]
use crate::host_interface::HostInterfaceCollection;
#[cfg(feature = "log-services")]
use crate::log_service::LogService;
#[cfg(feature = "oem-ami")]
use crate::oem::ami::config_bmc::ConfigBmc as AmiConfigBmc;
#[cfg(feature = "oem-dell-attributes")]
use crate::oem::dell::attributes::DellAttributes;
#[cfg(feature = "oem-hpe")]
use crate::oem::hpe::manager::HpeManager;
#[cfg(feature = "oem-lenovo")]
use crate::oem::lenovo::manager::LenovoManager;
#[cfg(feature = "oem-supermicro")]
use crate::oem::supermicro::manager::SupermicroManager;
pub struct Manager<B: Bmc> {
#[allow(dead_code)] bmc: NvBmc<B>,
data: Arc<ManagerSchema>,
}
impl<B: Bmc> Manager<B> {
pub(crate) async fn new(
bmc: &NvBmc<B>,
nav: &NavProperty<ManagerSchema>,
) -> Result<Self, Error<B>> {
nav.get(bmc.as_ref())
.await
.map_err(Error::Bmc)
.map(|data| Self {
bmc: bmc.clone(),
data,
})
}
#[must_use]
pub fn raw(&self) -> Arc<ManagerSchema> {
self.data.clone()
}
#[cfg(feature = "ethernet-interfaces")]
pub async fn ethernet_interfaces(
&self,
) -> Result<Option<EthernetInterfaceCollection<B>>, crate::Error<B>> {
if let Some(p) = &self.data.ethernet_interfaces {
EthernetInterfaceCollection::new(&self.bmc, p)
.await
.map(Some)
} else {
Ok(None)
}
}
#[cfg(feature = "host-interfaces")]
pub async fn host_interfaces(
&self,
) -> Result<Option<HostInterfaceCollection<B>>, crate::Error<B>> {
if let Some(p) = &self.data.host_interfaces {
HostInterfaceCollection::new(&self.bmc, p).await.map(Some)
} else {
Ok(None)
}
}
#[cfg(feature = "log-services")]
pub async fn log_services(&self) -> Result<Option<Vec<LogService<B>>>, crate::Error<B>> {
if let Some(log_services_ref) = &self.data.log_services {
let log_services_collection = log_services_ref
.get(self.bmc.as_ref())
.await
.map_err(crate::Error::Bmc)?;
let mut log_services = Vec::new();
for m in &log_services_collection.members {
log_services.push(LogService::new(&self.bmc, m).await?);
}
Ok(Some(log_services))
} else {
Ok(None)
}
}
#[cfg(feature = "oem-dell-attributes")]
pub async fn oem_dell_attributes(&self) -> Result<Option<DellAttributes<B>>, Error<B>> {
DellAttributes::manager_attributes(&self.bmc, &self.data).await
}
#[cfg(feature = "oem-lenovo")]
pub fn oem_lenovo(&self) -> Result<Option<LenovoManager<B>>, Error<B>> {
LenovoManager::new(&self.bmc, &self.data)
}
#[cfg(feature = "oem-hpe")]
pub fn oem_hpe(&self) -> Result<Option<HpeManager<B>>, Error<B>> {
HpeManager::new(&self.bmc, &self.data)
}
#[cfg(feature = "oem-supermicro")]
pub fn oem_supermicro(&self) -> Result<Option<SupermicroManager<B>>, Error<B>> {
SupermicroManager::new(&self.bmc, &self.data)
}
#[cfg(feature = "oem-ami")]
pub async fn oem_ami_config_bmc(&self) -> Result<Option<AmiConfigBmc<B>>, Error<B>> {
AmiConfigBmc::new(&self.bmc, &self.data).await
}
}
impl<B: Bmc> Resource for Manager<B> {
fn resource_ref(&self) -> &ResourceSchema {
&self.data.as_ref().base
}
}