nv_redfish/telemetry_service/
mod.rs1mod metric_definition;
21mod metric_report_definition;
22
23use crate::entity_link::EntityLink;
24use crate::schema::metric_definition::MetricDefinition as MetricDefinitionSchema;
25use crate::schema::metric_report::MetricReport as MetricReportSchema;
26use crate::schema::metric_report_definition::MetricReportDefinition as MetricReportDefinitionSchema;
27use crate::schema::telemetry_service::TelemetryService as TelemetryServiceSchema;
28use crate::schema::telemetry_service::TelemetryServiceUpdate;
29use crate::Error;
30use crate::NvBmc;
31use crate::Resource;
32use crate::ResourceSchema;
33use crate::ServiceRoot;
34use nv_redfish_core::Bmc;
35use nv_redfish_core::EntityTypeRef as _;
36use nv_redfish_core::ModificationResponse;
37use nv_redfish_core::NavProperty;
38use std::sync::Arc;
39
40#[doc(inline)]
41pub use metric_definition::MetricDefinition;
42#[doc(inline)]
43pub use metric_definition::MetricDefinitionCreate;
44#[doc(inline)]
45pub use metric_definition::MetricDefinitionUpdate;
46#[doc(inline)]
47pub use metric_report_definition::MetricReportDefinition;
48#[doc(inline)]
49pub use metric_report_definition::MetricReportDefinitionCreate;
50#[doc(inline)]
51pub use metric_report_definition::MetricReportDefinitionType;
52#[doc(inline)]
53pub use metric_report_definition::MetricReportDefinitionUpdate;
54#[doc(inline)]
55pub use metric_report_definition::ReportActionsEnum;
56#[doc(inline)]
57pub use metric_report_definition::Wildcard;
58#[doc(inline)]
59pub use metric_report_definition::WildcardUpdate;
60
61pub type MetricReportLink<B> = EntityLink<B, MetricReportSchema>;
63
64pub struct TelemetryService<B: Bmc> {
68 data: Arc<TelemetryServiceSchema>,
69 bmc: NvBmc<B>,
70}
71
72impl<B: Bmc> TelemetryService<B> {
73 pub(crate) async fn new(
75 bmc: &NvBmc<B>,
76 root: &ServiceRoot<B>,
77 ) -> Result<Option<Self>, Error<B>> {
78 if let Some(service_ref) = &root.root.telemetry_service {
79 let data = service_ref.get(bmc.as_ref()).await.map_err(Error::Bmc)?;
80 Ok(Some(Self {
81 data,
82 bmc: bmc.clone(),
83 }))
84 } else {
85 Ok(None)
86 }
87 }
88
89 #[must_use]
91 pub fn raw(&self) -> Arc<TelemetryServiceSchema> {
92 self.data.clone()
93 }
94
95 pub async fn set_enabled(&self, enabled: bool) -> Result<Option<Self>, Error<B>> {
101 let update = TelemetryServiceUpdate::builder()
102 .with_service_enabled(enabled)
103 .build();
104
105 match self
106 .bmc
107 .as_ref()
108 .update::<_, NavProperty<TelemetryServiceSchema>>(
109 self.data.odata_id(),
110 self.data.etag(),
111 &update,
112 )
113 .await
114 .map_err(Error::Bmc)?
115 {
116 ModificationResponse::Entity(nav) => {
117 let data = nav.get(self.bmc.as_ref()).await.map_err(Error::Bmc)?;
118 Ok(Some(Self {
119 data,
120 bmc: self.bmc.clone(),
121 }))
122 }
123 ModificationResponse::Task(_) | ModificationResponse::Empty => Ok(None),
124 }
125 }
126
127 pub async fn metric_report_links(&self) -> Result<Option<Vec<MetricReportLink<B>>>, Error<B>> {
138 if let Some(collection_ref) = &self.data.metric_reports {
139 let collection = collection_ref
140 .get(self.bmc.as_ref())
141 .await
142 .map_err(Error::Bmc)?;
143
144 let mut items = Vec::with_capacity(collection.members.len());
145 for m in &collection.members {
146 items.push(MetricReportLink::new(
147 &self.bmc,
148 NavProperty::new_reference(m.id().clone()),
149 ));
150 }
151
152 Ok(Some(items))
153 } else {
154 Ok(None)
155 }
156 }
157
158 pub async fn metric_definitions(&self) -> Result<Option<Vec<MetricDefinition<B>>>, Error<B>> {
168 if let Some(collection_ref) = &self.data.metric_definitions {
169 let collection = self.bmc.expand_property(collection_ref).await?;
170
171 let mut items = Vec::with_capacity(collection.members.len());
172 for m in &collection.members {
173 items.push(MetricDefinition::new(&self.bmc, m).await?);
174 }
175
176 Ok(Some(items))
177 } else {
178 Ok(None)
179 }
180 }
181
182 pub async fn metric_report_definitions(
193 &self,
194 ) -> Result<Option<Vec<MetricReportDefinition<B>>>, Error<B>> {
195 if let Some(collection_ref) = &self.data.metric_report_definitions {
196 let collection = self.bmc.expand_property(collection_ref).await?;
197
198 let mut items = Vec::with_capacity(collection.members.len());
199 for m in &collection.members {
200 items.push(MetricReportDefinition::new(&self.bmc, m).await?);
201 }
202
203 Ok(Some(items))
204 } else {
205 Ok(None)
206 }
207 }
208
209 pub async fn create_metric_definition(
217 &self,
218 create: &MetricDefinitionCreate,
219 ) -> Result<Option<MetricDefinition<B>>, Error<B>> {
220 let collection_ref = self
221 .data
222 .metric_definitions
223 .as_ref()
224 .ok_or(Error::MetricDefinitionsNotAvailable)?;
225
226 match self
227 .bmc
228 .as_ref()
229 .create::<_, NavProperty<MetricDefinitionSchema>>(collection_ref.id(), create)
230 .await
231 .map_err(Error::Bmc)?
232 {
233 ModificationResponse::Entity(nav) => {
234 MetricDefinition::new(&self.bmc, &nav).await.map(Some)
235 }
236 ModificationResponse::Task(_) | ModificationResponse::Empty => Ok(None),
237 }
238 }
239
240 pub async fn create_metric_report_definition(
248 &self,
249 create: &MetricReportDefinitionCreate,
250 ) -> Result<Option<MetricReportDefinition<B>>, Error<B>> {
251 let collection_ref = self
252 .data
253 .metric_report_definitions
254 .as_ref()
255 .ok_or(Error::MetricReportDefinitionsNotAvailable)?;
256
257 match self
258 .bmc
259 .as_ref()
260 .create::<_, NavProperty<MetricReportDefinitionSchema>>(collection_ref.id(), create)
261 .await
262 .map_err(Error::Bmc)?
263 {
264 ModificationResponse::Entity(nav) => {
265 MetricReportDefinition::new(&self.bmc, &nav).await.map(Some)
266 }
267 ModificationResponse::Task(_) | ModificationResponse::Empty => Ok(None),
268 }
269 }
270}
271
272impl<B: Bmc> Resource for TelemetryService<B> {
273 fn resource_ref(&self) -> &ResourceSchema {
274 &self.data.as_ref().base
275 }
276}