Blame SOURCES/BZ_1932247-nm.applier-ignore-not-desired-unmanaged-ifaces.patch

520691
From fb9352b902f8fec813c149e02e97c7014ef6399c Mon Sep 17 00:00:00 2001
520691
From: Fernando Fernandez Mancera <ffmancera@riseup.net>
520691
Date: Mon, 1 Mar 2021 16:25:57 +0100
520691
Subject: [PATCH] nm.applier: ignore not desired unmanaged ifaces
520691
520691
Nmstate will ignore not desired unmanaged interfaces. If an existing
520691
unmanaged port of a bridge is not being included in the desired state
520691
bridge port list, it will not be removed. Basically, Nmstate will not be
520691
able to remove unmanaged ports from a bridge.
520691
520691
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
520691
---
520691
 libnmstate/ifaces/ifaces.py               | 11 ++++++---
520691
 libnmstate/nm/applier.py                  | 11 ++++++++-
520691
 tests/integration/linux_bridge_test.py    |  1 +
520691
 tests/integration/nm/linux_bridge_test.py | 30 +++--------------------
520691
 4 files changed, 21 insertions(+), 32 deletions(-)
520691
520691
diff --git a/libnmstate/ifaces/ifaces.py b/libnmstate/ifaces/ifaces.py
520691
index 5f1f548d..cfc306c6 100644
520691
--- a/libnmstate/ifaces/ifaces.py
520691
+++ b/libnmstate/ifaces/ifaces.py
520691
@@ -193,7 +193,7 @@ class Ifaces:
520691
         if not defiend in desire state
520691
         """
520691
         for iface in self._ifaces.values():
520691
-            if iface.is_up and iface.is_master:
520691
+            if iface.is_desired and iface.is_up and iface.is_master:
520691
                 cur_iface = self.current_ifaces.get(iface.name)
520691
                 for slave_name in iface.slaves:
520691
                     if cur_iface and slave_name in cur_iface.slaves:
520691
@@ -353,14 +353,17 @@ class Ifaces:
520691
 
520691
     def _remove_unknown_interface_type_slaves(self):
520691
         """
520691
-        When master containing slaves with unknown interface type, they should
520691
-        be removed from master slave list before verifying.
520691
+        When master containing slaves with unknown interface type or down
520691
+        state, they should be removed from master slave list before verifying.
520691
         """
520691
         for iface in self._ifaces.values():
520691
             if iface.is_up and iface.is_master and iface.slaves:
520691
                 for slave_name in iface.slaves:
520691
                     slave_iface = self._ifaces[slave_name]
520691
-                    if slave_iface.type == InterfaceType.UNKNOWN:
520691
+                    if (
520691
+                        slave_iface.type == InterfaceType.UNKNOWN
520691
+                        or slave_iface.state != InterfaceState.UP
520691
+                    ):
520691
                         iface.remove_slave(slave_name)
520691
 
520691
     def verify(self, cur_iface_infos):
520691
diff --git a/libnmstate/nm/applier.py b/libnmstate/nm/applier.py
520691
index cd319ffb..da2dab5b 100644
520691
--- a/libnmstate/nm/applier.py
520691
+++ b/libnmstate/nm/applier.py
520691
@@ -80,7 +80,16 @@ def apply_changes(context, net_state, save_to_disk):
520691
     _preapply_dns_fix(context, net_state)
520691
     _mark_nm_external_subordinate_changed(context, net_state)
520691
 
520691
-    ifaces_desired_state = net_state.ifaces.state_to_edit
520691
+    ifaces_desired_state = []
520691
+    for iface in net_state.ifaces.all_ifaces.values():
520691
+        nm_dev = context.get_nm_dev(iface.name)
520691
+        if nm_dev and not nm_dev.get_managed() and not iface.is_desired:
520691
+            # We don't change NM.Device from unmanaged to managed unless
520691
+            # been asked explicitly in desire state
520691
+            continue
520691
+        if iface.is_changed or iface.is_desired:
520691
+            ifaces_desired_state.append(iface.to_dict())
520691
+
520691
     ifaces_desired_state.extend(
520691
         _create_proxy_ifaces_desired_state(ifaces_desired_state)
520691
     )
520691
-- 
520691
2.29.2
520691