nv_redfish/session_service/
collection.rs1use crate::schema::session::Session as SessionSchema;
19use crate::schema::session_collection::SessionCollection as SessionCollectionSchema;
20use crate::session_service::Session;
21use crate::session_service::SessionCreate;
22use crate::Error;
23use crate::NvBmc;
24use nv_redfish_core::Bmc;
25use nv_redfish_core::EntityTypeRef as _;
26use nv_redfish_core::NavProperty;
27use std::sync::Arc;
28
29pub struct SessionCollection<B: Bmc> {
33 bmc: NvBmc<B>,
34 collection: Arc<SessionCollectionSchema>,
35}
36
37impl<B: Bmc> SessionCollection<B> {
38 pub(crate) async fn new(
39 bmc: NvBmc<B>,
40 collection_ref: &NavProperty<SessionCollectionSchema>,
41 ) -> Result<Self, Error<B>> {
42 let collection = bmc.expand_property(collection_ref).await?;
43 Ok(Self { bmc, collection })
44 }
45
46 pub async fn members(&self) -> Result<Vec<Session<B>>, Error<B>> {
52 let mut members = Vec::with_capacity(self.collection.members.len());
53 for member in &self.collection.members {
54 members.push(Session::new(&self.bmc, member).await?);
55 }
56 Ok(members)
57 }
58
59 pub async fn create_session(&self, create: &SessionCreate) -> Result<Session<B>, Error<B>> {
65 let response = self
66 .bmc
67 .as_ref()
68 .create_session::<_, SessionSchema>(self.collection.as_ref().odata_id(), create)
69 .await
70 .map_err(Error::Bmc)?;
71 Ok(Session::from_data_with_session_metadata(
72 self.bmc.clone(),
73 response.entity,
74 Some(response.auth_token),
75 Some(response.location),
76 ))
77 }
78}