nv_redfish/
service_root.rs1use crate::bmc_quirks::BmcQuirks;
17use crate::core::Bmc;
18use crate::core::NavProperty;
19use crate::core::ODataId;
20use crate::schema::redfish::service_root::ServiceRoot as SchemaServiceRoot;
21use crate::Error;
22use crate::NvBmc;
23use crate::ProtocolFeatures;
24use crate::Resource;
25use crate::ResourceSchema;
26use std::sync::Arc;
27use tagged_types::TaggedType;
28
29#[cfg(feature = "accounts")]
30use crate::account::AccountService;
31#[cfg(feature = "chassis")]
32use crate::chassis::ChassisCollection;
33#[cfg(feature = "computer-systems")]
34use crate::computer_system::SystemCollection;
35#[cfg(feature = "event-service")]
36use crate::event_service::EventService;
37#[cfg(feature = "managers")]
38use crate::manager::ManagerCollection;
39#[cfg(feature = "oem-hpe")]
40use crate::oem::hpe::HpeiLoServiceExt;
41#[cfg(feature = "telemetry-service")]
42use crate::telemetry_service::TelemetryService;
43#[cfg(feature = "update-service")]
44use crate::update_service::UpdateService;
45
46pub type Vendor<T> = TaggedType<T, VendorTag>;
48#[doc(hidden)]
49#[derive(tagged_types::Tag)]
50#[implement(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
51#[transparent(Debug, Display, Serialize, Deserialize)]
52#[capability(inner_access, cloned)]
53pub enum VendorTag {}
54
55pub type Product<T> = TaggedType<T, ProductTag>;
57#[doc(hidden)]
58#[derive(tagged_types::Tag)]
59#[implement(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
60#[transparent(Debug, Display, Serialize, Deserialize)]
61#[capability(inner_access, cloned)]
62pub enum ProductTag {}
63
64pub type RedfishVersion<'a> = TaggedType<&'a str, RedfishVersionTag>;
66#[doc(hidden)]
67#[derive(tagged_types::Tag)]
68#[implement(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
69#[transparent(Debug, Display, Serialize, Deserialize)]
70#[capability(inner_access, cloned)]
71pub enum RedfishVersionTag {}
72
73#[derive(Clone)]
75pub struct ServiceRoot<B: Bmc> {
76 pub root: Arc<SchemaServiceRoot>,
78 #[allow(dead_code)] bmc: NvBmc<B>,
80}
81
82impl<B: Bmc> ServiceRoot<B> {
83 pub async fn new(bmc: Arc<B>) -> Result<Self, Error<B>> {
89 let root = NavProperty::<SchemaServiceRoot>::new_reference(ODataId::service_root())
90 .get(bmc.as_ref())
91 .await
92 .map_err(Error::Bmc)?;
93 let quirks = BmcQuirks::new(&root);
94 let mut protocol_features = root
95 .protocol_features_supported
96 .as_ref()
97 .map(ProtocolFeatures::new)
98 .unwrap_or_default();
99
100 if quirks.expand_is_not_working_properly() {
101 protocol_features.expand.expand_all = false;
102 protocol_features.expand.no_links = false;
103 }
104
105 let bmc = NvBmc::new(bmc, protocol_features, quirks);
106 Ok(Self { root, bmc })
107 }
108
109 #[must_use]
111 pub fn replace_bmc(self, bmc: Arc<B>) -> Self {
112 let root = self.root;
113 let bmc = self.bmc.replace_bmc(bmc);
114 Self { root, bmc }
115 }
116
117 #[must_use]
119 pub fn restrict_expand(self) -> Self {
120 let root = self.root;
121 let bmc = self.bmc.restrict_expand();
122 Self { root, bmc }
123 }
124
125 pub fn vendor(&self) -> Option<Vendor<&str>> {
127 self.root
128 .vendor
129 .as_ref()
130 .and_then(Option::as_ref)
131 .map(String::as_str)
132 .map(Vendor::new)
133 }
134
135 pub fn product(&self) -> Option<Product<&str>> {
137 self.root
138 .product
139 .as_ref()
140 .and_then(Option::as_ref)
141 .map(String::as_str)
142 .map(Product::new)
143 }
144
145 pub fn redfish_version(&self) -> Option<RedfishVersion<'_>> {
147 self.root
148 .redfish_version
149 .as_deref()
150 .map(RedfishVersion::new)
151 }
152
153 #[cfg(feature = "accounts")]
161 pub async fn account_service(&self) -> Result<Option<AccountService<B>>, Error<B>> {
162 AccountService::new(&self.bmc, self).await
163 }
164
165 #[cfg(feature = "chassis")]
173 pub async fn chassis(&self) -> Result<Option<ChassisCollection<B>>, Error<B>> {
174 ChassisCollection::new(&self.bmc, self).await
175 }
176
177 #[cfg(feature = "computer-systems")]
185 pub async fn systems(&self) -> Result<Option<SystemCollection<B>>, Error<B>> {
186 SystemCollection::new(&self.bmc, self).await
187 }
188
189 #[cfg(feature = "update-service")]
197 pub async fn update_service(&self) -> Result<Option<UpdateService<B>>, Error<B>> {
198 UpdateService::new(&self.bmc, self).await
199 }
200
201 #[cfg(feature = "event-service")]
209 pub async fn event_service(&self) -> Result<Option<EventService<B>>, Error<B>> {
210 EventService::new(&self.bmc, self).await
211 }
212
213 #[cfg(feature = "telemetry-service")]
221 pub async fn telemetry_service(&self) -> Result<Option<TelemetryService<B>>, Error<B>> {
222 TelemetryService::new(&self.bmc, self).await
223 }
224
225 #[cfg(feature = "managers")]
233 pub async fn managers(&self) -> Result<Option<ManagerCollection<B>>, Error<B>> {
234 ManagerCollection::new(&self.bmc, self).await
235 }
236
237 #[cfg(feature = "oem-hpe")]
245 pub fn oem_hpe_ilo_service_ext(&self) -> Result<Option<HpeiLoServiceExt<B>>, Error<B>> {
246 HpeiLoServiceExt::new(&self.root)
247 }
248}
249
250impl<B: Bmc> Resource for ServiceRoot<B> {
251 fn resource_ref(&self) -> &ResourceSchema {
252 &self.root.as_ref().base
253 }
254}