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 = "log-services")]
28use crate::log_service::LogService;
29
30pub struct Manager<B: Bmc> {
34 bmc: NvBmc<B>,
35 data: Arc<ManagerSchema>,
36}
37
38impl<B: Bmc> Manager<B> {
39 pub(crate) async fn new(
41 bmc: &NvBmc<B>,
42 nav: &NavProperty<ManagerSchema>,
43 ) -> Result<Self, Error<B>> {
44 nav.get(bmc.as_ref())
45 .await
46 .map_err(Error::Bmc)
47 .map(|data| Self {
48 bmc: bmc.clone(),
49 data,
50 })
51 }
52
53 #[must_use]
58 pub fn raw(&self) -> Arc<ManagerSchema> {
59 self.data.clone()
60 }
61
62 #[cfg(feature = "ethernet-interfaces")]
70 pub async fn ethernet_interfaces(
71 &self,
72 ) -> Result<EthernetInterfaceCollection<B>, crate::Error<B>> {
73 let p = self
74 .data
75 .ethernet_interfaces
76 .as_ref()
77 .ok_or(crate::Error::EthernetInterfacesNotAvailable)?;
78 EthernetInterfaceCollection::new(&self.bmc, p).await
79 }
80
81 #[cfg(feature = "log-services")]
89 pub async fn log_services(&self) -> Result<Vec<LogService<B>>, crate::Error<B>> {
90 let log_services_ref = self
91 .data
92 .log_services
93 .as_ref()
94 .ok_or(crate::Error::LogServiceNotAvailable)?;
95
96 let log_services_collection = log_services_ref
97 .get(self.bmc.as_ref())
98 .await
99 .map_err(crate::Error::Bmc)?;
100
101 let mut log_services = Vec::new();
102 for m in &log_services_collection.members {
103 log_services.push(LogService::new(&self.bmc, m).await?);
104 }
105
106 Ok(log_services)
107 }
108}
109
110impl<B: Bmc> Resource for Manager<B> {
111 fn resource_ref(&self) -> &ResourceSchema {
112 &self.data.as_ref().base
113 }
114}