From e8401747705bcf873911496f81458e9c29d99c48 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: May 27 2021 04:13:07 +0000 Subject: import nmstate-1.1.0-0.1.el8 --- diff --git a/.gitignore b/.gitignore index 18b3d9b..ed3ca3f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -SOURCES/nmstate-1.0.2.tar.gz +SOURCES/nmstate-1.1.0-alpha1.tar.gz SOURCES/nmstate.gpg diff --git a/.nmstate.metadata b/.nmstate.metadata index a6d3e02..67884d8 100644 --- a/.nmstate.metadata +++ b/.nmstate.metadata @@ -1,2 +1,2 @@ -eeda8a0238732e5dc37e2217ed6e316f76c93145 SOURCES/nmstate-1.0.2.tar.gz +6b2a2a7c569145a52aee63db3328b2f6983126ce SOURCES/nmstate-1.1.0-alpha1.tar.gz b5f872551d434e2c62b30d70471efaeede83ab44 SOURCES/nmstate.gpg diff --git a/SOURCES/BZ_1931355-SRIOV-wait-VF-mount-decrease.patch b/SOURCES/BZ_1931355-SRIOV-wait-VF-mount-decrease.patch deleted file mode 100644 index f215f9f..0000000 --- a/SOURCES/BZ_1931355-SRIOV-wait-VF-mount-decrease.patch +++ /dev/null @@ -1,166 +0,0 @@ -From 80c97b27707b036f0a54988ade4bda3ccb342b34 Mon Sep 17 00:00:00 2001 -From: Fernando Fernandez Mancera -Date: Mon, 22 Feb 2021 12:03:11 +0100 -Subject: [PATCH 1/2] SR-IOV: increase the verification timeout if SR-IOV is - present - -Certain drivers like i40e take a long time to modify the VFs in the -kernel. Nmstate is timing out on verification because of that. In order -to fix this, nmstate is incresing the verification time if SR-IOV is -present on the desired state. - -Signed-off-by: Fernando Fernandez Mancera -Signed-off-by: Gris Ge ---- - libnmstate/ifaces/ethernet.py | 6 ++++++ - libnmstate/netapplier.py | 18 +++++++++++++++++- - 2 files changed, 23 insertions(+), 1 deletion(-) - -diff --git a/libnmstate/ifaces/ethernet.py b/libnmstate/ifaces/ethernet.py -index 292b7bc..ca8501b 100644 ---- a/libnmstate/ifaces/ethernet.py -+++ b/libnmstate/ifaces/ethernet.py -@@ -65,6 +65,12 @@ class EthernetIface(BaseIface): - def is_peer(self): - return self._is_peer - -+ @property -+ def is_sriov(self): -+ return self.raw.get(Ethernet.CONFIG_SUBTREE, {}).get( -+ Ethernet.SRIOV_SUBTREE -+ ) -+ - def create_sriov_vf_ifaces(self): - return [ - EthernetIface( -diff --git a/libnmstate/netapplier.py b/libnmstate/netapplier.py -index cf208d1..3c5759b 100644 ---- a/libnmstate/netapplier.py -+++ b/libnmstate/netapplier.py -@@ -24,6 +24,7 @@ import time - - from libnmstate import validator - from libnmstate.error import NmstateVerificationError -+from libnmstate.schema import InterfaceType - - from .nmstate import create_checkpoints - from .nmstate import destroy_checkpoints -@@ -37,6 +38,7 @@ from .version import get_version - MAINLOOP_TIMEOUT = 35 - VERIFY_RETRY_INTERNAL = 1 - VERIFY_RETRY_TIMEOUT = 5 -+VERIFY_RETRY_TIMEOUT_INCREASE = 4 - - - def apply( -@@ -109,7 +111,13 @@ def _apply_ifaces_state(plugins, net_state, verify_change, save_to_disk): - plugin.apply_changes(net_state, save_to_disk) - verified = False - if verify_change: -- for _ in range(VERIFY_RETRY_TIMEOUT): -+ if _net_state_contains_sriov_interface(net_state): -+ # If SR-IOV is present, the verification timeout is being increased -+ # to avoid timeouts due to slow drivers like i40e. -+ verify_retry = VERIFY_RETRY_TIMEOUT * VERIFY_RETRY_TIMEOUT_INCREASE -+ else: -+ verify_retry = VERIFY_RETRY_TIMEOUT -+ for _ in range(verify_retry): - try: - _verify_change(plugins, net_state) - verified = True -@@ -120,6 +128,14 @@ def _apply_ifaces_state(plugins, net_state, verify_change, save_to_disk): - _verify_change(plugins, net_state) - - -+def _net_state_contains_sriov_interface(net_state): -+ for iface in net_state.ifaces.all_kernel_ifaces.values(): -+ if iface.type == InterfaceType.ETHERNET and iface.is_sriov: -+ return True -+ -+ return False -+ -+ - def _verify_change(plugins, net_state): - current_state = show_with_plugins(plugins) - net_state.verify(current_state) --- -2.27.0 - - -From 439fe3a51a82060c5b62974c6c9fbdf403c4196b Mon Sep 17 00:00:00 2001 -From: Fernando Fernandez Mancera -Date: Mon, 22 Feb 2021 13:33:06 +0100 -Subject: [PATCH 2/2] SR-IOV: fail on verification if `total_vfs` does not - match vfs len - -Signed-off-by: Fernando Fernandez Mancera -Signed-off-by: Gris Ge ---- - libnmstate/ifaces/ethernet.py | 11 +++++++++++ - libnmstate/ifaces/ifaces.py | 14 ++++++++++++++ - 2 files changed, 25 insertions(+) - -diff --git a/libnmstate/ifaces/ethernet.py b/libnmstate/ifaces/ethernet.py -index ca8501b..55772ce 100644 ---- a/libnmstate/ifaces/ethernet.py -+++ b/libnmstate/ifaces/ethernet.py -@@ -61,6 +61,14 @@ class EthernetIface(BaseIface): - .get(Ethernet.SRIOV.TOTAL_VFS, 0) - ) - -+ @property -+ def sriov_vfs(self): -+ return ( -+ self.raw.get(Ethernet.CONFIG_SUBTREE, {}) -+ .get(Ethernet.SRIOV_SUBTREE, {}) -+ .get(Ethernet.SRIOV.VFS_SUBTREE, []) -+ ) -+ - @property - def is_peer(self): - return self._is_peer -@@ -108,6 +116,9 @@ class EthernetIface(BaseIface): - for i in range(self.sriov_total_vfs, old_sriov_total_vfs) - ] - -+ def check_total_vfs_matches_vf_list(self, total_vfs): -+ return total_vfs == len(self.sriov_vfs) -+ - - def _capitalize_sriov_vf_mac(state): - vfs = ( -diff --git a/libnmstate/ifaces/ifaces.py b/libnmstate/ifaces/ifaces.py -index 44c9e61..6c94a98 100644 ---- a/libnmstate/ifaces/ifaces.py -+++ b/libnmstate/ifaces/ifaces.py -@@ -238,6 +238,8 @@ class Ifaces: - if new_iface.name not in self._kernel_ifaces: - new_iface.mark_as_desired() - new_ifaces.append(new_iface) -+ else: -+ self._kernel_ifaces[new_iface.name].mark_as_desired() - for new_iface in new_ifaces: - self._kernel_ifaces[new_iface.name] = new_iface - -@@ -656,6 +658,18 @@ 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) --- -2.27.0 - diff --git a/SOURCES/BZ_1931751-nmstate-fix-return-code.patch b/SOURCES/BZ_1931751-nmstate-fix-return-code.patch deleted file mode 100644 index 78b6774..0000000 --- a/SOURCES/BZ_1931751-nmstate-fix-return-code.patch +++ /dev/null @@ -1,29 +0,0 @@ -From b26ab850172a41557cad42cc011bd00d7c108c88 Mon Sep 17 00:00:00 2001 -From: Gris Ge -Date: Tue, 23 Feb 2021 13:52:19 +0800 -Subject: [PATCH] nmstatectl: Fix return code of set command - -The deprecated command `set` should still return the error like -old behaviour. - -Signed-off-by: Gris Ge ---- - nmstatectl/nmstatectl.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/nmstatectl/nmstatectl.py b/nmstatectl/nmstatectl.py -index df59942..c94d603 100644 ---- a/nmstatectl/nmstatectl.py -+++ b/nmstatectl/nmstatectl.py -@@ -323,7 +323,7 @@ def show(args): - - def set(args): - warnings.warn("Using 'set' is deprecated, use 'apply' instead.") -- apply(args) -+ return apply(args) - - - def apply(args): --- -2.27.0 - diff --git a/SOURCES/BZ_1935710-nm-Don-t-touch-unmanaged-interface-unless-desired.patch b/SOURCES/BZ_1935710-nm-Don-t-touch-unmanaged-interface-unless-desired.patch deleted file mode 100644 index ea46af7..0000000 --- a/SOURCES/BZ_1935710-nm-Don-t-touch-unmanaged-interface-unless-desired.patch +++ /dev/null @@ -1,223 +0,0 @@ -From ccdcd8f86544a6364109a0c0142d05a5afacf64e Mon Sep 17 00:00:00 2001 -From: Gris Ge -Date: Tue, 2 Mar 2021 15:31:20 +0800 -Subject: [PATCH] nm: Don't touch unmanaged interface unless desired - -We should ignore NetworkManager unmanaged interface when applying and -verifying unless certain interface listed in desired state explicitly. - -Introduced new plugin interface -`NmstatePlugin.get_ignored_kernel_interface_names()` where plugin may -include a list of interface names which should be ignored during -verification stage. - -Integration test case added to simulate CNV usage on partial editing -a linux bridge holding NM unmanaged interface. - -Signed-off-by: Gris Ge ---- - libnmstate/ifaces/base_iface.py | 3 ++ - libnmstate/ifaces/ifaces.py | 26 ++++++++-------- - libnmstate/netapplier.py | 6 ++++ - libnmstate/nispor/plugin.py | 6 +++- - libnmstate/nm/plugin.py | 25 ++++++++++++++++ - libnmstate/plugin.py | 7 +++++ - tests/integration/linux_bridge_test.py | 8 +---- - tests/integration/nm/linux_bridge_test.py | 36 ++++++++++++++++++++++- - 8 files changed, 95 insertions(+), 22 deletions(-) - -diff --git a/libnmstate/ifaces/base_iface.py b/libnmstate/ifaces/base_iface.py -index 227c1d20..e3f2a1ca 100644 ---- a/libnmstate/ifaces/base_iface.py -+++ b/libnmstate/ifaces/base_iface.py -@@ -322,6 +322,9 @@ class BaseIface: - def mark_as_up(self): - self.raw[Interface.STATE] = InterfaceState.UP - -+ def mark_as_ignored(self): -+ self.raw[Interface.STATE] = InterfaceState.IGNORE -+ - @property - def is_controller(self): - return False -diff --git a/libnmstate/ifaces/ifaces.py b/libnmstate/ifaces/ifaces.py -index 6c94a986..efa24aa3 100644 ---- a/libnmstate/ifaces/ifaces.py -+++ b/libnmstate/ifaces/ifaces.py -@@ -95,7 +95,6 @@ class Ifaces: - self._kernel_ifaces = {} - self._user_space_ifaces = _UserSpaceIfaces() - self._cur_user_space_ifaces = _UserSpaceIfaces() -- self._ignored_ifaces = set() - if cur_iface_infos: - for iface_info in cur_iface_infos: - cur_iface = _to_specific_iface_obj(iface_info, save_to_disk) -@@ -143,10 +142,6 @@ class Ifaces: - ): - # Ignore interface with unknown type - continue -- if iface.is_ignore: -- self._ignored_ifaces.add( -- (iface.name, iface.type, iface.is_user_space_only) -- ) - if cur_iface: - iface.merge(cur_iface) - iface.mark_as_desired() -@@ -169,6 +164,10 @@ class Ifaces: - - self._pre_edit_validation_and_cleanup() - -+ @property -+ def _ignored_ifaces(self): -+ return [iface for iface in self.all_ifaces() if iface.is_ignore] -+ - def _apply_copy_mac_from(self): - for iface in self.all_kernel_ifaces.values(): - if iface.type not in ( -@@ -284,7 +283,7 @@ class Ifaces: - if not defiend in desire state - """ - for iface in self.all_ifaces(): -- if iface.is_up and iface.is_controller: -+ if iface.is_desired and iface.is_up and iface.is_controller: - for port_name in iface.port: - port_iface = self._kernel_ifaces[port_name] - if not port_iface.is_desired and not port_iface.is_up: -@@ -550,13 +549,14 @@ class Ifaces: - return None - - def _remove_iface(self, iface_name, iface_type): -- cur_iface = self._cur_kernel_ifaces.get(iface_name, iface_type) -+ cur_iface = self._user_space_ifaces.get(iface_name, iface_type) - if cur_iface: - self._user_space_ifaces.remove(cur_iface) - else: - cur_iface = self._kernel_ifaces.get(iface_name) - if ( -- iface_type -+ cur_iface -+ and iface_type - and iface_type != InterfaceType.UNKNOWN - and iface_type == cur_iface.type - ): -@@ -813,14 +813,14 @@ class Ifaces: - port_controller_map[port_name] = iface.name - - def _remove_ignore_interfaces(self, ignored_ifaces): -- for iface_name, iface_type, _ in ignored_ifaces: -- self._remove_iface(iface_name, iface_type) -+ for iface in ignored_ifaces: -+ self._remove_iface(iface.name, iface.type) - - # Only kernel interface can be used as port - ignored_kernel_iface_names = set( -- iface_name -- for iface_name, _, is_user_space_only in ignored_ifaces -- if not is_user_space_only -+ iface.name -+ for iface in ignored_ifaces -+ if not iface.is_user_space_only - ) - - # Remove ignored port -diff --git a/libnmstate/netapplier.py b/libnmstate/netapplier.py -index 3c5759b4..a020f003 100644 ---- a/libnmstate/netapplier.py -+++ b/libnmstate/netapplier.py -@@ -107,8 +107,14 @@ def rollback(*, checkpoint=None): - - - def _apply_ifaces_state(plugins, net_state, verify_change, save_to_disk): -+ for plugin in plugins: -+ for iface_name in plugin.get_ignored_kernel_interface_names(): -+ iface = net_state.ifaces.all_kernel_ifaces.get(iface_name) -+ if iface and not iface.is_desired: -+ iface.mark_as_ignored() - for plugin in plugins: - plugin.apply_changes(net_state, save_to_disk) -+ - verified = False - if verify_change: - if _net_state_contains_sriov_interface(net_state): -diff --git a/libnmstate/nispor/plugin.py b/libnmstate/nispor/plugin.py -index dc0ea760..19b21d56 100644 ---- a/libnmstate/nispor/plugin.py -+++ b/libnmstate/nispor/plugin.py -@@ -159,7 +159,11 @@ class NisporPlugin(NmstatePlugin): - np_state = NisporNetState.retrieve() - logging.debug(f"Nispor: current network state {np_state}") - for iface in net_state.ifaces.all_ifaces(): -- if iface.is_desired: -+ if iface.is_ignore: -+ logging.debug( -+ f"Nispor: Interface {iface.name} {iface.type} ignored" -+ ) -+ elif iface.is_desired: - logging.debug( - f"Nispor: desired network state {iface.to_dict()}" - ) -diff --git a/libnmstate/nm/plugin.py b/libnmstate/nm/plugin.py -index 302b4cca..335d93c7 100644 ---- a/libnmstate/nm/plugin.py -+++ b/libnmstate/nm/plugin.py -@@ -36,6 +36,7 @@ from .checkpoint import get_checkpoints - from .common import NM - from .context import NmContext - from .device import get_device_common_info -+from .device import get_iface_type - from .device import list_devices - from .dns import get_running as get_dns_running - from .dns import get_running_config as get_dns_running_config -@@ -268,6 +269,21 @@ class NetworkManagerPlugin(NmstatePlugin): - ) - return NmProfiles(None).generate_config_strings(net_state) - -+ def get_ignored_kernel_interface_names(self): -+ """ -+ Return a list of unmanged kernel interface names. -+ """ -+ ignored_ifaces = set() -+ for nm_dev in list_devices(self.client): -+ if ( -+ nm_dev -+ and nm_dev.get_iface() -+ and not nm_dev.get_managed() -+ and _is_kernel_iface(nm_dev) -+ ): -+ ignored_ifaces.add(nm_dev.get_iface()) -+ return list(ignored_ifaces) -+ - - def _remove_ovs_bridge_unsupported_entries(iface_info): - """ -@@ -283,3 +299,12 @@ def _remove_ovs_bridge_unsupported_entries(iface_info): - - def _nm_utils_decode_version(): - return f"{NM.MAJOR_VERSION}.{NM.MINOR_VERSION}.{NM.MICRO_VERSION}" -+ -+ -+def _is_kernel_iface(nm_dev): -+ iface_type = get_iface_type(nm_dev) -+ return iface_type != InterfaceType.UNKNOWN and iface_type not in ( -+ InterfaceType.OVS_BRIDGE, -+ InterfaceType.OVS_INTERFACE, -+ InterfaceType.OVS_PORT, -+ ) -diff --git a/libnmstate/plugin.py b/libnmstate/plugin.py -index ef3874ff..e1d9ad58 100644 ---- a/libnmstate/plugin.py -+++ b/libnmstate/plugin.py -@@ -128,3 +128,10 @@ class NmstatePlugin(metaclass=ABCMeta): - persistently. - """ - return [] -+ -+ def get_ignored_kernel_interface_names(self): -+ """ -+ Return a list of kernel interface names which should be ignored -+ during verification stage. -+ """ -+ return [] --- -2.29.2 - diff --git a/SOURCES/nmstate-1.0.2.tar.gz.asc b/SOURCES/nmstate-1.0.2.tar.gz.asc deleted file mode 100644 index ef664a4..0000000 --- a/SOURCES/nmstate-1.0.2.tar.gz.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCAAdFiEEfUQ+BAINyWGvqJXerIciWuEsPqMFAmAueEYACgkQrIciWuEs -PqPJxw//UmWdCJgoClFkEpWqWUkjMmfkGh70PoxtuOeNrAYwHv9zCHDBFjLtaDG1 -18+jakwrVIlTiFHZqfz1g3o0Te86w5rKiU2y0FBtBPZ1cdcJZk2Is5wb/JJo78n+ -9sWRfZmSN0SMiJ5HfzhTdZ2RsZYRSaDPSUxchRY03LzsBusxoK8swWu9oUHqmYKd -S3k4skP5ZQvpHtKzq9w1lfU4YAw42sRvXHW/++HqGgE0rypf+Wlcu9C+It9kVLCr -3rdp8iTGTg+LRg7LxFmEsRlmPpxhO25LaxjFvYSFnhE94xOt28KXeHBYs8hPPRwh -+z2w6zJ3hgIrLh10IPzePTWk//KNWDRaAJXQTCma1UE4jdL3+wbxb8H3vl5VCrBU -3fuj3JwfvFU1NuDf+yuJ0sCKzNXaAzpYYgfIaCaPdtBpg5jl2DTEfEF8QZKYuJDU -ueCo6reBAlwJzce433aSzBXshFbHG/RdD09duS3p84Dn6ljEN3GfJwUAC9s9TsAQ -U5+rWog6zMpVke/9yqwEf1KmqtLM3/+Ih30CHb3ZoPTf05KB14k0d1CLDdC9d9dy -gN0w8xjdTUXbUXW/XIvRVX9KWqyNI6lnZoL0MWzPwUmMxwPJkRpAVpLKpgyUrVpD -yjtLTFDZJNmfmbi2b0myFFcc2chaXmYlpLCP8vfRYJA3mCee6Xg= -=b/Mh ------END PGP SIGNATURE----- diff --git a/SOURCES/nmstate-1.1.0-alpha1.tar.gz.asc b/SOURCES/nmstate-1.1.0-alpha1.tar.gz.asc new file mode 100644 index 0000000..6a3bac4 --- /dev/null +++ b/SOURCES/nmstate-1.1.0-alpha1.tar.gz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCAAdFiEEfUQ+BAINyWGvqJXerIciWuEsPqMFAmClGHgACgkQrIciWuEs +PqMYChAAhCl3noErgTjRbD2ZHTQdENEmdgMFo3mGhxu2Kl4OMdlHT+qxpcgEOmoO +OL9lTQ2igga69txUrjBedmNDC8OriZQL0M9IqtNb+6vnLjRrm6neVlswa1YIVDw2 +6zT6KrSaizuNeEFezaz61PxHFeIzWyZy/+CfXg3GuRAG7L6D6eRLwm5VxFc3Qwah +3/4RSfZ1YaLNzXD+5g6I1yTozK+CWU0K43mclTXDAixA3mn2fvU++o6mXsEF0uLE +cC8LOzb+oDpmsSTI3CT//GNEMEW8ZTDjfNdPqqlP1F9yqrXbYYSBgNm9IQ+tMubq +usK8EPOzTM01LQDjpuiy5riyLv6dNm5+aI9/F5lOpURrxbQzRNnVyeqK6Uk8h2SW +6x89CtIneQ4LoUEg859TalC9mzAjTv/x2AeEqOq2rW1V12yrEwD7bzYqX9ssEqz2 +hBtqbfZQcdsYzpHV7a8RqEXQctZG2qG2hQGKnaZlUetdvV9hIUV68aFPc4WkanDC +k5Ht0hE8T2+BkgIJcBUgQc7XWOZ94W8nnlPGmwJsE5kO9K93oaonXNAiGjK52jqq +J1C8xqzKPXvwiLO7ZTHlr77UXYQGK/msNXjbH35JUr/1W1mAPRSPPrGWJuUw4iqc +AWrA0tDVoHHHBA9eqDCPcwikBvawPjwA5e6uV3F1ip185wYCEjs= +=hqoY +-----END PGP SIGNATURE----- diff --git a/SPECS/nmstate.spec b/SPECS/nmstate.spec index 30100c0..94f0853 100644 --- a/SPECS/nmstate.spec +++ b/SPECS/nmstate.spec @@ -3,17 +3,14 @@ %define libname libnmstate Name: nmstate -Version: 1.0.2 -Release: 6%{?dist} +Version: 1.1.0 +Release: 0.1%{?dist} Summary: Declarative network manager API License: LGPLv2+ URL: https://github.com/%{srcname}/%{srcname} -Source0: %{url}/releases/download/v%{version}/%{srcname}-%{version}.tar.gz -Source1: %{url}/releases/download/v%{version}/%{srcname}-%{version}.tar.gz.asc +Source0: %{url}/releases/download/v%{version}/%{srcname}-%{version}-alpha1.tar.gz +Source1: %{url}/releases/download/v%{version}/%{srcname}-%{version}-alpha1.tar.gz.asc Source2: https://www.nmstate.io/nmstate.gpg -Patch1: BZ_1931751-nmstate-fix-return-code.patch -Patch2: BZ_1931355-SRIOV-wait-VF-mount-decrease.patch -Patch3: BZ_1935710-nm-Don-t-touch-unmanaged-interface-unless-desired.patch BuildArch: noarch BuildRequires: python3-devel BuildRequires: python3-setuptools @@ -86,6 +83,12 @@ gpgv2 --keyring ./gpgkey-mantainers.gpg %{SOURCE1} %{SOURCE0} %{python3_sitelib}/%{libname}/plugins/__pycache__/nmstate_plugin_ovsdb* %changelog +* Wed May 19 2021 Wen Liang - 1.1.0-0.1 +- Upgrade to 1.1.0 alpha1. + +* Tue Apr 20 2021 Fernando Fernandez Mancera - 1.0.3-1 +- Upgrade to 1.0.3. RHBZ#1942458 + * Fri Mar 26 2021 Fernando Fernandez Mancera - 1.0.2-6 - Rebuild for RHEL 8.5. RHBZ#1935710