From 95d77329b30c9a9a435a881941e27f9a1bed074e Mon Sep 17 00:00:00 2001
From: Fernando Fernandez Mancera <ffmancera@riseup.net>
Date: Wed, 5 May 2021 10:14:40 +0200
Subject: [PATCH 1/2] nm.profile: do not activate new interfaces twice
The current code is always adding the action MODIFIED if the interface
is marked as up on the desired state. When a new interface is being
added, Nmstate is adding two actions MODIFIED and NEW_*, that is
incorrect.
This patch is improving the performance when creating new interfaces.
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
Signed-off-by: Gris Ge <fge@redhat.com>
---
libnmstate/nm/profile.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libnmstate/nm/profile.py b/libnmstate/nm/profile.py
index b4814d9..e117dfe 100644
--- a/libnmstate/nm/profile.py
+++ b/libnmstate/nm/profile.py
@@ -164,7 +164,6 @@ class NmProfile:
if self._iface.is_virtual and self._nm_dev:
self._add_action(NmProfile.ACTION_DELETE_DEVICE)
elif self._iface.is_up and not self._needs_veth_activation():
- self._add_action(NmProfile.ACTION_MODIFIED)
if not self._nm_dev:
if self._iface.type == InterfaceType.OVS_PORT:
self._add_action(NmProfile.ACTION_NEW_OVS_PORT)
@@ -176,6 +175,8 @@ class NmProfile:
self._add_action(NmProfile.ACTION_NEW_VXLAN)
else:
self._add_action(NmProfile.ACTION_NEW_IFACES)
+ else:
+ self._add_action(NmProfile.ACTION_MODIFIED)
elif self._iface.is_down:
if self._nm_ac:
--
2.31.1
From 9ea925a9a978671881e428abf82aac39c01376e8 Mon Sep 17 00:00:00 2001
From: Fernando Fernandez Mancera <ffmancera@riseup.net>
Date: Wed, 5 May 2021 10:52:32 +0200
Subject: [PATCH 2/2] nm.profile: activate modified ovs-port first
When removing an ovs-br with an ovs-iface attached and creating a new
ovs-br with the ovs-iface attached in the same transaction the order of
the activations is important.
The ovs-port must be activated before the ovs-iface. If not, NM will
throw a dependency error. This error is correct because the ovs-iface
depends on the ovs-port, so it must be updated first.
This fixes:
```
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/libnmstate/nm/checkpoint.py", line 93, in _refresh_checkpoint_timeout
self._dbuspath, self._timeout, cancellable, cb, cb_data
TypeError: Argument 1 does not allow None as a value
^CTraceback (most recent call last):
File "/usr/lib/python3.6/site-packages/libnmstate/nmstate.py", line 53, in plugin_context
yield plugins
File "/usr/lib/python3.6/site-packages/libnmstate/netapplier.py", line 78, in apply
_apply_ifaces_state(plugins, net_state, verify_change, save_to_disk)
File "/usr/lib/python3.6/site-packages/libnmstate/netapplier.py", line 116, in _apply_ifaces_state
plugin.apply_changes(net_state, save_to_disk)
File "/usr/lib/python3.6/site-packages/libnmstate/nm/plugin.py", line 204, in apply_changes
NmProfiles(self.context).apply_config(net_state, save_to_disk)
File "/usr/lib/python3.6/site-packages/libnmstate/nm/profiles.py", line 89, in apply_config
self._ctx.wait_all_finish()
File "/usr/lib/python3.6/site-packages/libnmstate/nm/context.py", line 213, in wait_all_finish
raise tmp_error
libnmstate.error.NmstateLibnmError: Activate profile uuid:3a359cd0-d68a-4c7a-ae50-f97b47390142 iface:net type: ovs-interface failed: reason=<enum NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED of type NM.ActiveConnectionStateReason> <enum NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED of type NM.DeviceStateReason>
```
Integration test added
Ref: https://bugzilla.redhat.com/1947287
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
Signed-off-by: Gris Ge <fge@redhat.com>
---
libnmstate/nm/profile.py | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/libnmstate/nm/profile.py b/libnmstate/nm/profile.py
index e117dfe..b655885 100644
--- a/libnmstate/nm/profile.py
+++ b/libnmstate/nm/profile.py
@@ -69,6 +69,8 @@ class NmProfile:
ACTION_OTHER_MASTER = "other_master"
ACTION_DELETE_PROFILE = "delete_profile"
ACTION_TOP_MASTER = "top_master"
+ ACTION_MODIFIED_OVS_PORT = "modified_ovs_port"
+ ACTION_MODIFIED_OVS_IFACE = "modified_ovs_iface"
# This is order on group for activation/deactivation
ACTIONS = (
@@ -81,6 +83,8 @@ class NmProfile:
ACTION_NEW_OVS_IFACE,
ACTION_NEW_VETH,
ACTION_NEW_VETH_PEER,
+ ACTION_MODIFIED_OVS_PORT,
+ ACTION_MODIFIED_OVS_IFACE,
ACTION_MODIFIED,
ACTION_NEW_VLAN,
ACTION_NEW_VXLAN,
@@ -176,7 +180,12 @@ class NmProfile:
else:
self._add_action(NmProfile.ACTION_NEW_IFACES)
else:
- self._add_action(NmProfile.ACTION_MODIFIED)
+ if self._iface.type == InterfaceType.OVS_PORT:
+ self._add_action(NmProfile.ACTION_MODIFIED_OVS_PORT)
+ if self._iface.type == InterfaceType.OVS_INTERFACE:
+ self._add_action(NmProfile.ACTION_MODIFIED_OVS_IFACE)
+ else:
+ self._add_action(NmProfile.ACTION_MODIFIED)
elif self._iface.is_down:
if self._nm_ac:
@@ -420,6 +429,8 @@ class NmProfile:
def do_action(self, action):
if action in (
NmProfile.ACTION_MODIFIED,
+ NmProfile.ACTION_MODIFIED_OVS_PORT,
+ NmProfile.ACTION_MODIFIED_OVS_IFACE,
NmProfile.ACTION_ACTIVATE_FIRST,
NmProfile.ACTION_TOP_MASTER,
NmProfile.ACTION_NEW_IFACES,
--
2.31.1