Blame SOURCES/BZ_1861263-handle-external-managed-interface.patch

96886b
From ea7f304cc1ad32c3f2c25b49bf6b2663f348496a Mon Sep 17 00:00:00 2001
96886b
From: Gris Ge <fge@redhat.com>
96886b
Date: Tue, 28 Jul 2020 15:59:11 +0800
96886b
Subject: [PATCH] nm: Mark external subordinate as changed
96886b
96886b
When user create bond with subordinate interfaces using non-NM
96886b
tools(iproute), the NetworkManager will mark the subordinates as
96886b
managed externally.
96886b
96886b
When the desire state only contains the main interface, nmstate
96886b
noticing the slave list is unchanged, so only activate the main
96886b
interface, then NM remove the subordinate from their main interface.
96886b
96886b
To workaround that, mark subordinate interfaces as changed when they are
96886b
managed by NM as externally.
96886b
96886b
Integration test case included.
96886b
96886b
Signed-off-by: Gris Ge <fge@redhat.com>
96886b
---
96886b
 libnmstate/nm/applier.py | 24 ++++++++++++++++++++++++
96886b
 1 file changed, 24 insertions(+)
96886b
96886b
diff --git a/libnmstate/nm/applier.py b/libnmstate/nm/applier.py
96886b
index a91cee5..68d11dc 100644
96886b
--- a/libnmstate/nm/applier.py
96886b
+++ b/libnmstate/nm/applier.py
96886b
@@ -79,6 +79,7 @@ def apply_changes(context, net_state, save_to_disk):
96886b
         )
96886b
 
96886b
     _preapply_dns_fix(context, net_state)
96886b
+    _mark_nm_external_subordinate_changed(context, net_state)
96886b
 
96886b
     ifaces_desired_state = net_state.ifaces.state_to_edit
96886b
     ifaces_desired_state.extend(
96886b
@@ -625,3 +626,26 @@ def _has_ovs_interface_desired_or_changed(net_state):
96886b
             InterfaceType.OVS_PORT,
96886b
         ) and (iface.is_desired or iface.is_changed):
96886b
             return True
96886b
+
96886b
+
96886b
+def _mark_nm_external_subordinate_changed(context, net_state):
96886b
+    """
96886b
+    When certain main interface contains subordinates is marked as
96886b
+    connected(externally), it means its profile is memory only and will lost
96886b
+    on next deactivation.
96886b
+    For this case, we should mark the subordinate as changed.
96886b
+    that subordinate should be marked as changed for NM to take over.
96886b
+    """
96886b
+    for iface in net_state.ifaces.values():
96886b
+        if iface.type in MASTER_IFACE_TYPES:
96886b
+            for subordinate in iface.slaves:
96886b
+                nmdev = context.get_nm_dev(subordinate)
96886b
+                if nmdev:
96886b
+                    nm_ac = nmdev.get_active_connection()
96886b
+                    if (
96886b
+                        nm_ac
96886b
+                        and NM.ActivationStateFlags.EXTERNAL
96886b
+                        & nm_ac.get_state_flags()
96886b
+                    ):
96886b
+                        subordinate_iface = net_state.ifaces[subordinate]
96886b
+                        subordinate_iface.mark_as_changed()
96886b
-- 
96886b
2.27.0
96886b