nmstate/
gen_conf.rs

1// SPDX-License-Identifier: Apache-2.0
2
3use std::collections::HashMap;
4
5use crate::{
6    nm::nm_gen_conf, Interface, MergedNetworkState, NetworkState,
7    NetworkStateMode, NmstateError,
8};
9
10impl NetworkState {
11    /// Generate offline network configurations.
12    /// Currently only support generate NetworkManager key file out of
13    /// NetworkState.
14    ///
15    /// The output is a [HashMap] with backend name as key and
16    /// `Vec<(config_file_name, config_content>)>` as value.
17    ///
18    /// The backend name for NetworkManager is `NetworkManager`.
19    pub fn gen_conf(
20        &self,
21    ) -> Result<HashMap<String, Vec<(String, String)>>, NmstateError> {
22        let mut ret = HashMap::new();
23        // Passing a current state with loopback interface, so special
24        // route(like blackhole) can be stored there.
25        let mut cur_state = NetworkState::new();
26        cur_state
27            .interfaces
28            .push(Interface::Loopback(Default::default()));
29
30        let merged_state = MergedNetworkState::new(
31            self.clone(),
32            cur_state,
33            NetworkStateMode::GenerateConfig,
34            false, // memory only
35        )?;
36        ret.insert("NetworkManager".to_string(), nm_gen_conf(&merged_state)?);
37        Ok(ret)
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use crate::{Interface, InterfaceType, Interfaces};
44
45    #[test]
46    fn test_gen_conf_change_unknown_to_eth() {
47        let mut ifaces: Interfaces = serde_yaml::from_str(
48            r"---
49- name: foo
50  state: up
51  ethernet:
52    speed: 1000
53",
54        )
55        .unwrap();
56
57        ifaces.set_unknown_iface_to_eth().unwrap();
58
59        let ifaces = ifaces.to_vec();
60
61        assert_eq!(ifaces.len(), 1);
62        if let Interface::Ethernet(eth_iface) = ifaces[0] {
63            assert_eq!(eth_iface.base.iface_type, InterfaceType::Ethernet);
64            assert_eq!(eth_iface.ethernet.as_ref().unwrap().speed, Some(1000));
65        } else {
66            panic!("Expecting ethernet interface");
67        }
68    }
69}