diff --git a/rust/migrate-wicked/src/interface.rs b/rust/migrate-wicked/src/interface.rs index 7244aa50ec..87189f2763 100644 --- a/rust/migrate-wicked/src/interface.rs +++ b/rust/migrate-wicked/src/interface.rs @@ -1,4 +1,6 @@ -use agama_dbus_server::network::model::{self, IpConfig, IpRoute, Ipv4Method, Ipv6Method}; +use agama_dbus_server::network::model::{ + self, IpConfig, IpRoute, Ipv4Method, Ipv6Method, MacAddress, +}; use cidr::IpInet; use serde::{Deserialize, Serialize}; use serde_with::{ @@ -24,6 +26,8 @@ pub struct Interface { pub ipv6_dhcp: Option, #[serde(rename = "ipv6-auto", skip_serializing_if = "Option::is_none")] pub ipv6_auto: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub dummy: Option, #[serde(rename = "@origin")] pub origin: String, } @@ -110,6 +114,12 @@ pub struct Ipv6Auto { pub update: Vec, } +#[skip_serializing_none] +#[derive(Debug, PartialEq, Default, Serialize, Deserialize)] +pub struct Dummy { + pub address: Option, +} + #[derive(Debug, PartialEq, SerializeDisplay, DeserializeFromStr, EnumString, Display)] #[strum(serialize_all = "kebab_case")] pub enum FailOverMac { @@ -145,15 +155,27 @@ pub struct IpConfigResult { impl Interface { pub fn to_connection(&self) -> Result { let ip_config = self.to_ip_config()?; - let base = model::BaseConnection { + let mut base = model::BaseConnection { id: self.name.clone(), interface: self.name.clone(), ip_config: ip_config.ip_config, ..Default::default() }; + if let Some(dummy) = &self.dummy { + if let Some(address) = &dummy.address { + base.mac_address = MacAddress::from_str(address)?; + } + } + + let connection = if self.dummy.is_some() { + model::Connection::Dummy(model::DummyConnection { base }) + } else { + model::Connection::Ethernet(model::EthernetConnection { base }) + }; + Ok(ConnectionResult { - connection: model::Connection::Ethernet(model::EthernetConnection { base }), + connection, warnings: ip_config.warnings, }) } @@ -417,4 +439,21 @@ mod tests { assert_eq!(static_connection.base().ip_config.method6, Ipv6Method::Auto); assert_eq!(static_connection.base().ip_config.addresses.len(), 0); } + + #[test] + fn test_dummy_interface_to_connection() { + let dummy_interface = Interface { + dummy: Some(Dummy { + address: Some("12:34:56:78:9A:BC".to_string()), + }), + ..Default::default() + }; + + let connection: model::Connection = dummy_interface.to_connection().unwrap().connection; + assert!(matches!(connection, model::Connection::Dummy(_))); + assert_eq!( + connection.base().mac_address.to_string(), + "12:34:56:78:9A:BC" + ); + } } diff --git a/rust/migrate-wicked/tests/dummy/system-connections/dummy0.nmconnection b/rust/migrate-wicked/tests/dummy/system-connections/dummy0.nmconnection new file mode 100644 index 0000000000..c1cf616a34 --- /dev/null +++ b/rust/migrate-wicked/tests/dummy/system-connections/dummy0.nmconnection @@ -0,0 +1,23 @@ +[connection] +id=dummy0 +uuid=d5c90a99-bde4-4c92-884c-d8208d8fb6da +type=dummy +interface-name=dummy0 + +[ethernet] +cloned-mac-address=12:34:56:78:9A:BC + +[dummy] + +[match] + +[ipv4] +address1=10.0.0.100/24 +method=manual + +[ipv6] +addr-gen-mode=default +address1=2001:db8:1::1/64 +method=manual + +[proxy] diff --git a/rust/migrate-wicked/tests/dummy/system-connections/dummy1.nmconnection b/rust/migrate-wicked/tests/dummy/system-connections/dummy1.nmconnection new file mode 100644 index 0000000000..262574be11 --- /dev/null +++ b/rust/migrate-wicked/tests/dummy/system-connections/dummy1.nmconnection @@ -0,0 +1,22 @@ +[connection] +id=dummy1 +uuid=b551cd5a-d139-4297-a79f-d7dd33a97879 +type=dummy +interface-name=dummy1 + +[ethernet] + +[dummy] + +[match] + +[ipv4] +address1=10.0.0.101/24 +method=manual + +[ipv6] +addr-gen-mode=default +address1=2001:db8:1::2/64 +method=manual + +[proxy] diff --git a/rust/migrate-wicked/tests/dummy/wicked_xml/dummy.xml b/rust/migrate-wicked/tests/dummy/wicked_xml/dummy.xml new file mode 100644 index 0000000000..2678a6ac58 --- /dev/null +++ b/rust/migrate-wicked/tests/dummy/wicked_xml/dummy.xml @@ -0,0 +1,56 @@ + + dummy0 + + boot + + + +
12:34:56:78:9A:BC
+
+ + + true + + +
+ 10.0.0.100/24 +
+
+ + true + prefer-public + false + + +
+ 2001:db8:1::1/64 +
+
+
+ + dummy1 + + boot + + + + + + true + + +
+ 10.0.0.101/24 +
+
+ + true + prefer-public + false + + +
+ 2001:db8:1::2/64 +
+
+