From 875d5f195058518940f5b2143d80ecb91f8d474a Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Mon, 8 Apr 2024 03:07:00 -0400 Subject: [PATCH] * Mon Apr 08 2024 Miroslav Rezanina - 23.4-8 - ci-fix-Correct-v2-NetworkManager-route-rendering-4637.patch [RHEL-20964] - ci-feat-apply-global-DNS-to-interfaces-in-network-manag.patch [RHEL-20964] - ci-fix-Undeprecate-network-in-schema-route-definition-5.patch [RHEL-29709] - Resolves: RHEL-20964 ([rhel-9]cloud-init fails to configure DNS/search domains for network-config v1) - Resolves: RHEL-29709 (Suggest to backport patch ff40d1a to undeprecate 'network' in schema route definition) --- ...l-DNS-to-interfaces-in-network-manag.patch | 207 ++++++++++ ...-NetworkManager-route-rendering-4637.patch | 391 ++++++++++++++++++ ...network-in-schema-route-definition-5.patch | 42 ++ cloud-init.spec | 17 +- 4 files changed, 656 insertions(+), 1 deletion(-) create mode 100644 ci-feat-apply-global-DNS-to-interfaces-in-network-manag.patch create mode 100644 ci-fix-Correct-v2-NetworkManager-route-rendering-4637.patch create mode 100644 ci-fix-Undeprecate-network-in-schema-route-definition-5.patch diff --git a/ci-feat-apply-global-DNS-to-interfaces-in-network-manag.patch b/ci-feat-apply-global-DNS-to-interfaces-in-network-manag.patch new file mode 100644 index 0000000..bbef09a --- /dev/null +++ b/ci-feat-apply-global-DNS-to-interfaces-in-network-manag.patch @@ -0,0 +1,207 @@ +From c21351ad9da5aebcb252aa36cbfa92ac16fa9746 Mon Sep 17 00:00:00 2001 +From: Florian Apolloner +Date: Fri, 5 Jan 2024 19:07:12 +0100 +Subject: [PATCH 2/3] feat: apply global DNS to interfaces in network-manager + (#4723) + +RH-Author: Cathy Avery +RH-MergeRequest: 72: Fixes for cloud-init fails to configure DNS/search domains for network-config v1 +RH-Jira: RHEL-20964 +RH-Acked-by: Ani Sinha +RH-Acked-by: Emanuele Giuseppe Esposito +RH-Commit: [2/2] 1d2b10133ec2558e9665f21f53e4b1a898e283a8 (cavery/cloud-init-c-9-s) + +Sometimes DNS settings in cloud configs are specified globally and +not per interface / subnet. This results in a configuration without +proper nameservers. This was fixed for netplan in d29eeccd and is +now also applied to the network-manager renderer. + +Co-authored-by: James Falcon +(cherry picked from commit 0d787d0a262f70ff848b315633742aa8fc45a1de) +Signed-off-by: Cathy Avery +--- + cloudinit/net/network_manager.py | 52 ++++++++++++++--------- + tests/unittests/net/test_net_rendering.py | 3 ++ + tests/unittests/test_net.py | 11 +++++ + tools/.github-cla-signers | 1 + + 4 files changed, 47 insertions(+), 20 deletions(-) + +diff --git a/cloudinit/net/network_manager.py b/cloudinit/net/network_manager.py +index bd6e6d75..0ba210b7 100644 +--- a/cloudinit/net/network_manager.py ++++ b/cloudinit/net/network_manager.py +@@ -246,7 +246,7 @@ class NMConnection: + """ + return addr.replace("-", ":").upper() + +- def render_interface(self, iface, renderer): ++ def render_interface(self, iface, network_state, renderer): + """ + Integrate information from network state interface information + into the connection. Most of the work is done here. +@@ -311,7 +311,6 @@ class NMConnection: + found_dns_search = [] + + # Deal with Layer 3 configuration +- use_top_level_dns = "dns" in iface + for subnet in iface["subnets"]: + family = "ipv6" if subnet_is_ipv6(subnet) else "ipv4" + +@@ -322,26 +321,39 @@ class NMConnection: + self.config[family]["gateway"] = subnet["gateway"] + for route in subnet["routes"]: + self._add_route(route) +- if not use_top_level_dns and "dns_nameservers" in subnet: +- for nameserver in subnet["dns_nameservers"]: +- found_nameservers.append(nameserver) +- if not use_top_level_dns and "dns_search" in subnet: +- found_dns_search.append(subnet["dns_search"]) ++ # Add subnet-level DNS ++ if "dns_nameservers" in subnet: ++ found_nameservers.extend(subnet["dns_nameservers"]) ++ if "dns_search" in subnet: ++ found_dns_search.extend(subnet["dns_search"]) + if family == "ipv4" and "mtu" in subnet: + ipv4_mtu = subnet["mtu"] + +- # Now add our DNS search domains. We add them later because we +- # only want them if an IP family has already been defined +- if use_top_level_dns: +- for nameserver in iface["dns"]["nameservers"]: +- self._add_nameserver(nameserver) +- if iface["dns"]["search"]: +- self._add_dns_search(iface["dns"]["search"]) +- else: +- for nameserver in found_nameservers: +- self._add_nameserver(nameserver) +- for dns_search in found_dns_search: +- self._add_dns_search(dns_search) ++ # Add interface-level DNS ++ if "dns" in iface: ++ found_nameservers += [ ++ dns ++ for dns in iface["dns"]["nameservers"] ++ if dns not in found_nameservers ++ ] ++ found_dns_search += [ ++ search ++ for search in iface["dns"]["search"] ++ if search not in found_dns_search ++ ] ++ ++ # We prefer any interface-specific DNS entries, but if we do not ++ # have any, add the global DNS to the connection ++ if not found_nameservers and network_state.dns_nameservers: ++ found_nameservers = network_state.dns_nameservers ++ if not found_dns_search and network_state.dns_searchdomains: ++ found_dns_search = network_state.dns_searchdomains ++ ++ # Write out all DNS entries to the connection ++ for nameserver in found_nameservers: ++ self._add_nameserver(nameserver) ++ if found_dns_search: ++ self._add_dns_search(found_dns_search) + + # we do not want to set may-fail to false for both ipv4 and ipv6 dhcp + # at the at the same time. This will make the network configuration +@@ -457,7 +469,7 @@ class Renderer(renderer.Renderer): + # Now render the actual interface configuration + for iface in network_state.iter_interfaces(): + conn = self.connections[iface["name"]] +- conn.render_interface(iface, self) ++ conn.render_interface(iface, network_state, self) + + # And finally write the files + for con_id, conn in self.connections.items(): +diff --git a/tests/unittests/net/test_net_rendering.py b/tests/unittests/net/test_net_rendering.py +index 06feab89..f340ffc1 100644 +--- a/tests/unittests/net/test_net_rendering.py ++++ b/tests/unittests/net/test_net_rendering.py +@@ -88,6 +88,9 @@ def _check_network_manager(network_state: NetworkState, tmp_path: Path): + "test_name, renderers", + [("no_matching_mac_v2", Renderer.Netplan | Renderer.NetworkManager)], + ) ++@pytest.mark.xfail( ++ reason="v2 interface-specific DNS errantly gets applied globally" ++) + def test_convert(test_name, renderers, tmp_path): + network_config = safeyaml.load( + Path(ARTIFACT_DIR, f"{test_name}.yaml").read_text() +diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py +index 2a99f150..d7c9a414 100644 +--- a/tests/unittests/test_net.py ++++ b/tests/unittests/test_net.py +@@ -646,6 +646,7 @@ method=manual + may-fail=false + address1=172.19.1.34/22 + route1=0.0.0.0/0,172.19.3.254 ++dns=172.19.0.12; + + """.lstrip(), + ), +@@ -2797,6 +2798,8 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true + [ipv4] + method=auto + may-fail=false ++ dns=8.8.8.8;4.4.4.4;8.8.4.4; ++ dns-search=barley.maas;wark.maas;foobar.maas; + + """ + ), +@@ -2822,6 +2825,8 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true + method=manual + may-fail=false + address1=192.168.200.7/24 ++ dns=8.8.8.8;4.4.4.4;8.8.4.4; ++ dns-search=barley.maas;wark.maas;foobar.maas; + + """ + ), +@@ -2846,6 +2851,8 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true + [ipv4] + method=auto + may-fail=false ++ dns=8.8.8.8;4.4.4.4;8.8.4.4; ++ dns-search=barley.maas;wark.maas;foobar.maas; + + """ + ), +@@ -2930,12 +2937,15 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true + method=manual + may-fail=false + address1=192.168.14.2/24 ++ dns=8.8.8.8;4.4.4.4;8.8.4.4; ++ dns-search=barley.maas;wark.maas;foobar.maas; + + [ipv6] + method=manual + may-fail=false + address1=2001:1::1/64 + route1=::/0,2001:4800:78ff:1b::1 ++ dns-search=barley.maas;wark.maas;foobar.maas; + + """ + ), +@@ -2990,6 +3000,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true + [ipv6] + method=auto + may-fail=false ++ dns-search=barley.maas;wark.maas;foobar.maas; + + """ + ), +diff --git a/tools/.github-cla-signers b/tools/.github-cla-signers +index dbdb9cfa..f4da0989 100644 +--- a/tools/.github-cla-signers ++++ b/tools/.github-cla-signers +@@ -13,6 +13,7 @@ andrewbogott + andrewlukoshko + ani-sinha + antonyc ++apollo13 + aswinrajamannar + bdrung + beantaxi +-- +2.39.3 + diff --git a/ci-fix-Correct-v2-NetworkManager-route-rendering-4637.patch b/ci-fix-Correct-v2-NetworkManager-route-rendering-4637.patch new file mode 100644 index 0000000..6d13dc7 --- /dev/null +++ b/ci-fix-Correct-v2-NetworkManager-route-rendering-4637.patch @@ -0,0 +1,391 @@ +From aaf1d063f198ce09f0d539a85e1a1a2bb834520b Mon Sep 17 00:00:00 2001 +From: James Falcon +Date: Tue, 2 Jan 2024 11:29:17 -0600 +Subject: [PATCH 1/3] fix: Correct v2 NetworkManager route rendering (#4637) + +RH-Author: Cathy Avery +RH-MergeRequest: 72: Fixes for cloud-init fails to configure DNS/search domains for network-config v1 +RH-Jira: RHEL-20964 +RH-Acked-by: Ani Sinha +RH-Acked-by: Emanuele Giuseppe Esposito +RH-Commit: [1/2] fb865987dbcf506a674eb9798f9c06859539a696 (cavery/cloud-init-c-9-s) + +fix: Correct v2 NetworkManager route rendering + +Because network v2 route defintions can have mixed v4 and v6 routes, we +need to determine the IP family per route rather than per subnet. + +Similar, ensure dns-search is rendered correctly. + +Fixes GH-4518 + +(cherry picked from commit c2c100e8c9fd8709539b3ab2b0ee34c66ba3f2f7) +Signed-off-by: Cathy Avery +--- + cloudinit/net/__init__.py | 2 + + cloudinit/net/network_manager.py | 87 +++++++++------- + tests/unittests/test_net.py | 165 ++++++++++++++++++++++++++++++- + 3 files changed, 219 insertions(+), 35 deletions(-) + +diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py +index c0888f52..65e7ff33 100644 +--- a/cloudinit/net/__init__.py ++++ b/cloudinit/net/__init__.py +@@ -1287,6 +1287,8 @@ def subnet_is_ipv6(subnet) -> bool: + """Common helper for checking network_state subnets for ipv6.""" + # 'static6', 'dhcp6', 'ipv6_dhcpv6-stateful', 'ipv6_dhcpv6-stateless' or + # 'ipv6_slaac' ++ # This function is inappropriate for v2-based routes as routes defined ++ # under v2 subnets can contain ipv4 and ipv6 simultaneously + if subnet["type"].endswith("6") or subnet["type"] in IPV6_DYNAMIC_TYPES: + # This is a request either static6 type or DHCPv6. + return True +diff --git a/cloudinit/net/network_manager.py b/cloudinit/net/network_manager.py +index 76a0ac15..bd6e6d75 100644 +--- a/cloudinit/net/network_manager.py ++++ b/cloudinit/net/network_manager.py +@@ -12,10 +12,15 @@ import itertools + import logging + import os + import uuid +-from typing import Optional ++from typing import List, Optional + + from cloudinit import subp, util +-from cloudinit.net import is_ipv6_address, renderer, subnet_is_ipv6 ++from cloudinit.net import ( ++ is_ipv6_address, ++ is_ipv6_network, ++ renderer, ++ subnet_is_ipv6, ++) + from cloudinit.net.network_state import NetworkState + from cloudinit.net.sysconfig import available_nm_ifcfg_rh + +@@ -158,11 +163,11 @@ class NMConnection: + if self.config[family]["method"] == "auto" and method == "manual": + return + +- if ( +- subnet_type == "ipv6_dhcpv6-stateful" +- or subnet_type == "ipv6_dhcpv6-stateless" +- or subnet_type == "ipv6_slaac" +- ): ++ if subnet_type in [ ++ "ipv6_dhcpv6-stateful", ++ "ipv6_dhcpv6-stateless", ++ "ipv6_slaac", ++ ]: + # set ipv4 method to 'disabled' to align with sysconfig renderer. + self._set_default("ipv4", "method", "disabled") + +@@ -174,7 +179,8 @@ class NMConnection: + Adds a numbered property, such as address or route, ensuring + the appropriate value gets used for . + """ +- ++ if not self.config.has_section(section): ++ self.config[section] = {} + for index in itertools.count(1): + key = f"{key_prefix}{index}" + if not self.config.has_option(section, key): +@@ -189,40 +195,37 @@ class NMConnection: + value = subnet["address"] + "/" + str(subnet["prefix"]) + self._add_numbered(family, "address", value) + +- def _add_route(self, family, route): +- """ +- Adds a ipv[46].route property. +- """ +- ++ def _add_route(self, route): ++ """Adds a ipv[46].route property.""" ++ # Because network v2 route definitions can have mixed v4 and v6 ++ # routes, determine the family per route based on the gateway ++ family = "ipv6" if is_ipv6_network(route["gateway"]) else "ipv4" + value = route["network"] + "/" + str(route["prefix"]) + if "gateway" in route: + value = value + "," + route["gateway"] + self._add_numbered(family, "route", value) + +- def _add_nameserver(self, dns): ++ def _add_nameserver(self, dns: str) -> None: + """ + Extends the ipv[46].dns property with a name server. + """ +- +- # FIXME: the subnet contains IPv4 and IPv6 name server mixed +- # together. We might be getting an IPv6 name server while +- # we're dealing with an IPv4 subnet. Sort this out by figuring +- # out the correct family and making sure a valid section exist. + family = "ipv6" if is_ipv6_address(dns) else "ipv4" +- self._set_default(family, "method", "disabled") +- +- self._set_default(family, "dns", "") +- self.config[family]["dns"] = self.config[family]["dns"] + dns + ";" ++ if self.config.has_section(family): ++ self._set_default(family, "dns", "") ++ self.config[family]["dns"] = self.config[family]["dns"] + dns + ";" + +- def _add_dns_search(self, family, dns_search): ++ def _add_dns_search(self, dns_search: List[str]) -> None: + """ + Extends the ipv[46].dns-search property with a name server. + """ +- +- self._set_default(family, "dns-search", "") +- self.config[family]["dns-search"] = ( +- self.config[family]["dns-search"] + ";".join(dns_search) + ";" +- ) ++ for family in ["ipv4", "ipv6"]: ++ if self.config.has_section(family): ++ self._set_default(family, "dns-search", "") ++ self.config[family]["dns-search"] = ( ++ self.config[family]["dns-search"] ++ + ";".join(dns_search) ++ + ";" ++ ) + + def con_uuid(self): + """ +@@ -304,8 +307,11 @@ class NMConnection: + + device_mtu = iface["mtu"] + ipv4_mtu = None ++ found_nameservers = [] ++ found_dns_search = [] + + # Deal with Layer 3 configuration ++ use_top_level_dns = "dns" in iface + for subnet in iface["subnets"]: + family = "ipv6" if subnet_is_ipv6(subnet) else "ipv4" + +@@ -315,15 +321,28 @@ class NMConnection: + if "gateway" in subnet: + self.config[family]["gateway"] = subnet["gateway"] + for route in subnet["routes"]: +- self._add_route(family, route) +- if "dns_nameservers" in subnet: ++ self._add_route(route) ++ if not use_top_level_dns and "dns_nameservers" in subnet: + for nameserver in subnet["dns_nameservers"]: +- self._add_nameserver(nameserver) +- if "dns_search" in subnet: +- self._add_dns_search(family, subnet["dns_search"]) ++ found_nameservers.append(nameserver) ++ if not use_top_level_dns and "dns_search" in subnet: ++ found_dns_search.append(subnet["dns_search"]) + if family == "ipv4" and "mtu" in subnet: + ipv4_mtu = subnet["mtu"] + ++ # Now add our DNS search domains. We add them later because we ++ # only want them if an IP family has already been defined ++ if use_top_level_dns: ++ for nameserver in iface["dns"]["nameservers"]: ++ self._add_nameserver(nameserver) ++ if iface["dns"]["search"]: ++ self._add_dns_search(iface["dns"]["search"]) ++ else: ++ for nameserver in found_nameservers: ++ self._add_nameserver(nameserver) ++ for dns_search in found_dns_search: ++ self._add_dns_search(dns_search) ++ + # we do not want to set may-fail to false for both ipv4 and ipv6 dhcp + # at the at the same time. This will make the network configuration + # work only when both ipv4 and ipv6 dhcp succeeds. This may not be +diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py +index d9ef493b..2a99f150 100644 +--- a/tests/unittests/test_net.py ++++ b/tests/unittests/test_net.py +@@ -2962,9 +2962,9 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true + may-fail=false + address1=192.168.0.2/24 + gateway=192.168.0.1 ++ address2=192.168.2.10/24 + dns=192.168.0.10;10.23.23.134; + dns-search=barley.maas;sacchromyces.maas;brettanomyces.maas; +- address2=192.168.2.10/24 + + """ + ), +@@ -4154,6 +4154,148 @@ iface bond0 inet6 static + """ + ), + }, ++ "v2-mixed-routes": { ++ "expected_network_manager": { ++ "cloud-init-eth0.nmconnection": textwrap.dedent( ++ """\ ++ # Generated by cloud-init. Changes will be lost. ++ ++ [connection] ++ id=cloud-init eth0 ++ uuid=1dd9a779-d327-56e1-8454-c65e2556c12c ++ autoconnect-priority=120 ++ type=ethernet ++ interface-name=eth0 ++ ++ [user] ++ org.freedesktop.NetworkManager.origin=cloud-init ++ ++ [ethernet] ++ ++ [ipv4] ++ method=auto ++ may-fail=true ++ route1=169.254.42.42/32,62.210.0.1 ++ route2=169.254.42.43/32,62.210.0.2 ++ address1=192.168.1.20/16 ++ dns=8.8.8.8; ++ dns-search=lab;home; ++ ++ [ipv6] ++ route1=::/0,fe80::dc00:ff:fe20:186 ++ route2=fe80::dc00:ff:fe20:188/64,fe80::dc00:ff:fe20:187 ++ method=auto ++ may-fail=true ++ address1=2001:bc8:1210:232:dc00:ff:fe20:185/64 ++ dns=FEDC::1; ++ dns-search=lab;home; ++ ++ """ ++ ) ++ }, ++ "yaml": textwrap.dedent( ++ """\ ++ version: 2 ++ ethernets: ++ eth0: ++ dhcp4: true ++ dhcp6: true ++ nameservers: ++ search: [lab, home] ++ addresses: [8.8.8.8, "FEDC::1"] ++ routes: ++ - to: 169.254.42.42/32 ++ via: 62.210.0.1 ++ - via: fe80::dc00:ff:fe20:186 ++ to: ::/0 ++ - to: 169.254.42.43/32 ++ via: 62.210.0.2 ++ - via: fe80::dc00:ff:fe20:187 ++ to: fe80::dc00:ff:fe20:188 ++ addresses: ++ - 192.168.1.20/16 ++ - 2001:bc8:1210:232:dc00:ff:fe20:185/64 ++ """ ++ ), ++ }, ++ "v2-dns-no-if-ips": { ++ "expected_network_manager": { ++ "cloud-init-eth0.nmconnection": textwrap.dedent( ++ """\ ++ # Generated by cloud-init. Changes will be lost. ++ ++ [connection] ++ id=cloud-init eth0 ++ uuid=1dd9a779-d327-56e1-8454-c65e2556c12c ++ autoconnect-priority=120 ++ type=ethernet ++ interface-name=eth0 ++ ++ [user] ++ org.freedesktop.NetworkManager.origin=cloud-init ++ ++ [ethernet] ++ ++ [ipv4] ++ method=auto ++ may-fail=true ++ dns=8.8.8.8; ++ dns-search=lab;home; ++ ++ [ipv6] ++ method=auto ++ may-fail=true ++ dns=FEDC::1; ++ dns-search=lab;home; ++ ++ """ ++ ) ++ }, ++ "yaml": textwrap.dedent( ++ """\ ++ version: 2 ++ ethernets: ++ eth0: ++ dhcp4: true ++ dhcp6: true ++ nameservers: ++ search: [lab, home] ++ addresses: [8.8.8.8, "FEDC::1"] ++ """ ++ ), ++ }, ++ "v2-dns-no-dhcp": { ++ "expected_network_manager": { ++ "cloud-init-eth0.nmconnection": textwrap.dedent( ++ """\ ++ # Generated by cloud-init. Changes will be lost. ++ ++ [connection] ++ id=cloud-init eth0 ++ uuid=1dd9a779-d327-56e1-8454-c65e2556c12c ++ autoconnect-priority=120 ++ type=ethernet ++ interface-name=eth0 ++ ++ [user] ++ org.freedesktop.NetworkManager.origin=cloud-init ++ ++ [ethernet] ++ ++ """ ++ ) ++ }, ++ "yaml": textwrap.dedent( ++ """\ ++ version: 2 ++ ethernets: ++ eth0: ++ nameservers: ++ search: [lab, home] ++ addresses: [8.8.8.8, "FEDC::1"] ++ """ ++ ), ++ }, + } + + +@@ -6267,6 +6409,27 @@ class TestNetworkManagerRendering(CiTestCase): + entry[self.expected_name], self.expected_conf_d, found + ) + ++ def test_v2_mixed_routes(self): ++ entry = NETWORK_CONFIGS["v2-mixed-routes"] ++ found = self._render_and_read(network_config=yaml.load(entry["yaml"])) ++ self._compare_files_to_expected( ++ entry[self.expected_name], self.expected_conf_d, found ++ ) ++ ++ def test_v2_dns_no_ips(self): ++ entry = NETWORK_CONFIGS["v2-dns-no-if-ips"] ++ found = self._render_and_read(network_config=yaml.load(entry["yaml"])) ++ self._compare_files_to_expected( ++ entry[self.expected_name], self.expected_conf_d, found ++ ) ++ ++ def test_v2_dns_no_dhcp(self): ++ entry = NETWORK_CONFIGS["v2-dns-no-dhcp"] ++ found = self._render_and_read(network_config=yaml.load(entry["yaml"])) ++ self._compare_files_to_expected( ++ entry[self.expected_name], self.expected_conf_d, found ++ ) ++ + + @mock.patch( + "cloudinit.net.is_openvswitch_internal_interface", +-- +2.39.3 + diff --git a/ci-fix-Undeprecate-network-in-schema-route-definition-5.patch b/ci-fix-Undeprecate-network-in-schema-route-definition-5.patch new file mode 100644 index 0000000..2892e06 --- /dev/null +++ b/ci-fix-Undeprecate-network-in-schema-route-definition-5.patch @@ -0,0 +1,42 @@ +From 332bb23bcfde801edf792e6c629ec350be07b952 Mon Sep 17 00:00:00 2001 +From: James Falcon +Date: Tue, 19 Mar 2024 14:24:11 -0500 +Subject: [PATCH 3/3] fix: Undeprecate 'network' in schema route definition + (#5072) + +RH-Author: Ani Sinha +RH-MergeRequest: 73: fix: Undeprecate 'network' in schema route definition (#5072) +RH-Jira: RHEL-29709 +RH-Acked-by: Emanuele Giuseppe Esposito +RH-Acked-by: Cathy Avery +RH-Commit: [1/1] 61c660be43fd25999bca0cfd66d7b2150fee5a14 (anisinha/cloud-init) + +It is passed through to our v1 schema from OpenStack network_data.json + +Fixes GH-5051 + +(cherry picked from commit ff40d1af8a6de3ee27937382ec4ceea931d80a88) +Signed-off-by: Ani Sinha +--- + cloudinit/config/schemas/schema-network-config-v1.json | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/cloudinit/config/schemas/schema-network-config-v1.json b/cloudinit/config/schemas/schema-network-config-v1.json +index 56dc27c9..64c492a4 100644 +--- a/cloudinit/config/schemas/schema-network-config-v1.json ++++ b/cloudinit/config/schemas/schema-network-config-v1.json +@@ -445,10 +445,7 @@ + }, + "network": { + "type": "string", +- "description": "IPv4 network address with CIDR netmask notation or IPv6 with prefix length. Alias for ``destination`` and only read when ``destination`` key is absent.", +- "deprecated": true, +- "deprecated_version": "23.3", +- "deprecated_description": "Use ``destination`` instead." ++ "description": "IPv4 network address with CIDR netmask notation or IPv6 with prefix length. Alias for ``destination`` and only read when ``destination`` key is absent. This exists for OpenStack support. OpenStack route definitions are passed through to v1 config and OpenStack's ``network_data.json`` uses ``network`` instead of ``destination``." + }, + "destination": { + "type": "string", +-- +2.39.3 + diff --git a/cloud-init.spec b/cloud-init.spec index 88400c8..3eebcf0 100644 --- a/cloud-init.spec +++ b/cloud-init.spec @@ -1,6 +1,6 @@ Name: cloud-init Version: 23.4 -Release: 7%{?dist} +Release: 8%{?dist} Summary: Cloud instance init scripts License: ASL 2.0 or GPLv3 URL: http://launchpad.net/cloud-init @@ -23,6 +23,12 @@ Patch10: ci-Pin-pythes-8.0.0.patch Patch11: ci-fix-Add-types-to-network-v1-schema-4841.patch # For RHEL-28549 - [RHEL 9.4] cloud-init 23.4 returns 2 on recoverable errors instead of 0 Patch12: ci-Retain-exit-code-in-cloud-init-status-for-recoverabl.patch +# For RHEL-20964 - [rhel-9]cloud-init fails to configure DNS/search domains for network-config v1 +Patch13: ci-fix-Correct-v2-NetworkManager-route-rendering-4637.patch +# For RHEL-20964 - [rhel-9]cloud-init fails to configure DNS/search domains for network-config v1 +Patch14: ci-feat-apply-global-DNS-to-interfaces-in-network-manag.patch +# For RHEL-29709 - Suggest to backport patch ff40d1a to undeprecate 'network' in schema route definition +Patch15: ci-fix-Undeprecate-network-in-schema-route-definition-5.patch BuildArch: noarch @@ -239,6 +245,15 @@ fi %config(noreplace) %{_sysconfdir}/rsyslog.d/21-cloudinit.conf %changelog +* Mon Apr 08 2024 Miroslav Rezanina - 23.4-8 +- ci-fix-Correct-v2-NetworkManager-route-rendering-4637.patch [RHEL-20964] +- ci-feat-apply-global-DNS-to-interfaces-in-network-manag.patch [RHEL-20964] +- ci-fix-Undeprecate-network-in-schema-route-definition-5.patch [RHEL-29709] +- Resolves: RHEL-20964 + ([rhel-9]cloud-init fails to configure DNS/search domains for network-config v1) +- Resolves: RHEL-29709 + (Suggest to backport patch ff40d1a to undeprecate 'network' in schema route definition) + * Thu Mar 14 2024 Miroslav Rezanina - 23.4-7 - ci-Retain-exit-code-in-cloud-init-status-for-recoverabl.patch [RHEL-28549] - Resolves: RHEL-28549