From 333e82445c048812e3e85fb9f3cb7558dc3f2aeb Mon Sep 17 00:00:00 2001 From: Gris Ge Date: Tue, 25 Apr 2023 14:10:34 +0800 Subject: [PATCH] ip: Fix error when DHCP with auto IP address on STP enabled bridge When DHCP enabled with auto IP address on STP enabled bridge, nmstate will fail with verification error: Verification failure: br0.interface.ipv4.address desire '[]', current 'null' The root cause is STP suspended the DHCP action which cause current state shows null IP address. And nmstate incorrectly treat [] != null for IP address. Fixed in `sanitize_current_for_verify()` to set empty array if None. To reproduce this problem, we just enable DHCP with auto IP address where no DHCP server exists. Integration test case included. Signed-off-by: Gris Ge --- rust/src/lib/query_apply/ip.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/rust/src/lib/query_apply/ip.rs b/rust/src/lib/query_apply/ip.rs index b2d6ac49..a6df740b 100644 --- a/rust/src/lib/query_apply/ip.rs +++ b/rust/src/lib/query_apply/ip.rs @@ -12,6 +12,11 @@ impl InterfaceIpv4 { if self.dhcp_custom_hostname.is_none() { self.dhcp_custom_hostname = Some(String::new()); } + + // No IP address means empty. + if self.enabled && self.addresses.is_none() { + self.addresses = Some(Vec::new()); + } } // Sort addresses and dedup @@ -89,6 +94,11 @@ impl InterfaceIpv6 { if self.dhcp_custom_hostname.is_none() { self.dhcp_custom_hostname = Some(String::new()); } + + // No IP address means empty. + if self.enabled && self.addresses.is_none() { + self.addresses = Some(Vec::new()); + } } // Sort addresses and dedup @@ -96,9 +106,6 @@ impl InterfaceIpv6 { if let Some(addrs) = self.addresses.as_mut() { addrs.sort_unstable(); addrs.dedup(); - if addrs.is_empty() { - self.addresses = None; - } } } pub(crate) fn update(&mut self, other: &Self) { -- 2.40.0