nv_redfish/chassis/
network_adapter.rs1use crate::hardware_id::HardwareIdRef;
19use crate::hardware_id::Manufacturer as HardwareIdManufacturer;
20use crate::hardware_id::Model as HardwareIdModel;
21use crate::hardware_id::PartNumber as HardwareIdPartNumber;
22use crate::hardware_id::SerialNumber as HardwareIdSerialNumber;
23use crate::schema::network_adapter::NetworkAdapter as NetworkAdapterSchema;
24use crate::schema::network_adapter_collection::NetworkAdapterCollection as NetworkAdapterCollectionSchema;
25use crate::Error;
26use crate::NvBmc;
27use crate::Resource;
28use crate::ResourceSchema;
29use nv_redfish_core::Bmc;
30use nv_redfish_core::NavProperty;
31use std::sync::Arc;
32
33#[cfg(feature = "network-device-functions")]
34use crate::network_device_function::NetworkDeviceFunctionCollection;
35#[cfg(feature = "ports")]
36use crate::port::PortCollection;
37
38pub struct NetworkAdapterCollection<B: Bmc> {
42 bmc: NvBmc<B>,
43 collection: Arc<NetworkAdapterCollectionSchema>,
44}
45
46impl<B: Bmc> NetworkAdapterCollection<B> {
47 pub(crate) async fn new(
49 bmc: &NvBmc<B>,
50 nav: &NavProperty<NetworkAdapterCollectionSchema>,
51 ) -> Result<Self, Error<B>> {
52 let collection = bmc.expand_property(nav).await?;
53 Ok(Self {
54 bmc: bmc.clone(),
55 collection,
56 })
57 }
58
59 pub async fn members(&self) -> Result<Vec<NetworkAdapter<B>>, Error<B>> {
65 let mut members = Vec::new();
66 for m in &self.collection.members {
67 members.push(NetworkAdapter::new(&self.bmc, m).await?);
68 }
69 Ok(members)
70 }
71}
72
73#[doc(hidden)]
74pub enum NetworkAdapterTag {}
75
76pub type Manufacturer<T> = HardwareIdManufacturer<T, NetworkAdapterTag>;
78
79pub type Model<T> = HardwareIdModel<T, NetworkAdapterTag>;
81
82pub type PartNumber<T> = HardwareIdPartNumber<T, NetworkAdapterTag>;
84
85pub type SerialNumber<T> = HardwareIdSerialNumber<T, NetworkAdapterTag>;
87
88pub struct NetworkAdapter<B: Bmc> {
92 #[allow(dead_code)] bmc: NvBmc<B>,
94 data: Arc<NetworkAdapterSchema>,
95}
96
97impl<B: Bmc> NetworkAdapter<B> {
98 pub(crate) async fn new(
100 bmc: &NvBmc<B>,
101 nav: &NavProperty<NetworkAdapterSchema>,
102 ) -> Result<Self, Error<B>> {
103 nav.get(bmc.as_ref())
104 .await
105 .map_err(crate::Error::Bmc)
106 .map(|data| Self {
107 bmc: bmc.clone(),
108 data,
109 })
110 }
111
112 #[must_use]
114 pub fn raw(&self) -> Arc<NetworkAdapterSchema> {
115 self.data.clone()
116 }
117
118 #[must_use]
120 pub fn hardware_id(&self) -> HardwareIdRef<'_, NetworkAdapterTag> {
121 HardwareIdRef {
122 manufacturer: self
123 .data
124 .manufacturer
125 .as_ref()
126 .and_then(Option::as_deref)
127 .map(Manufacturer::new),
128 model: self
129 .data
130 .model
131 .as_ref()
132 .and_then(Option::as_deref)
133 .map(Model::new),
134 part_number: self
135 .data
136 .part_number
137 .as_ref()
138 .and_then(Option::as_deref)
139 .map(PartNumber::new),
140 serial_number: self
141 .data
142 .serial_number
143 .as_ref()
144 .and_then(Option::as_deref)
145 .map(SerialNumber::new),
146 }
147 }
148
149 #[cfg(feature = "network-device-functions")]
157 pub async fn network_device_functions(
158 &self,
159 ) -> Result<Option<NetworkDeviceFunctionCollection<B>>, Error<B>> {
160 if let Some(p) = &self.data.network_device_functions {
161 NetworkDeviceFunctionCollection::new(&self.bmc, p)
162 .await
163 .map(Some)
164 } else {
165 Ok(None)
166 }
167 }
168
169 #[cfg(feature = "ports")]
177 pub async fn ports(&self) -> Result<Option<PortCollection<B>>, Error<B>> {
178 if let Some(ports) = &self.data.ports {
179 PortCollection::new(&self.bmc, ports).await.map(Some)
180 } else {
181 Ok(None)
182 }
183 }
184}
185
186impl<B: Bmc> Resource for NetworkAdapter<B> {
187 fn resource_ref(&self) -> &ResourceSchema {
188 &self.data.as_ref().base
189 }
190}