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