nv_redfish/manager/
item.rs1use crate::schema::redfish::manager::Manager as ManagerSchema;
17use crate::Error;
18use crate::NvBmc;
19use crate::Resource;
20use crate::ResourceSchema;
21use nv_redfish_core::Bmc;
22use nv_redfish_core::NavProperty;
23use std::sync::Arc;
24
25#[cfg(feature = "ethernet-interfaces")]
26use crate::ethernet_interface::EthernetInterfaceCollection;
27#[cfg(feature = "host-interfaces")]
28use crate::host_interface::HostInterfaceCollection;
29#[cfg(feature = "log-services")]
30use crate::log_service::LogService;
31#[cfg(feature = "oem-ami")]
32use crate::oem::ami::config_bmc::ConfigBmc as AmiConfigBmc;
33#[cfg(feature = "oem-dell-attributes")]
34use crate::oem::dell::attributes::DellAttributes;
35#[cfg(feature = "oem-hpe")]
36use crate::oem::hpe::manager::HpeManager;
37#[cfg(feature = "oem-lenovo")]
38use crate::oem::lenovo::manager::LenovoManager;
39#[cfg(feature = "oem-supermicro")]
40use crate::oem::supermicro::manager::SupermicroManager;
41
42pub struct Manager<B: Bmc> {
46 #[allow(dead_code)] bmc: NvBmc<B>,
48 data: Arc<ManagerSchema>,
49}
50
51impl<B: Bmc> Manager<B> {
52 pub(crate) async fn new(
54 bmc: &NvBmc<B>,
55 nav: &NavProperty<ManagerSchema>,
56 ) -> Result<Self, Error<B>> {
57 nav.get(bmc.as_ref())
58 .await
59 .map_err(Error::Bmc)
60 .map(|data| Self {
61 bmc: bmc.clone(),
62 data,
63 })
64 }
65
66 #[must_use]
71 pub fn raw(&self) -> Arc<ManagerSchema> {
72 self.data.clone()
73 }
74
75 #[cfg(feature = "ethernet-interfaces")]
83 pub async fn ethernet_interfaces(
84 &self,
85 ) -> Result<Option<EthernetInterfaceCollection<B>>, crate::Error<B>> {
86 if let Some(p) = &self.data.ethernet_interfaces {
87 EthernetInterfaceCollection::new(&self.bmc, p)
88 .await
89 .map(Some)
90 } else {
91 Ok(None)
92 }
93 }
94
95 #[cfg(feature = "host-interfaces")]
103 pub async fn host_interfaces(
104 &self,
105 ) -> Result<Option<HostInterfaceCollection<B>>, crate::Error<B>> {
106 if let Some(p) = &self.data.host_interfaces {
107 HostInterfaceCollection::new(&self.bmc, p).await.map(Some)
108 } else {
109 Ok(None)
110 }
111 }
112
113 #[cfg(feature = "log-services")]
121 pub async fn log_services(&self) -> Result<Option<Vec<LogService<B>>>, crate::Error<B>> {
122 if let Some(log_services_ref) = &self.data.log_services {
123 let log_services_collection = log_services_ref
124 .get(self.bmc.as_ref())
125 .await
126 .map_err(crate::Error::Bmc)?;
127
128 let mut log_services = Vec::new();
129 for m in &log_services_collection.members {
130 log_services.push(LogService::new(&self.bmc, m).await?);
131 }
132
133 Ok(Some(log_services))
134 } else {
135 Ok(None)
136 }
137 }
138
139 #[cfg(feature = "oem-dell-attributes")]
147 pub async fn oem_dell_attributes(&self) -> Result<Option<DellAttributes<B>>, Error<B>> {
148 DellAttributes::manager_attributes(&self.bmc, &self.data).await
149 }
150
151 #[cfg(feature = "oem-lenovo")]
159 pub fn oem_lenovo(&self) -> Result<Option<LenovoManager<B>>, Error<B>> {
160 LenovoManager::new(&self.bmc, &self.data)
161 }
162
163 #[cfg(feature = "oem-hpe")]
171 pub fn oem_hpe(&self) -> Result<Option<HpeManager<B>>, Error<B>> {
172 HpeManager::new(&self.bmc, &self.data)
173 }
174
175 #[cfg(feature = "oem-supermicro")]
183 pub fn oem_supermicro(&self) -> Result<Option<SupermicroManager<B>>, Error<B>> {
184 SupermicroManager::new(&self.bmc, &self.data)
185 }
186
187 #[cfg(feature = "oem-ami")]
195 pub async fn oem_ami_config_bmc(&self) -> Result<Option<AmiConfigBmc<B>>, Error<B>> {
196 AmiConfigBmc::new(&self.bmc, &self.data).await
197 }
198}
199
200impl<B: Bmc> Resource for Manager<B> {
201 fn resource_ref(&self) -> &ResourceSchema {
202 &self.data.as_ref().base
203 }
204}