diff --git a/backport-Fix-GCE-_get_data-crashes-if-DHCP-lease-fails-5998.patch b/backport-Fix-GCE-_get_data-crashes-if-DHCP-lease-fails-5998.patch new file mode 100644 index 0000000000000000000000000000000000000000..e9aab04de6f7078184a2277d9f52e6d605951004 --- /dev/null +++ b/backport-Fix-GCE-_get_data-crashes-if-DHCP-lease-fails-5998.patch @@ -0,0 +1,59 @@ +From eb1965a434360b3198768302f4196488d7c2511f Mon Sep 17 00:00:00 2001 +From: Bryan Fraschetti +Date: Mon, 3 Feb 2025 16:13:19 -0500 +Subject: [PATCH] Fix: GCE _get_data crashes if DHCP lease fails (#5998) + +This commit addresses issue #5997 which reported crashes in init-local +when cloud-init was examining GCELocal as a potential datasource. When +all NICs failed at DHCP discovery cloud-init attempts to log the events +by dereferencing a value that was never assigned. + +This commit modifies the _get_data function of DataSourceGCE.py by +adding an empty dictionary definition for the ret variable at the +top level of the function and some debugging logs when a candidate NIC +fails to obtain a DHCP lease. At the same time, the commit replaces the +direct key access operator on ret with the safe lookup method get(). This +commit also adds a unit test that mocks the observed situation. + +Reference:https://github.com/canonical/cloud-init/commit/eb1965a434360b3198768302f4196488d7c2511f +Conflict:not change test_gce.py (M_PATH and net.find_candidate_nics doesn't exist) + +Fixes GH-5997 +--- + cloudinit/sources/DataSourceGCE.py | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +diff --git a/cloudinit/sources/DataSourceGCE.py b/cloudinit/sources/DataSourceGCE.py +index 9f838bd..53b686f 100644 +--- a/cloudinit/sources/DataSourceGCE.py ++++ b/cloudinit/sources/DataSourceGCE.py +@@ -73,19 +73,20 @@ class DataSourceGCE(sources.DataSource): + + def _get_data(self): + url_params = self.get_url_params() ++ ret = {} + ret = util.log_time( + LOG.debug, 'Crawl of GCE metadata service', + read_md, kwargs={'address': self.metadata_address, + 'url_params': url_params}) + +- if not ret['success']: +- if ret['platform_reports_gce']: +- LOG.warning(ret['reason']) ++ if not ret.get("success"): ++ if ret.get("platform_reports_gce"): ++ LOG.warning(ret.get("reason")) + else: +- LOG.debug(ret['reason']) ++ LOG.debug(ret.get("reason")) + return False +- self.metadata = ret['meta-data'] +- self.userdata_raw = ret['user-data'] ++ self.metadata = ret.get("meta-data") ++ self.userdata_raw = ret.get("user-data") + return True + + @property +-- +2.33.0 + diff --git a/backport-fix-Ensure-fqdn-is-treated-as-string-in-get_hostname.patch b/backport-fix-Ensure-fqdn-is-treated-as-string-in-get_hostname.patch new file mode 100644 index 0000000000000000000000000000000000000000..f025f3feed0045fe1a8955463b311acd648d1e46 --- /dev/null +++ b/backport-fix-Ensure-fqdn-is-treated-as-string-in-get_hostname.patch @@ -0,0 +1,64 @@ +From b45d66a03659f8e4780b6b55e51edcbd2f6f012d Mon Sep 17 00:00:00 2001 +From: MKhatibzadeh <32599707+masihkhatibzadeh99@users.noreply.github.com> +Date: Fri, 7 Feb 2025 18:13:43 +0330 +Subject: [PATCH] fix: Ensure fqdn is treated as string in get_hostname_fqdn + (#5993) + +Explicitly cast fqdn to a string before processing. + +Reference:https://github.com/canonical/cloud-init/commit/b45d66a03659f8e4780b6b55e51edcbd2f6f012d +Conflict:(1)delete ", _" for util.get_hostname_fqdn() result in new test, refer to commit 74e4349 +(2)not change .github-cla-signers +(3)change cloudinit/tests/test_util.py not tests/unittests/test_util.py + +Fixes GH-5989 + +Co-authored-by: masih.khatibzdeh +--- + cloudinit/util.py | 2 +- + cloudinit/tests/test_util.py | 16 ++++++++++++++++ + 2 files changed, 17 insertions(+), 1 deletion(-) + +diff --git a/cloudinit/util.py b/cloudinit/util.py +index e380848..70e0b76 100644 +--- a/cloudinit/util.py ++++ b/cloudinit/util.py +@@ -1027,7 +1027,7 @@ def get_hostname_fqdn(cfg, cloud, metadata_only=False): + """ + if "fqdn" in cfg: + # user specified a fqdn. Default hostname then is based off that +- fqdn = cfg['fqdn'] ++ fqdn = str(cfg["fqdn"]) + hostname = get_cfg_option_str(cfg, "hostname", fqdn.split('.')[0]) + else: + if "hostname" in cfg and cfg['hostname'].find('.') > 0: +diff --git a/cloudinit/tests/test_util.py b/cloudinit/tests/test_util.py +index 5fb2508..a51de4d 100644 +--- a/cloudinit/tests/test_util.py ++++ b/cloudinit/tests/test_util.py +@@ -448,6 +448,22 @@ class TestGetHostnameFqdn(CiTestCase): + [{'fqdn': True, 'metadata_only': False}, + {'metadata_only': False}], mycloud.calls) + ++ def test_get_hostname_fqdn_from_numeric_fqdn(self): ++ """When cfg fqdn is numeric, ensure it is treated as a string.""" ++ hostname, fqdn = util.get_hostname_fqdn( ++ cfg={"fqdn": 12345}, cloud=None ++ ) ++ self.assertEqual("12345", hostname) ++ self.assertEqual("12345", fqdn) ++ ++ def test_get_hostname_fqdn_from_numeric_fqdn_with_domain(self): ++ """When cfg fqdn is numeric with a domain, ensure correct parsing.""" ++ hostname, fqdn = util.get_hostname_fqdn( ++ cfg={"fqdn": "12345.example.com"}, cloud=None ++ ) ++ self.assertEqual("12345", hostname) ++ self.assertEqual("12345.example.com", fqdn) ++ + def test_get_hostname_fqdn_from_passes_metadata_only_to_cloud(self): + """Calls to cloud.get_hostname pass the metadata_only parameter.""" + mycloud = FakeCloud('cloudhost', 'cloudhost.mycloud.com') +-- +2.33.0 + diff --git a/backport-fix-Wait-for-udev-on-openstack-5947.patch b/backport-fix-Wait-for-udev-on-openstack-5947.patch new file mode 100644 index 0000000000000000000000000000000000000000..5428aa14c02a443344b529140b809644e6864b7b --- /dev/null +++ b/backport-fix-Wait-for-udev-on-openstack-5947.patch @@ -0,0 +1,57 @@ +From 7f09102ad601cb5225fa0ffe280d77a75f435e93 Mon Sep 17 00:00:00 2001 +From: Robert Schweikert +Date: Tue, 7 Jan 2025 15:59:26 -0500 +Subject: [PATCH] fix: Wait for udev on openstack (#5947) + +It is possible that we outrun udev and when we try to enumerate the macs +any given mac may not yet be present. If we detect the condition give +udev a chance to catch up and check the system macs again before +triggering an error. + +Reference:https://github.com/canonical/cloud-init/commit/7f09102ad601cb5225fa0ffe280d77a75f435e93 +Conflict:test format diff. + +Fixes GH-4125 +--- + cloudinit/sources/helpers/openstack.py | 6 +++++- + tests/unittests/test_datasource/test_configdrive.py | 7 +++++-- + 2 files changed, 10 insertions(+), 3 deletions(-) + +diff --git a/cloudinit/sources/helpers/openstack.py b/cloudinit/sources/helpers/openstack.py +index 51e491f..2adbf5f 100644 +--- a/cloudinit/sources/helpers/openstack.py ++++ b/cloudinit/sources/helpers/openstack.py +@@ -702,7 +702,11 @@ def convert_net_json(network_json=None, known_macs=None): + if not mac: + raise ValueError("No mac_address or name entry for %s" % d) + if mac not in known_macs: +- raise ValueError("Unable to find a system nic for %s" % d) ++ # Let's give udev a chance to catch up ++ util.udevadm_settle() ++ known_macs = net.get_interfaces_by_mac() ++ if mac not in known_macs: ++ raise ValueError("Unable to find a system nic for %s" % d) + d['name'] = known_macs[mac] + + for cfg, key, fmt, targets in link_updates: +diff --git a/tests/unittests/test_datasource/test_configdrive.py b/tests/unittests/test_datasource/test_configdrive.py +index 5109723..f6ef537 100644 +--- a/tests/unittests/test_datasource/test_configdrive.py ++++ b/tests/unittests/test_datasource/test_configdrive.py +@@ -694,8 +694,11 @@ class TestConvertNetworkData(CiTestCase): + + def test_convert_raises_value_error_on_missing_name(self): + macs = {'aa:aa:aa:aa:aa:00': 'ens1'} +- self.assertRaises(ValueError, openstack.convert_net_json, +- NETWORK_DATA, known_macs=macs) ++ with mock.patch( ++ "cloudinit.sources.helpers.openstack.util.udevadm_settle" ++ ): ++ self.assertRaises(ValueError, openstack.convert_net_json, ++ NETWORK_DATA, known_macs=macs) + + def test_conversion_with_route(self): + ncfg = openstack.convert_net_json(NETWORK_DATA_2, +-- +2.33.0 + diff --git a/backport-fix-correct-the-path-for-Chef-s-cache-5994.patch b/backport-fix-correct-the-path-for-Chef-s-cache-5994.patch new file mode 100644 index 0000000000000000000000000000000000000000..71720359c032e76444cf252db62bcf79097a02ad --- /dev/null +++ b/backport-fix-correct-the-path-for-Chef-s-cache-5994.patch @@ -0,0 +1,57 @@ +From a0ebb8d35e41bae075a0762b7002bc4e6a2b6269 Mon Sep 17 00:00:00 2001 +From: MostafaTarek124eru + <48182100+MostafaTarek124eru@users.noreply.github.com> +Date: Mon, 3 Feb 2025 22:03:51 +0200 +Subject: [PATCH] fix: correct the path for Chef's cache (#5994) + +Corrected the path for chef cache in cc_chef, schema-cloud-config-v1, +and test_cc_chef. + +Reference:https://github.com/canonical/cloud-init/commit/a0ebb8d35e41bae075a0762b7002bc4e6a2b6269 +Conflict:(1)not change schema-cloud-config-v1.json and .github-cla-signers +(2)change test_handler_chef.py not test_cc_chef.py for test + +Fixes GH-5090 +--- + cloudinit/config/cc_chef.py | 4 ++-- + tests/unittests/test_handler/test_handler_chef.py | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/cloudinit/config/cc_chef.py b/cloudinit/config/cc_chef.py +index cb9fe12..21c87e9 100644 +--- a/cloudinit/config/cc_chef.py ++++ b/cloudinit/config/cc_chef.py +@@ -29,7 +29,7 @@ CHEF_DIRS = tuple([ + '/etc/chef', + '/var/log/chef', + '/var/lib/chef', +- '/var/cache/chef', ++ '/var/chef/cache', + '/var/backups/chef', + '/var/run/chef', + ]) +@@ -55,7 +55,7 @@ CHEF_RB_TPL_DEFAULTS = { + 'validation_cert': None, + 'client_key': '/etc/chef/client.pem', + 'json_attribs': CHEF_FB_PATH, +- 'file_cache_path': '/var/cache/chef', ++ 'file_cache_path': '/var/chef/cache', + 'file_backup_path': '/var/backups/chef', + 'pid_file': '/var/run/chef/client.pid', + 'show_time': True, +diff --git a/tests/unittests/test_handler/test_handler_chef.py b/tests/unittests/test_handler/test_handler_chef.py +index 0672ceb..b1d7ff9 100644 +--- a/tests/unittests/test_handler/test_handler_chef.py ++++ b/tests/unittests/test_handler/test_handler_chef.py +@@ -132,7 +132,7 @@ class TestChef(FilesystemMockingTestCase): + environment "_default" + node_name "iid-datasource-none" + json_attribs "/etc/chef/firstboot.json" +- file_cache_path "/var/cache/chef" ++ file_cache_path "/var/chef/cache" + file_backup_path "/var/backups/chef" + pid_file "/var/run/chef/client.pid" + Chef::Log::Formatter.show_time = true +-- +2.33.0 + diff --git a/cloud-init.spec b/cloud-init.spec index 5bb370b7d67c3eac8490c50029003aebe6da53c4..dc4ef5957f011ffed6dffb8e774afcb5b03b54c6 100644 --- a/cloud-init.spec +++ b/cloud-init.spec @@ -1,6 +1,6 @@ Name: cloud-init Version: 21.4 -Release: 32 +Release: 33 Summary: the defacto multi-distribution package that handles early initialization of a cloud instance. License: ASL 2.0 or GPLv3 URL: http://launchpad.net/cloud-init @@ -87,6 +87,10 @@ Patch6052: backport-fix-properly-handle-blank-lines-in-fstab-5643.patch Patch6053: backport-chore-set-recursive-False-for-ensure_dir-if-parent-p.patch Patch6054: backport-test-openstack-Test-bond-mac-address.patch Patch6055: backport-fix-Ensure-properties-for-bonded-interfaces-are-prop.patch +Patch6056: backport-fix-Wait-for-udev-on-openstack-5947.patch +Patch6057: backport-fix-correct-the-path-for-Chef-s-cache-5994.patch +Patch6058: backport-Fix-GCE-_get_data-crashes-if-DHCP-lease-fails-5998.patch +Patch6059: backport-fix-Ensure-fqdn-is-treated-as-string-in-get_hostname.patch BuildRequires: pkgconfig(systemd) python3-devel python3-setuptools systemd BuildRequires: iproute python3-configobj python3-httpretty >= 0.8.14-2 @@ -132,7 +136,31 @@ rm -f $RPM_BUILD_DIR/%{name}-%{version}/tests/unittests/test_handler/test_handle rm -f $RPM_BUILD_DIR/%{name}-%{version}/tests/unittests/test_datasource/test_opennebula.py rm -f $RPM_BUILD_DIR/%{name}-%{version}/tests/unittests/test_net_freebsd.py -python3 -m pytest tests/unittests/ +SKIP_TESTS="" + +# 检测是否存在多个网卡的MAC地址是ee:ee:ee:ee:ee:ee +# https://docs.tigera.io/calico/latest/reference/faq#why-do-all-cali-interfaces-have-the-mac-address-eeeeeeeeeeee +MAC_ADDR="ee:ee:ee:ee:ee:ee" +interfaces=$(ls /sys/class/net) +duplicate_mac_matched_count=0 +for iface in $interfaces; do + if [ -e "/sys/class/net/$iface/address" ]; then + iface_mac=$(cat /sys/class/net/$iface/address) + if [ "$iface_mac" == "$MAC_ADDR" ]; then + duplicate_mac_matched_count=$((duplicate_mac_matched_count+1)) + fi + fi +done + +if [ "$duplicate_mac_matched_count" -gt 1 ]; then + SKIP_TESTS="not test_dhcp.py and not test_network_state.py and not test_configdrive.py" +fi + +if [ -n "$SKIP_TESTS" ]; then + python3 -m pytest tests/unittests/ -k "$SKIP_TESTS" +else + python3 -m pytest tests/unittests/ +fi %pre @@ -197,6 +225,13 @@ fi %exclude /usr/share/doc/* %changelog +* Tue Mar 04 2025 Linux_zhang - 21.4-33 +- Type:bugfix +- CVE:NA +- SUG:NA +- DESC:backport upstream patches + skip some test if there are multiple NICs with the MAC address 'ee:ee:ee:ee:ee:ee' + * Fri Dec 06 2024 shixuantong - 21.4-32 - Type:bugfix - CVE:NA