packit / rpms / nmstate

Forked from rpms/nmstate a year ago
Clone

Files

Blob Blame History Raw
From 333e82445c048812e3e85fb9f3cb7558dc3f2aeb Mon Sep 17 00:00:00 2001
From: Gris Ge <fge@redhat.com>
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 <fge@redhat.com>
---
 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