nmstate/SOURCES/BZ_1887349-Allow-duplicate-...

112 lines
4.0 KiB
Diff

From 36ee761dd0d671439323077e4f77a89071fdcd9c Mon Sep 17 00:00:00 2001
From: Edward Haas <edwardh@redhat.com>
Date: Wed, 7 Oct 2020 20:13:12 +0300
Subject: [PATCH 1/2] nm, bridge, ovs: Collect only existing profiles
During the reporting flow, connections that are in teardown process
no longer point to a valid profile. Avoid collecting such profiles (in
practice, these are actually `None` objects).
Signed-off-by: Edward Haas <edwardh@redhat.com>
Signed-off-by: Gris Ge <fge@redhat.com>
---
libnmstate/nm/bridge.py | 6 +++---
libnmstate/nm/ovs.py | 4 +++-
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/libnmstate/nm/bridge.py b/libnmstate/nm/bridge.py
index b885f7a..0ca6c2d 100644
--- a/libnmstate/nm/bridge.py
+++ b/libnmstate/nm/bridge.py
@@ -260,9 +260,9 @@ def _get_slave_profiles_by_name(master_device):
for dev in master_device.get_slaves():
active_con = connection.get_device_active_connection(dev)
if active_con:
- slaves_profiles_by_name[
- dev.get_iface()
- ] = active_con.props.connection
+ profile = active_con.props.connection
+ if profile:
+ slaves_profiles_by_name[dev.get_iface()] = profile
return slaves_profiles_by_name
diff --git a/libnmstate/nm/ovs.py b/libnmstate/nm/ovs.py
index 2518773..eb373c3 100644
--- a/libnmstate/nm/ovs.py
+++ b/libnmstate/nm/ovs.py
@@ -279,5 +279,7 @@ def _get_slave_profiles(master_device, devices_info):
if active_con:
master = active_con.props.master
if master and (master.get_iface() == master_device.get_iface()):
- slave_profiles.append(active_con.props.connection)
+ profile = active_con.props.connection
+ if profile:
+ slave_profiles.append(profile)
return slave_profiles
--
2.28.0
From caf638d75e57da8770cd884782475f1c5668fd6d Mon Sep 17 00:00:00 2001
From: Edward Haas <edwardh@redhat.com>
Date: Wed, 7 Oct 2020 12:26:42 +0300
Subject: [PATCH 2/2] nm, ovs: Fix report crash when OVS has dup iface names
In case of an existing OVS deployment which uses an identical name for
the bridge, port and interface, libnmstate.show() exploded.
It is now possible to report such deployments.
Signed-off-by: Edward Haas <edwardh@redhat.com>
Signed-off-by: Gris Ge <fge@redhat.com>
---
libnmstate/nm/ovs.py | 24 +++++++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/libnmstate/nm/ovs.py b/libnmstate/nm/ovs.py
index eb373c3..d1f26ba 100644
--- a/libnmstate/nm/ovs.py
+++ b/libnmstate/nm/ovs.py
@@ -140,7 +140,12 @@ def get_port_by_slave(nmdev):
def get_ovs_info(context, bridge_device, devices_info):
- port_profiles = _get_slave_profiles(bridge_device, devices_info)
+ ovs_ports_info = (
+ info
+ for info in devices_info
+ if is_ovs_port_type_id(info[1]["type_id"])
+ )
+ port_profiles = _get_slave_profiles(bridge_device, ovs_ports_info)
ports = _get_bridge_ports_info(context, port_profiles, devices_info)
options = _get_bridge_options(context, bridge_device)
@@ -203,8 +208,21 @@ def _get_bridge_port_info(context, port_profile, devices_info):
vlan_mode = port_setting.props.vlan_mode
port_name = port_profile.get_interface_name()
- port_device = context.get_nm_dev(port_name)
- port_slave_profiles = _get_slave_profiles(port_device, devices_info)
+ port_device = next(
+ dev
+ for dev, devinfo in devices_info
+ if devinfo["name"] == port_name
+ and is_ovs_port_type_id(devinfo["type_id"])
+ )
+ devices_info_excluding_bridges_and_ports = (
+ info
+ for info in devices_info
+ if not is_ovs_bridge_type_id(info[1]["type_id"])
+ and not is_ovs_port_type_id(info[1]["type_id"])
+ )
+ port_slave_profiles = _get_slave_profiles(
+ port_device, devices_info_excluding_bridges_and_ports
+ )
port_slave_names = [c.get_interface_name() for c in port_slave_profiles]
if port_slave_names:
--
2.28.0