Skip to main content

nv_redfish/chassis/
network_adapter.rs

1// SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2// SPDX-License-Identifier: Apache-2.0
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16//! Network adapters
17//!
18
19use crate::hardware_id::HardwareIdRef;
20use crate::hardware_id::Manufacturer as HardwareIdManufacturer;
21use crate::hardware_id::Model as HardwareIdModel;
22use crate::hardware_id::PartNumber as HardwareIdPartNumber;
23use crate::hardware_id::SerialNumber as HardwareIdSerialNumber;
24use crate::schema::redfish::network_adapter::NetworkAdapter as NetworkAdapterSchema;
25use crate::schema::redfish::network_adapter_collection::NetworkAdapterCollection as NetworkAdapterCollectionSchema;
26use crate::Error;
27use crate::NvBmc;
28use crate::Resource;
29use crate::ResourceSchema;
30use nv_redfish_core::Bmc;
31use nv_redfish_core::NavProperty;
32use std::marker::PhantomData;
33use std::sync::Arc;
34
35/// Network adapters collection.
36///
37/// Provides functions to access collection members.
38pub struct NetworkAdapterCollection<B: Bmc> {
39    bmc: NvBmc<B>,
40    collection: Arc<NetworkAdapterCollectionSchema>,
41}
42
43impl<B: Bmc> NetworkAdapterCollection<B> {
44    /// Create a new manager collection handle.
45    pub(crate) async fn new(
46        bmc: &NvBmc<B>,
47        nav: &NavProperty<NetworkAdapterCollectionSchema>,
48    ) -> Result<Self, Error<B>> {
49        let collection = bmc.expand_property(nav).await?;
50        Ok(Self {
51            bmc: bmc.clone(),
52            collection,
53        })
54    }
55
56    /// List all managers available in this BMC.
57    ///
58    /// # Errors
59    ///
60    /// Returns an error if fetching manager data fails.
61    pub async fn members(&self) -> Result<Vec<NetworkAdapter<B>>, Error<B>> {
62        let mut members = Vec::new();
63        for m in &self.collection.members {
64            members.push(NetworkAdapter::new(&self.bmc, m).await?);
65        }
66        Ok(members)
67    }
68}
69
70#[doc(hidden)]
71pub enum NetworkAdapterTag {}
72
73/// Network adapter manufacturer.
74pub type Manufacturer<T> = HardwareIdManufacturer<T, NetworkAdapterTag>;
75
76/// Network adapter model.
77pub type Model<T> = HardwareIdModel<T, NetworkAdapterTag>;
78
79/// Network adapter part number.
80pub type PartNumber<T> = HardwareIdPartNumber<T, NetworkAdapterTag>;
81
82/// Network adapter serial number.
83pub type SerialNumber<T> = HardwareIdSerialNumber<T, NetworkAdapterTag>;
84
85/// Network Adapter.
86///
87/// Provides functions to access log entries and perform log operations.
88pub struct NetworkAdapter<B: Bmc> {
89    data: Arc<NetworkAdapterSchema>,
90    _marker: PhantomData<B>,
91}
92
93impl<B: Bmc> NetworkAdapter<B> {
94    /// Create a new log service handle.
95    pub(crate) async fn new(
96        bmc: &NvBmc<B>,
97        nav: &NavProperty<NetworkAdapterSchema>,
98    ) -> Result<Self, Error<B>> {
99        nav.get(bmc.as_ref())
100            .await
101            .map_err(crate::Error::Bmc)
102            .map(|data| Self {
103                data,
104                _marker: PhantomData,
105            })
106    }
107
108    /// Get the raw schema data for this ethernet adapter.
109    #[must_use]
110    pub fn raw(&self) -> Arc<NetworkAdapterSchema> {
111        self.data.clone()
112    }
113
114    /// Get hardware identifier of the network adpater.
115    #[must_use]
116    pub fn hardware_id(&self) -> HardwareIdRef<'_, NetworkAdapterTag> {
117        HardwareIdRef {
118            manufacturer: self
119                .data
120                .manufacturer
121                .as_ref()
122                .and_then(Option::as_deref)
123                .map(Manufacturer::new),
124            model: self
125                .data
126                .model
127                .as_ref()
128                .and_then(Option::as_deref)
129                .map(Model::new),
130            part_number: self
131                .data
132                .part_number
133                .as_ref()
134                .and_then(Option::as_deref)
135                .map(PartNumber::new),
136            serial_number: self
137                .data
138                .serial_number
139                .as_ref()
140                .and_then(Option::as_deref)
141                .map(SerialNumber::new),
142        }
143    }
144}
145
146impl<B: Bmc> Resource for NetworkAdapter<B> {
147    fn resource_ref(&self) -> &ResourceSchema {
148        &self.data.as_ref().base
149    }
150}