From de9c1d06d9a6cfe54dbc36773d250c58c8026a8f Mon Sep 17 00:00:00 2001 From: Gris Ge Date: Tue, 27 Jul 2021 12:57:56 +0800 Subject: [PATCH] Upgrade to 1.1.0 Signed-off-by: Gris Ge --- .gitignore | 2 + ...mstatectl-fix-long-arguments-support.patch | 53 +++++++++ ...rve-existing-ethtool-settings-when-u.patch | 105 ++++++++++++++++++ ...nore-for-ovs-port-when-removing-them.patch | 87 +++++++++++++++ ...of-empty-next_hop_address-and-destin.patch | 86 ++++++++++++++ nmstate.spec | 16 ++- sources | 4 +- 7 files changed, 346 insertions(+), 7 deletions(-) create mode 100644 0001-nmstatectl-fix-long-arguments-support.patch create mode 100644 0002-nm-ethtool-Preserve-existing-ethtool-settings-when-u.patch create mode 100644 0003-ovs-fix-state-ignore-for-ovs-port-when-removing-them.patch create mode 100644 0004-nispor-fix-show-of-empty-next_hop_address-and-destin.patch diff --git a/.gitignore b/.gitignore index 2918d58..50acc89 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,5 @@ /nmstate-1.0.2.tar.gz /nmstate-1.0.3.tar.gz /nmstate-1.0.3.tar.gz.asc +/nmstate-1.1.0.tar.gz +/nmstate-1.1.0.tar.gz.asc diff --git a/0001-nmstatectl-fix-long-arguments-support.patch b/0001-nmstatectl-fix-long-arguments-support.patch new file mode 100644 index 0000000..4334857 --- /dev/null +++ b/0001-nmstatectl-fix-long-arguments-support.patch @@ -0,0 +1,53 @@ +From 99c7f643bab33a26c317e1b72ca3b8490cb1ea60 Mon Sep 17 00:00:00 2001 +From: Fernando Fernandez Mancera +Date: Fri, 16 Jul 2021 08:57:27 +0200 +Subject: [PATCH 1/4] nmstatectl: fix long arguments support + +The support for long arguments is broken. This patch is fixing it and +solving the following errors: + +``` +[root@d0b4a6a0f7a5 nmstate-workspace]# nmstatectl show --running-config +usage: nmstatectl [-h] [--version] + {commit,edit,rollback,set,apply,show,version,gc} ... +nmstatectl: error: unrecognized arguments: --running-config +[root@d0b4a6a0f7a5 nmstate-workspace]# nmstatectl show --show-secrets +usage: nmstatectl [-h] [--version] + {commit,edit,rollback,set,apply,show,version,gc} ... +nmstatectl: error: unrecognized arguments: --show-secrets +``` + +Integration test case added. + +Signed-off-by: Fernando Fernandez Mancera +Signed-off-by: Gris Ge +--- + nmstatectl/nmstatectl.py | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/nmstatectl/nmstatectl.py b/nmstatectl/nmstatectl.py +index a9f4cb6..6f83069 100644 +--- a/nmstatectl/nmstatectl.py ++++ b/nmstatectl/nmstatectl.py +@@ -223,14 +223,16 @@ def setup_subcommand_show(subparsers): + dest="yaml", + ) + parser_show.add_argument( +- "-r, --running-config", ++ "-r", ++ "--running-config", + help="Show running configurations", + default=False, + action="store_true", + dest="running_config", + ) + parser_show.add_argument( +- "-s, --show-secrets", ++ "-s", ++ "--show-secrets", + help="Show secrets also", + default=False, + action="store_true", +-- +2.32.0 + diff --git a/0002-nm-ethtool-Preserve-existing-ethtool-settings-when-u.patch b/0002-nm-ethtool-Preserve-existing-ethtool-settings-when-u.patch new file mode 100644 index 0000000..5f5ebec --- /dev/null +++ b/0002-nm-ethtool-Preserve-existing-ethtool-settings-when-u.patch @@ -0,0 +1,105 @@ +From b1cb57d1dc4bba6592ba5cfc5c810a2ad19ac941 Mon Sep 17 00:00:00 2001 +From: Gris Ge +Date: Thu, 22 Jul 2021 18:40:50 +0800 +Subject: [PATCH 2/4] nm ethtool: Preserve existing ethtool settings when + undesired + +When user does not define ethtool settings in desire state, +we should preserve existing ethtool setting. + +Integration test case included. + +Signed-off-by: Gris Ge +Signed-off-by: Fernando Fernandez Mancera +--- + libnmstate/nm/connection.py | 18 +++--------------- + libnmstate/nm/ethtool.py | 26 +++++++++++++++++++++++++- + 2 files changed, 28 insertions(+), 16 deletions(-) + +diff --git a/libnmstate/nm/connection.py b/libnmstate/nm/connection.py +index 5d60f6d..5a79c6f 100644 +--- a/libnmstate/nm/connection.py ++++ b/libnmstate/nm/connection.py +@@ -22,8 +22,6 @@ + import uuid + + from libnmstate.error import NmstatePluginError +-from libnmstate.ifaces import IfaceEthtool +-from libnmstate.schema import Ethtool + from libnmstate.schema import Interface + from libnmstate.schema import InterfaceType + from libnmstate.schema import LinuxBridge as LB +@@ -240,19 +238,9 @@ def create_new_nm_simple_conn(iface, nm_profile): + if iface.ieee_802_1x_conf: + settings.append(create_802_1x_setting(iface.ieee_802_1x_conf)) + +- if Ethtool.CONFIG_SUBTREE in iface.original_desire_dict: +- iface_ethtool = IfaceEthtool( +- iface.original_desire_dict[Ethtool.CONFIG_SUBTREE] +- ) +- iface_ethtool.canonicalize( +- iface.original_desire_dict[Ethtool.CONFIG_SUBTREE] +- ) +- setting = create_ethtool_setting( +- iface_ethtool, +- nm_profile, +- ) +- if setting: +- settings.append(setting) ++ ethtool_setting = create_ethtool_setting(iface, nm_profile) ++ if ethtool_setting: ++ settings.append(ethtool_setting) + + nm_simple_conn = NM.SimpleConnection.new() + for setting in settings: +diff --git a/libnmstate/nm/ethtool.py b/libnmstate/nm/ethtool.py +index 466f4f9..3cad1bf 100644 +--- a/libnmstate/nm/ethtool.py ++++ b/libnmstate/nm/ethtool.py +@@ -22,6 +22,7 @@ import logging + from .common import NM + from .common import GLib + ++from libnmstate.ifaces import IfaceEthtool + from libnmstate.schema import Ethtool + + +@@ -59,7 +60,7 @@ _NM_COALESCE_OPT_NAME_MAP = { + } + + +-def create_ethtool_setting(iface_ethtool, base_con_profile): ++def _create_ethtool_setting(iface_ethtool, base_con_profile): + nm_setting = None + + if base_con_profile: +@@ -159,3 +160,26 @@ def nm_set_pause(nm_setting, autoneg, rx, tx): + tx_value, + ) + # pylint: enable=no-member ++ ++ ++def create_ethtool_setting(iface, base_con_profile): ++ if Ethtool.CONFIG_SUBTREE in iface.original_desire_dict: ++ iface_ethtool = IfaceEthtool( ++ iface.original_desire_dict[Ethtool.CONFIG_SUBTREE] ++ ) ++ iface_ethtool.canonicalize( ++ iface.original_desire_dict[Ethtool.CONFIG_SUBTREE] ++ ) ++ return _create_ethtool_setting( ++ iface_ethtool, ++ base_con_profile, ++ ) ++ else: ++ # Preserve existing setting but not create new ++ if base_con_profile: ++ ethtool_setting = base_con_profile.get_setting_by_name( ++ NM.SETTING_ETHTOOL_SETTING_NAME ++ ) ++ if ethtool_setting: ++ return ethtool_setting.duplicate() ++ return None +-- +2.32.0 + diff --git a/0003-ovs-fix-state-ignore-for-ovs-port-when-removing-them.patch b/0003-ovs-fix-state-ignore-for-ovs-port-when-removing-them.patch new file mode 100644 index 0000000..ba000ef --- /dev/null +++ b/0003-ovs-fix-state-ignore-for-ovs-port-when-removing-them.patch @@ -0,0 +1,87 @@ +From f4d190653c55d399b32afc956b2b4a1ff8d20101 Mon Sep 17 00:00:00 2001 +From: Fernando Fernandez Mancera +Date: Mon, 26 Jul 2021 09:58:23 +0200 +Subject: [PATCH 3/4] ovs: fix state=ignore for ovs port when removing them + +When removing an ovs port while the interface is marked as ignored, the +interface should not being removed from the ovs bridge as the user +specidied it should be ignored. + +Example: + +``` +interfaces: +- name: dummy0 + type: dummy + state: ignore +- name: ovsbr0 + type: ovs-bridge + state: up + bridge: + port: + - name: ovs0 +``` + +Integration test case added. + +Signed-off-by: Fernando Fernandez Mancera +Signed-off-by: Gris Ge +--- + libnmstate/nm/profiles.py | 22 ++++++++++++++++++++-- + 1 file changed, 20 insertions(+), 2 deletions(-) + +diff --git a/libnmstate/nm/profiles.py b/libnmstate/nm/profiles.py +index beda5c7..3b0b6be 100644 +--- a/libnmstate/nm/profiles.py ++++ b/libnmstate/nm/profiles.py +@@ -23,6 +23,8 @@ + import logging + from operator import attrgetter + ++from libnmstate.schema import Interface ++from libnmstate.schema import InterfaceState + from libnmstate.schema import InterfaceType + + from .common import NM +@@ -359,7 +361,7 @@ def _delete_orphan_nm_ovs_port_profiles( + continue + # When OVS port has no child, delete it + ovs_bridge_iface = ovs_bridge_profile.iface +- if not _nm_ovs_port_has_child( ++ if not _nm_ovs_port_has_child_or_is_ignored( + nm_profile, ovs_bridge_iface, net_state + ): + ProfileDelete( +@@ -404,7 +406,9 @@ def _use_uuid_as_controller_and_parent(nm_profiles): + nm_profile.update_parent(uuid) + + +-def _nm_ovs_port_has_child(nm_profile, ovs_bridge_iface, net_state): ++def _nm_ovs_port_has_child_or_is_ignored( ++ nm_profile, ovs_bridge_iface, net_state ++): + ovs_port_uuid = nm_profile.get_uuid() + ovs_port_name = nm_profile.get_interface_name() + for ovs_iface_name in ovs_bridge_iface.port: +@@ -415,4 +419,18 @@ def _nm_ovs_port_has_child(nm_profile, ovs_bridge_iface, net_state): + and ovs_iface.controller_type == InterfaceType.OVS_PORT + ): + return True ++ # Gather the ovs bridge interface from the current state in order to check ++ # if any port is ignored in the original desired state. ++ current_ovs_bridge = net_state.ifaces.get_cur_iface( ++ ovs_bridge_iface.name, InterfaceType.OVS_BRIDGE ++ ) ++ if current_ovs_bridge: ++ for port_name in current_ovs_bridge.port: ++ port_iface = net_state.ifaces.all_kernel_ifaces.get(port_name) ++ if ( ++ port_iface ++ and port_iface.original_desire_dict.get(Interface.STATE) ++ == InterfaceState.IGNORE ++ ): ++ return True + return False +-- +2.32.0 + diff --git a/0004-nispor-fix-show-of-empty-next_hop_address-and-destin.patch b/0004-nispor-fix-show-of-empty-next_hop_address-and-destin.patch new file mode 100644 index 0000000..40be31b --- /dev/null +++ b/0004-nispor-fix-show-of-empty-next_hop_address-and-destin.patch @@ -0,0 +1,86 @@ +From 369ed3210ecedfa1deda88a6eb7cacc19a47f89d Mon Sep 17 00:00:00 2001 +From: Fernando Fernandez Mancera +Date: Mon, 26 Jul 2021 16:13:15 +0200 +Subject: [PATCH 4/4] nispor: fix show of empty next_hop_address and + destination + +The correct way of representing an empty next_hop_address is using +"0.0.0.0" for IPv4 and "::" for IPv6. This configuration is valid +because an user should be able to specify the following routes: + +``` +--- +routes: + config: + - destination: 0.0.0.0/0 + next-hop-address: 0.0.0.0 + next-hop-interface: dummy + - destination: ::/0 + next-hop-address: "::" + next-hop-interface: dummy + +``` + +That means each of the hosts within the range of the route are +considered to be directly connected through that interface. + +For example, using iproute2 the user should introduce the following +command: + +`ip route 0.0.0.0 0.0.0.0 dummy` + +Integration test case added. + +Ref: https://bugzilla.redhat.com/1985879 + +Signed-off-by: Fernando Fernandez Mancera +Signed-off-by: Gris Ge +--- + libnmstate/nispor/route.py | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/libnmstate/nispor/route.py b/libnmstate/nispor/route.py +index 510ddc3..9852ba5 100644 +--- a/libnmstate/nispor/route.py ++++ b/libnmstate/nispor/route.py +@@ -23,6 +23,9 @@ from libnmstate.schema import Route + IPV4_DEFAULT_GATEWAY_DESTINATION = "0.0.0.0/0" + IPV6_DEFAULT_GATEWAY_DESTINATION = "::/0" + ++IPV4_EMPTY_NEXT_HOP_ADDRESS = "0.0.0.0" ++IPV6_EMPTY_NEXT_HOP_ADDRESS = "::" ++ + LOCAL_ROUTE_TABLE = 255 + + +@@ -50,21 +53,23 @@ def nispor_route_state_to_nmstate_static(np_routes): + def _nispor_route_to_nmstate(np_rt): + if np_rt.dst: + destination = np_rt.dst +- elif np_rt.gateway: ++ else: + destination = ( + IPV6_DEFAULT_GATEWAY_DESTINATION + if np_rt.address_family == "ipv6" + else IPV4_DEFAULT_GATEWAY_DESTINATION + ) +- else: +- destination = "" + + if np_rt.via: + next_hop = np_rt.via + elif np_rt.gateway: + next_hop = np_rt.gateway + else: +- next_hop = "" ++ next_hop = ( ++ IPV6_EMPTY_NEXT_HOP_ADDRESS ++ if np_rt.address_family == "ipv6" ++ else IPV4_EMPTY_NEXT_HOP_ADDRESS ++ ) + + return { + Route.TABLE_ID: np_rt.table, +-- +2.32.0 + diff --git a/nmstate.spec b/nmstate.spec index 5b18ce6..c83815e 100644 --- a/nmstate.spec +++ b/nmstate.spec @@ -3,14 +3,18 @@ %define libname libnmstate Name: nmstate -Version: 1.0.3 -Release: 4%{?dist} +Version: 1.1.0 +Release: 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 Source2: nmstate.gpg +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 BuildArch: noarch BuildRequires: python3-devel BuildRequires: python3-setuptools @@ -73,16 +77,15 @@ gpgv2 --keyring ./gpgkey-mantainers.gpg %{SOURCE1} %{SOURCE0} %install %py3_install mkdir -p %{buildroot}%{_unitdir} -install -p -m 644 %{buildroot}%{python3_sitelib}/nmstatectl/nmstate-varlink.service \ - %{buildroot}%{_unitdir}/nmstate-varlink.service %files %doc README.md %doc examples/ %{_mandir}/man8/nmstatectl.8* +%{_mandir}/man8/nmstate-autoconf.8* %{python3_sitelib}/nmstatectl %{_bindir}/nmstatectl -%{_unitdir}/nmstate-varlink.service +%{_bindir}/nmstate-autoconf %files -n python3-%{libname} %license LICENSE @@ -96,6 +99,9 @@ install -p -m 644 %{buildroot}%{python3_sitelib}/nmstatectl/nmstate-varlink.serv %{python3_sitelib}/%{libname}/plugins/__pycache__/nmstate_plugin_ovsdb* %changelog +* Tue Jul 27 2021 Gris Ge - 1.1.0-1 +- Upgrade to 1.1.0 + * Thu Jul 22 2021 Fedora Release Engineering - 1.0.3-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild diff --git a/sources b/sources index d0adf4b..abecfea 100644 --- a/sources +++ b/sources @@ -1,3 +1,3 @@ -SHA512 (nmstate-1.0.3.tar.gz) = 2302979f4a0c029c778cc93e586a0b81e93fdc3f605dbc212034222899b0642863bd7c0f39b7021cd2d7274420c2e6cd4975719110a0330a867e923d8d8831bb -SHA512 (nmstate-1.0.3.tar.gz.asc) = 5d9936b1ecf02e67f232379e0cbfe9741836d3179f8ef110e149d9e53436a5c475898ea17427538c4da011107c9d46287c968fb7540078714caf97173a888da8 +SHA512 (nmstate-1.1.0.tar.gz) = f99e4fdcc0317d0b3d88e8281f5f222adcce4b8ce2d6c2f48858c934219d61701af75e416e04fc03416ce9c7787ec989673c20208b9efe0fe7bf3346a7f48373 +SHA512 (nmstate-1.1.0.tar.gz.asc) = 9bd8075b08ccadefb3920a78ab569e36991bce34e9c527913da35a307e40a74b162d91a9517827c0043394ec2fa5604f2d81c361a763aaf9c11c133999376a3b SHA512 (nmstate.gpg) = af6af2024ea46b5c87c6c71d4be278ce4eed58c1783385619987fe8e254eb599f9b218897e7db67050b0e9f7101b206561f63218fda18a0d95103a04682c8309