import nmstate-1.1.0-5.el8_5

This commit is contained in:
CentOS Sources 2022-02-01 15:11:52 -05:00 committed by Stepan Oksanichenko
parent aaa1c8b9f1
commit 11fa53642d
4 changed files with 491 additions and 1 deletions

View File

@ -0,0 +1,45 @@
From daad0a535b370d0a3f847526185c185aca2d9935 Mon Sep 17 00:00:00 2001
From: Fernando Fernandez Mancera <ffmancera@riseup.net>
Date: Thu, 2 Sep 2021 11:33:14 +0200
Subject: [PATCH] nm.connection: do not rename existing connections
When an user is specifying a custom name for a connection and then use
Nmstate to modify the interface, it will be renamed. That makes
impossible to use other automation tools because it will require to use
the uuid instead.
Integration test case added.
Ref: https://bugzilla.redhat.com/1998222
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
Signed-off-by: Gris Ge <fge@redhat.com>
---
libnmstate/nm/connection.py | 4 ----
1 file changed, 4 deletions(-)
diff --git a/libnmstate/nm/connection.py b/libnmstate/nm/connection.py
index 5a79c6f..39eb2b5 100644
--- a/libnmstate/nm/connection.py
+++ b/libnmstate/nm/connection.py
@@ -98,9 +98,6 @@ class _ConnectionSetting:
self._setting.props.master = controller
self._setting.props.slave_type = port_type
- def set_profile_name(self, con_name):
- self._setting.props.id = con_name
-
@property
def setting(self):
return self._setting
@@ -116,7 +113,6 @@ def create_new_nm_simple_conn(iface, nm_profile):
con_setting = _ConnectionSetting()
if nm_profile and not is_multiconnect_profile(nm_profile):
con_setting.import_by_profile(nm_profile, iface.is_controller)
- con_setting.set_profile_name(iface.name)
else:
con_setting.create(
iface.name, iface.name, nm_iface_type, iface.is_controller
--
2.27.0

View File

@ -0,0 +1,110 @@
From cd41c2c0f6bef7b952648b358246fffa8ce3cf62 Mon Sep 17 00:00:00 2001
From: Fernando Fernandez Mancera <ffmancera@riseup.net>
Date: Thu, 2 Sep 2021 17:39:59 +0200
Subject: [PATCH 1/2] nm.connection: add postfixes to OVS bridges and
interfaces connections
When configuring an OVS bridge and interface with the same using
Nmstate, it will generate two connection with the same name. If the user
is willing to use nmcli to manage this profiles, it is not user friendly
because they will need to use the connection UUID instead.
In order to solve this, Nmstate is adding a postfix on the connection
name. "-if" for OVS interface and "-br" for OVS bridge.
Please, note that this issue does not affect kernel interfaces because
it is not possible to have duplicated interfaces names in kernel.
Integration test case added.
Ref: https://bugzilla.redhat.com/1998218
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
Signed-off-by: Gris Ge <fge@redhat.com>
---
libnmstate/nm/connection.py | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/libnmstate/nm/connection.py b/libnmstate/nm/connection.py
index 39eb2b5..afe3788 100644
--- a/libnmstate/nm/connection.py
+++ b/libnmstate/nm/connection.py
@@ -114,8 +114,20 @@ def create_new_nm_simple_conn(iface, nm_profile):
if nm_profile and not is_multiconnect_profile(nm_profile):
con_setting.import_by_profile(nm_profile, iface.is_controller)
else:
+ # OVS bridge and interfaces could sharing the same interface name, to
+ # distinguish them at NM connection level, instead of using interface
+ # name as connection name, we append a postfix.
+ con_name = iface.name
+ if iface.type == InterfaceType.OVS_BRIDGE:
+ con_name = con_name + "-br"
+ elif iface.type == InterfaceType.OVS_INTERFACE:
+ con_name = con_name + "-if"
+
con_setting.create(
- iface.name, iface.name, nm_iface_type, iface.is_controller
+ con_name,
+ iface.name,
+ nm_iface_type,
+ iface.is_controller,
)
apply_lldp_setting(con_setting, iface_info)
--
2.27.0
From cfdd5afb1ef136d613d5adb3f6f5f6d156962586 Mon Sep 17 00:00:00 2001
From: Radim Hrazdil <rhrazdil@redhat.com>
Date: Wed, 10 Nov 2021 16:57:08 +0100
Subject: [PATCH 2/2] ovs: remove ovs-port prefix
Prepending the prefix causes ovnkube-node pods to crash.
This change adds -port postfix to ovs-interface connection instead.
Signed-off-by: Radim Hrazdil <rhrazdil@redhat.com>
Signed-off-by: Gris Ge <fge@redhat.com>
---
libnmstate/nm/connection.py | 2 ++
libnmstate/nm/ovs.py | 4 +---
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/libnmstate/nm/connection.py b/libnmstate/nm/connection.py
index afe3788..fb4ceba 100644
--- a/libnmstate/nm/connection.py
+++ b/libnmstate/nm/connection.py
@@ -122,6 +122,8 @@ def create_new_nm_simple_conn(iface, nm_profile):
con_name = con_name + "-br"
elif iface.type == InterfaceType.OVS_INTERFACE:
con_name = con_name + "-if"
+ elif iface.type == InterfaceType.OVS_PORT:
+ con_name = con_name + "-port"
con_setting.create(
con_name,
diff --git a/libnmstate/nm/ovs.py b/libnmstate/nm/ovs.py
index 424df36..9f2cba0 100644
--- a/libnmstate/nm/ovs.py
+++ b/libnmstate/nm/ovs.py
@@ -32,8 +32,6 @@ from libnmstate.schema import OvsDB
from .common import NM
-PORT_PROFILE_PREFIX = "ovs-port-"
-
CONTROLLER_TYPE_METADATA = "_controller_type"
CONTROLLER_METADATA = "_controller"
SETTING_OVS_EXTERNALIDS = "SettingOvsExternalIDs"
@@ -311,7 +309,7 @@ def create_iface_for_nm_ovs_port(iface):
if ovs.is_ovs_lag_port(port_options):
port_name = port_options[OB.Port.NAME]
else:
- port_name = PORT_PROFILE_PREFIX + iface_name
+ port_name = iface_name
return OvsPortIface(
{
Interface.NAME: port_name,
--
2.27.0

View File

@ -0,0 +1,326 @@
From b8e3c6928c2a22a828b85a6780de3cea1107aa85 Mon Sep 17 00:00:00 2001
From: Gris Ge <fge@redhat.com>
Date: Fri, 24 Dec 2021 16:34:30 +0800
Subject: [PATCH] sriov: New way to wait VF been created
By checking `/sys/class/net/<pf_name>/device/virtfn<sriov_id>/net/`
we could tell the interface name of VF.
The old VF name guessing method is removed. The `verify_sriov_vf()` is
created to collect all VF interfaces name, then comparing it with
`total_vfs` count and check whether they exists in current state.
The test indicate kernel/udev does not require extra time to remove VF
interface when decreasing SR-IOV VF count.
Signed-off-by: Gris Ge <fge@redhat.com>
---
libnmstate/ifaces/ethernet.py | 100 +++++++++++++++-------------------
libnmstate/ifaces/ifaces.py | 44 +--------------
libnmstate/nispor/ethernet.py | 17 ++++++
libnmstate/nm/profiles.py | 1 -
libnmstate/nm/sriov.py | 5 +-
5 files changed, 67 insertions(+), 100 deletions(-)
diff --git a/libnmstate/ifaces/ethernet.py b/libnmstate/ifaces/ethernet.py
index 84fc665..720deab 100644
--- a/libnmstate/ifaces/ethernet.py
+++ b/libnmstate/ifaces/ethernet.py
@@ -17,10 +17,9 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
+from libnmstate.error import NmstateVerificationError
from libnmstate.schema import Ethernet
-from libnmstate.schema import Interface
from libnmstate.schema import InterfaceType
-from libnmstate.schema import InterfaceState
from .base_iface import BaseIface
@@ -30,7 +29,7 @@ MULTIPORT_PCI_DEVICE_PREFIX = "n"
class EthernetIface(BaseIface):
- IS_GENERATED_VF_METADATA = "_is_generated_vf"
+ VF_IFACE_NAME_METADATA = "_vf_iface_name"
def __init__(self, info, save_to_disk=True):
super().__init__(info, save_to_disk)
@@ -56,10 +55,6 @@ class EthernetIface(BaseIface):
state = super().state_for_verify()
_capitalize_sriov_vf_mac(state)
EthernetIface._canonicalize(state)
- if self.is_generated_vf:
- # The VF state is unpredictable when PF is changing total_vfs count
- # Just don't verify generated VF state.
- state.pop(Interface.STATE, None)
return state
@property
@@ -102,54 +97,6 @@ class EthernetIface(BaseIface):
def duplex(self):
return self.raw.get(Ethernet.CONFIG_SUBTREE, {}).get(Ethernet.DUPLEX)
- def create_sriov_vf_ifaces(self):
- # Currently there is not a way to see the relation between a SR-IOV PF
- # and its VFs. Broadcom BCM57416 follows a different name pattern for
- # PF and VF, therefore it needs to be parsed if present.
- #
- # PF name: ens2f0np0
- # VF name: ens2f0v0
- #
- # The different name pattern is due to:
- # 1. The `n` is for `multi-port PCI device` support.
- # 2. The `p*` is `phys_port_name` provided by the BCM driver
- # `bnxt_en`.
- #
- # If the NIC is following the standard pattern "pfname+v+vfid", this
- # split will not touch it and the vf_pattern will be the PF name.
- # Ref: https://bugzilla.redhat.com/1959679
- vf_pattern = self.name
- multiport_pattern = (
- MULTIPORT_PCI_DEVICE_PREFIX + BNXT_DRIVER_PHYS_PORT_PREFIX
- )
- if len(self.name.split(multiport_pattern)) == 2:
- vf_pattern = self.name.split(multiport_pattern)[0]
-
- vf_ifaces = [
- EthernetIface(
- {
- # According to manpage of systemd.net-naming-scheme(7),
- # SRIOV VF interface will have v{slot} in device name.
- # Currently, nmstate has no intention to support
- # user-defined udev rule on SRIOV interface naming policy.
- Interface.NAME: f"{vf_pattern}v{i}",
- Interface.TYPE: InterfaceType.ETHERNET,
- # VF will be in DOWN state initialy
- Interface.STATE: InterfaceState.DOWN,
- }
- )
- for i in range(0, self.sriov_total_vfs)
- ]
- # The generated vf metadata cannot be part of the original dict.
- for vf in vf_ifaces:
- vf._info[EthernetIface.IS_GENERATED_VF_METADATA] = True
-
- return vf_ifaces
-
- @property
- def is_generated_vf(self):
- return self._info.get(EthernetIface.IS_GENERATED_VF_METADATA) is True
-
def remove_vfs_entry_when_total_vfs_decreased(self):
vfs_count = len(
self._info[Ethernet.CONFIG_SUBTREE]
@@ -173,6 +120,16 @@ class EthernetIface(BaseIface):
def check_total_vfs_matches_vf_list(self, total_vfs):
return total_vfs == len(self.sriov_vfs)
+ def to_dict(self):
+ info = super().to_dict()
+ for vf_info in (
+ info.get(Ethernet.CONFIG_SUBTREE, {})
+ .get(Ethernet.SRIOV_SUBTREE, {})
+ .get(Ethernet.SRIOV.VFS_SUBTREE, [])
+ ):
+ vf_info.pop(EthernetIface.VF_IFACE_NAME_METADATA, None)
+ return info
+
def _capitalize_sriov_vf_mac(state):
vfs = (
@@ -184,3 +141,36 @@ def _capitalize_sriov_vf_mac(state):
vf_mac = vf.get(Ethernet.SRIOV.VFS.MAC_ADDRESS)
if vf_mac:
vf[Ethernet.SRIOV.VFS.MAC_ADDRESS] = vf_mac.upper()
+
+
+def verify_sriov_vf(iface, cur_ifaces):
+ """
+ Checking whether VF interface is been created
+ """
+ if not (
+ iface.is_up
+ and (iface.is_desired or iface.is_changed)
+ and iface.type == InterfaceType.ETHERNET
+ and iface.sriov_total_vfs > 0
+ ):
+ return
+ cur_iface = cur_ifaces.get_iface(iface.name, iface.type)
+ if not cur_iface:
+ # Other verification will raise proper exception when current interface
+ # is missing
+ return
+ cur_vf_names = []
+ for sriov_vf in cur_iface.sriov_vfs:
+ if sriov_vf.get(EthernetIface.VF_IFACE_NAME_METADATA):
+ cur_vf_names.append(sriov_vf[EthernetIface.VF_IFACE_NAME_METADATA])
+
+ if len(cur_vf_names) != iface.sriov_total_vfs:
+ raise NmstateVerificationError(
+ f"Found VF ports count does not match desired "
+ f"{iface.sriov_total_vfs}, current is: {','.join(cur_vf_names)}"
+ )
+ for cur_vf_name in cur_vf_names:
+ if not cur_ifaces.get_iface(cur_vf_name, InterfaceType.ETHERNET):
+ raise NmstateVerificationError(
+ f"VF interface {cur_vf_name} of PF {iface.name} not found"
+ )
diff --git a/libnmstate/ifaces/ifaces.py b/libnmstate/ifaces/ifaces.py
index be295e3..4bd6792 100644
--- a/libnmstate/ifaces/ifaces.py
+++ b/libnmstate/ifaces/ifaces.py
@@ -33,6 +33,7 @@ from .base_iface import BaseIface
from .bond import BondIface
from .dummy import DummyIface
from .ethernet import EthernetIface
+from .ethernet import verify_sriov_vf
from .infiniband import InfiniBandIface
from .linux_bridge import LinuxBridgeIface
from .macvlan import MacVlanIface
@@ -151,7 +152,6 @@ class Ifaces:
self._kernel_ifaces[iface.name] = iface
self._create_virtual_port()
- self._create_sriov_vfs_when_changed()
self._mark_vf_interface_as_absent_when_sriov_vf_decrease()
self._validate_unknown_port()
self._validate_unknown_parent()
@@ -241,35 +241,6 @@ class Ifaces:
for iface in new_ifaces:
self._kernel_ifaces[iface.name] = iface
- def _create_sriov_vfs_when_changed(self):
- """
- When plugin set the TOTAL_VFS of PF, it might take 1 seconds or
- more to have the VFs to be ready.
- Nmstate should use verification retry to make sure VFs are full ready.
- To do that, we include VFs into desire state.
- """
- new_ifaces = []
- for iface in self.all_ifaces():
- if (
- iface.is_up
- and (iface.is_desired or iface.is_changed)
- and iface.type == InterfaceType.ETHERNET
- and iface.sriov_total_vfs > 0
- ):
- for new_iface in iface.create_sriov_vf_ifaces():
- cur_iface = self._kernel_ifaces.get(new_iface.name)
- if cur_iface and cur_iface.is_desired:
- raise NmstateNotSupportedError(
- "Does not support changing SR-IOV PF interface "
- "along with VF interface in the single desire "
- f"state: PF {iface.name}, VF {cur_iface.name}"
- )
- else:
- new_iface.mark_as_desired()
- new_ifaces.append(new_iface)
- for new_iface in new_ifaces:
- self._kernel_ifaces[new_iface.name] = new_iface
-
def _mark_vf_interface_as_absent_when_sriov_vf_decrease(self):
"""
When SRIOV TOTAL_VFS decreased, we should mark certain VF interfaces
@@ -647,6 +618,7 @@ class Ifaces:
cur_ifaces._remove_ignore_interfaces(self._ignored_ifaces)
self._remove_ignore_interfaces(self._ignored_ifaces)
for iface in self.all_ifaces():
+ verify_sriov_vf(iface, cur_ifaces)
if iface.is_desired:
if (
iface.is_virtual
@@ -700,18 +672,6 @@ class Ifaces:
cur_iface.state_for_verify(),
)
)
- elif (
- iface.type == InterfaceType.ETHERNET and iface.is_sriov
- ):
- if not cur_iface.check_total_vfs_matches_vf_list(
- iface.sriov_total_vfs
- ):
- raise NmstateVerificationError(
- "The NIC exceeded the waiting time for "
- "verification and it is failing because "
- "the `total_vfs` does not match the VF "
- "list length."
- )
def gen_dns_metadata(self, dns_state, route_state):
iface_metadata = dns_state.gen_metadata(self, route_state)
diff --git a/libnmstate/nispor/ethernet.py b/libnmstate/nispor/ethernet.py
index d6969b9..e4b82ff 100644
--- a/libnmstate/nispor/ethernet.py
+++ b/libnmstate/nispor/ethernet.py
@@ -17,10 +17,13 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
+import os
+
from libnmstate.schema import Ethernet
from libnmstate.schema import InterfaceType
from .base_iface import NisporPluginBaseIface
+from libnmstate.ifaces.ethernet import EthernetIface
class NisporPluginEthernetIface(NisporPluginBaseIface):
@@ -35,6 +38,9 @@ class NisporPluginEthernetIface(NisporPluginBaseIface):
for vf in self.np_iface.sr_iov.vfs:
vf_infos.append(
{
+ EthernetIface.VF_IFACE_NAME_METADATA: _get_vf_name(
+ self.np_iface.name, vf.vf_id
+ ),
Ethernet.SRIOV.VFS.ID: vf.vf_id,
Ethernet.SRIOV.VFS.MAC_ADDRESS: vf.mac.upper(),
Ethernet.SRIOV.VFS.SPOOF_CHECK: vf.spoof_check,
@@ -76,3 +82,14 @@ def np_ethtool_link_mode_to_nmstate(np_link_mode):
info[Ethernet.SPEED] = np_link_mode.speed
return info
+
+
+def _get_vf_name(pf_name, vf_id):
+ try:
+ vf_names = os.listdir(
+ f"/sys/class/net/{pf_name}/device/virtfn{vf_id}/net/"
+ )
+ if len(vf_names) >= 1:
+ return vf_names[0]
+ except Exception:
+ return ""
diff --git a/libnmstate/nm/profiles.py b/libnmstate/nm/profiles.py
index 3b0b6be..9e3020b 100644
--- a/libnmstate/nm/profiles.py
+++ b/libnmstate/nm/profiles.py
@@ -71,7 +71,6 @@ class NmProfiles:
for iface in sorted(
list(net_state.ifaces.all_ifaces()), key=attrgetter("name")
)
- if not getattr(iface, "is_generated_vf", None)
]
for profile in all_profiles:
diff --git a/libnmstate/nm/sriov.py b/libnmstate/nm/sriov.py
index a7e387c..e0bf60b 100644
--- a/libnmstate/nm/sriov.py
+++ b/libnmstate/nm/sriov.py
@@ -102,8 +102,9 @@ def _create_sriov_vfs_from_config(vfs_config, sriov_setting, vf_ids_to_add):
def _set_nm_attribute(vf_object, key, value):
- nm_attr, nm_variant = SRIOV_NMSTATE_TO_NM_MAP[key]
- vf_object.set_attribute(nm_attr, nm_variant(value))
+ if key in SRIOV_NMSTATE_TO_NM_MAP:
+ nm_attr, nm_variant = SRIOV_NMSTATE_TO_NM_MAP[key]
+ vf_object.set_attribute(nm_attr, nm_variant(value))
def _remove_sriov_vfs_in_setting(vfs_config, sriov_setting, vf_ids_to_remove):
--
2.27.0

View File

@ -4,7 +4,7 @@
Name: nmstate
Version: 1.1.0
Release: 3%{?dist}
Release: 5%{?dist}
Summary: Declarative network manager API
License: LGPLv2+
URL: https://github.com/%{srcname}/%{srcname}
@ -15,6 +15,9 @@ Patch1: 0001-nmstatectl-fix-long-arguments-support.patch
Patch2: 0002-nm-ethtool-Preserve-existing-ethtool-settings-when-u.patch
Patch3: 0003-ovs-fix-state-ignore-for-ovs-port-when-removing-them.patch
Patch4: 0004-nispor-fix-show-of-empty-next_hop_address-and-destin.patch
Patch5: BZ_2034139-do-not-rename-connection.patch
Patch6: BZ_2034139-ovs-remove-ovs-port-prefix.patch
Patch7: BZ_2039285-sriov-New-way-to-wait-VF-been-created.patch
BuildArch: noarch
BuildRequires: python3-devel
BuildRequires: python3-setuptools
@ -89,6 +92,12 @@ gpgv2 --keyring ./gpgkey-mantainers.gpg %{SOURCE1} %{SOURCE0}
%{python3_sitelib}/%{libname}/plugins/__pycache__/nmstate_plugin_ovsdb*
%changelog
* Wed Jan 12 2022 Gris Ge <fge@redhat.com> - 1.1.0-5
- Remove OVS interface postfix. RHBZ#2034139
* Wed Jan 12 2022 Gris Ge <fge@redhat.com> - 1.1.0-4
- Fix SR-IOV on ixgbe. RHBZ#2039285
* Tue Jul 27 2021 Gris Ge <fge@redhat.com> - 1.1.0-3
- Fix state=ignore for OVS interface. RHBZ#1944054
- Fix verification for next hop address 0.0.0.0. RHBZ#1985879