packit / rpms / nmstate

Forked from rpms/nmstate a year ago
Clone

Blame 0003-ovs-fix-state-ignore-for-ovs-port-when-removing-them.patch

Gris Ge de9c1d0
From f4d190653c55d399b32afc956b2b4a1ff8d20101 Mon Sep 17 00:00:00 2001
Gris Ge de9c1d0
From: Fernando Fernandez Mancera <ffmancera@riseup.net>
Gris Ge de9c1d0
Date: Mon, 26 Jul 2021 09:58:23 +0200
Gris Ge de9c1d0
Subject: [PATCH 3/4] ovs: fix state=ignore for ovs port when removing them
Gris Ge de9c1d0
Gris Ge de9c1d0
When removing an ovs port while the interface is marked as ignored, the
Gris Ge de9c1d0
interface should not being removed from the ovs bridge as the user
Gris Ge de9c1d0
specidied it should be ignored.
Gris Ge de9c1d0
Gris Ge de9c1d0
Example:
Gris Ge de9c1d0
Gris Ge de9c1d0
```
Gris Ge de9c1d0
interfaces:
Gris Ge de9c1d0
- name: dummy0
Gris Ge de9c1d0
  type: dummy
Gris Ge de9c1d0
  state: ignore
Gris Ge de9c1d0
- name: ovsbr0
Gris Ge de9c1d0
  type: ovs-bridge
Gris Ge de9c1d0
  state: up
Gris Ge de9c1d0
  bridge:
Gris Ge de9c1d0
    port:
Gris Ge de9c1d0
    - name: ovs0
Gris Ge de9c1d0
```
Gris Ge de9c1d0
Gris Ge de9c1d0
Integration test case added.
Gris Ge de9c1d0
Gris Ge de9c1d0
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
Gris Ge de9c1d0
Signed-off-by: Gris Ge <fge@redhat.com>
Gris Ge de9c1d0
---
Gris Ge de9c1d0
 libnmstate/nm/profiles.py | 22 ++++++++++++++++++++--
Gris Ge de9c1d0
 1 file changed, 20 insertions(+), 2 deletions(-)
Gris Ge de9c1d0
Gris Ge de9c1d0
diff --git a/libnmstate/nm/profiles.py b/libnmstate/nm/profiles.py
Gris Ge de9c1d0
index beda5c7..3b0b6be 100644
Gris Ge de9c1d0
--- a/libnmstate/nm/profiles.py
Gris Ge de9c1d0
+++ b/libnmstate/nm/profiles.py
Gris Ge de9c1d0
@@ -23,6 +23,8 @@
Gris Ge de9c1d0
 import logging
Gris Ge de9c1d0
 from operator import attrgetter
Gris Ge de9c1d0
 
Gris Ge de9c1d0
+from libnmstate.schema import Interface
Gris Ge de9c1d0
+from libnmstate.schema import InterfaceState
Gris Ge de9c1d0
 from libnmstate.schema import InterfaceType
Gris Ge de9c1d0
 
Gris Ge de9c1d0
 from .common import NM
Gris Ge de9c1d0
@@ -359,7 +361,7 @@ def _delete_orphan_nm_ovs_port_profiles(
Gris Ge de9c1d0
                 continue
Gris Ge de9c1d0
             # When OVS port has no child, delete it
Gris Ge de9c1d0
             ovs_bridge_iface = ovs_bridge_profile.iface
Gris Ge de9c1d0
-            if not _nm_ovs_port_has_child(
Gris Ge de9c1d0
+            if not _nm_ovs_port_has_child_or_is_ignored(
Gris Ge de9c1d0
                 nm_profile, ovs_bridge_iface, net_state
Gris Ge de9c1d0
             ):
Gris Ge de9c1d0
                 ProfileDelete(
Gris Ge de9c1d0
@@ -404,7 +406,9 @@ def _use_uuid_as_controller_and_parent(nm_profiles):
Gris Ge de9c1d0
                 nm_profile.update_parent(uuid)
Gris Ge de9c1d0
 
Gris Ge de9c1d0
 
Gris Ge de9c1d0
-def _nm_ovs_port_has_child(nm_profile, ovs_bridge_iface, net_state):
Gris Ge de9c1d0
+def _nm_ovs_port_has_child_or_is_ignored(
Gris Ge de9c1d0
+    nm_profile, ovs_bridge_iface, net_state
Gris Ge de9c1d0
+):
Gris Ge de9c1d0
     ovs_port_uuid = nm_profile.get_uuid()
Gris Ge de9c1d0
     ovs_port_name = nm_profile.get_interface_name()
Gris Ge de9c1d0
     for ovs_iface_name in ovs_bridge_iface.port:
Gris Ge de9c1d0
@@ -415,4 +419,18 @@ def _nm_ovs_port_has_child(nm_profile, ovs_bridge_iface, net_state):
Gris Ge de9c1d0
             and ovs_iface.controller_type == InterfaceType.OVS_PORT
Gris Ge de9c1d0
         ):
Gris Ge de9c1d0
             return True
Gris Ge de9c1d0
+    # Gather the ovs bridge interface from the current state in order to check
Gris Ge de9c1d0
+    # if any port is ignored in the original desired state.
Gris Ge de9c1d0
+    current_ovs_bridge = net_state.ifaces.get_cur_iface(
Gris Ge de9c1d0
+        ovs_bridge_iface.name, InterfaceType.OVS_BRIDGE
Gris Ge de9c1d0
+    )
Gris Ge de9c1d0
+    if current_ovs_bridge:
Gris Ge de9c1d0
+        for port_name in current_ovs_bridge.port:
Gris Ge de9c1d0
+            port_iface = net_state.ifaces.all_kernel_ifaces.get(port_name)
Gris Ge de9c1d0
+            if (
Gris Ge de9c1d0
+                port_iface
Gris Ge de9c1d0
+                and port_iface.original_desire_dict.get(Interface.STATE)
Gris Ge de9c1d0
+                == InterfaceState.IGNORE
Gris Ge de9c1d0
+            ):
Gris Ge de9c1d0
+                return True
Gris Ge de9c1d0
     return False
Gris Ge de9c1d0
-- 
Gris Ge de9c1d0
2.32.0
Gris Ge de9c1d0