nv_redfish/telemetry_service/
mod.rs1mod metric_definition;
21mod metric_report;
22mod metric_report_definition;
23
24use crate::schema::redfish::telemetry_service::TelemetryService as TelemetryServiceSchema;
25use crate::schema::redfish::telemetry_service::TelemetryServiceUpdate;
26use crate::Error;
27use crate::NvBmc;
28use crate::Resource;
29use crate::ResourceSchema;
30use crate::ServiceRoot;
31use nv_redfish_core::Bmc;
32use nv_redfish_core::Empty;
33use nv_redfish_core::EntityTypeRef as _;
34use nv_redfish_core::NavProperty;
35use std::sync::Arc;
36
37#[doc(inline)]
38pub use metric_definition::MetricDefinition;
39#[doc(inline)]
40pub use metric_definition::MetricDefinitionCreate;
41#[doc(inline)]
42pub use metric_definition::MetricDefinitionUpdate;
43#[doc(inline)]
44pub use metric_report::MetricReportRef;
45#[doc(inline)]
46pub use metric_report_definition::MetricReportDefinition;
47#[doc(inline)]
48pub use metric_report_definition::MetricReportDefinitionCreate;
49#[doc(inline)]
50pub use metric_report_definition::MetricReportDefinitionType;
51#[doc(inline)]
52pub use metric_report_definition::MetricReportDefinitionUpdate;
53#[doc(inline)]
54pub use metric_report_definition::ReportActionsEnum;
55#[doc(inline)]
56pub use metric_report_definition::Wildcard;
57#[doc(inline)]
58pub use metric_report_definition::WildcardUpdate;
59
60pub struct TelemetryService<B: Bmc> {
64 data: Arc<TelemetryServiceSchema>,
65 bmc: NvBmc<B>,
66}
67
68impl<B: Bmc> TelemetryService<B> {
69 pub(crate) async fn new(
71 bmc: &NvBmc<B>,
72 root: &ServiceRoot<B>,
73 ) -> Result<Option<Self>, Error<B>> {
74 if let Some(service_ref) = &root.root.telemetry_service {
75 let data = service_ref.get(bmc.as_ref()).await.map_err(Error::Bmc)?;
76 Ok(Some(Self {
77 data,
78 bmc: bmc.clone(),
79 }))
80 } else {
81 Ok(None)
82 }
83 }
84
85 #[must_use]
87 pub fn raw(&self) -> Arc<TelemetryServiceSchema> {
88 self.data.clone()
89 }
90
91 pub async fn set_enabled(&self, enabled: bool) -> Result<Self, Error<B>> {
97 let update = TelemetryServiceUpdate::builder()
98 .with_service_enabled(enabled)
99 .build();
100
101 let updated = self
102 .bmc
103 .as_ref()
104 .update(self.data.odata_id(), self.data.etag(), &update)
105 .await
106 .map_err(Error::Bmc)?;
107
108 Ok(Self {
109 data: Arc::new(updated),
110 bmc: self.bmc.clone(),
111 })
112 }
113
114 pub async fn metric_reports(&self) -> Result<Option<Vec<MetricReportRef<B>>>, Error<B>> {
125 if let Some(collection_ref) = &self.data.metric_reports {
126 let collection = collection_ref
127 .get(self.bmc.as_ref())
128 .await
129 .map_err(Error::Bmc)?;
130
131 let mut items = Vec::with_capacity(collection.members.len());
132 for m in &collection.members {
133 items.push(MetricReportRef::new(
134 &self.bmc,
135 NavProperty::new_reference(m.id().clone()),
136 ));
137 }
138
139 Ok(Some(items))
140 } else {
141 Ok(None)
142 }
143 }
144
145 pub async fn metric_definitions(&self) -> Result<Option<Vec<MetricDefinition<B>>>, Error<B>> {
155 if let Some(collection_ref) = &self.data.metric_definitions {
156 let collection = collection_ref
157 .get(self.bmc.as_ref())
158 .await
159 .map_err(Error::Bmc)?;
160
161 let mut items = Vec::with_capacity(collection.members.len());
162 for m in &collection.members {
163 items.push(MetricDefinition::new(&self.bmc, m).await?);
164 }
165
166 Ok(Some(items))
167 } else {
168 Ok(None)
169 }
170 }
171
172 pub async fn metric_report_definitions(
183 &self,
184 ) -> Result<Option<Vec<MetricReportDefinition<B>>>, Error<B>> {
185 if let Some(collection_ref) = &self.data.metric_report_definitions {
186 let collection = collection_ref
187 .get(self.bmc.as_ref())
188 .await
189 .map_err(Error::Bmc)?;
190
191 let mut items = Vec::with_capacity(collection.members.len());
192 for m in &collection.members {
193 items.push(MetricReportDefinition::new(&self.bmc, m).await?);
194 }
195
196 Ok(Some(items))
197 } else {
198 Ok(None)
199 }
200 }
201
202 pub async fn create_metric_definition(
210 &self,
211 create: &MetricDefinitionCreate,
212 ) -> Result<Empty, Error<B>> {
213 let collection_ref = self
214 .data
215 .metric_definitions
216 .as_ref()
217 .ok_or(Error::MetricDefinitionsNotAvailable)?;
218
219 self.bmc
220 .as_ref()
221 .create(collection_ref.id(), create)
222 .await
223 .map_err(Error::Bmc)
224 }
225
226 pub async fn create_metric_report_definition(
234 &self,
235 create: &MetricReportDefinitionCreate,
236 ) -> Result<Empty, Error<B>> {
237 let collection_ref = self
238 .data
239 .metric_report_definitions
240 .as_ref()
241 .ok_or(Error::MetricReportDefinitionsNotAvailable)?;
242
243 self.bmc
244 .as_ref()
245 .create(collection_ref.id(), create)
246 .await
247 .map_err(Error::Bmc)
248 }
249}
250
251impl<B: Bmc> Resource for TelemetryService<B> {
252 fn resource_ref(&self) -> &ResourceSchema {
253 &self.data.as_ref().base
254 }
255}