diff --git a/0041-enable-ec2_utils-to-stop-retrying-to-get-ec2-metadata.patch b/0041-enable-ec2_utils-to-stop-retrying-to-get-ec2-metadata.patch new file mode 100644 index 0000000..d691b94 --- /dev/null +++ b/0041-enable-ec2_utils-to-stop-retrying-to-get-ec2-metadata.patch @@ -0,0 +1,50 @@ +Enable ec2_utils to stop retrying to get ec2 metadata + +Signed-off-by: David Sloboda +Reviewed-by: Laurence Rochfort + +diff -ruN a/cloudinit/sources/helpers/openstack.py b/cloudinit/sources/helpers/openstack.py +--- a/cloudinit/sources/helpers/openstack.py 2018-04-02 12:51:20.053828637 -0700 ++++ b/cloudinit/sources/helpers/openstack.py 2018-04-02 12:33:20.000000000 -0700 +@@ -464,6 +464,16 @@ + + return results + ++def should_retry_cb(_request_args, cause): ++ try: ++ code = int(cause.code) ++ if code >= 400: ++ return False ++ except (TypeError, ValueError): ++ # Older versions of requests didn't have a code. ++ pass ++ return True ++ + + class MetadataReader(BaseReader): + def __init__(self, base_url, ssl_details=None, timeout=5, retries=5): +@@ -489,16 +499,6 @@ + return self._versions + + def _path_read(self, path, decode=False): +- def should_retry_cb(_request_args, cause): +- try: +- code = int(cause.code) +- if code >= 400: +- return False +- except (TypeError, ValueError): +- # Older versions of requests didn't have a code. +- pass +- return True +- + response = url_helper.readurl( + path, + retries=self.retries, +@@ -519,6 +519,7 @@ + ssl_details=self.ssl_details, + timeout=self.timeout, + retries=self.retries, ++ exception_cb=should_retry_cb, + ) + + diff --git a/0106-tests-unittests-add-a-new-unit-test-for-network-mana.patch b/0106-tests-unittests-add-a-new-unit-test-for-network-mana.patch new file mode 100644 index 0000000..2248cbf --- /dev/null +++ b/0106-tests-unittests-add-a-new-unit-test-for-network-mana.patch @@ -0,0 +1,136 @@ +From 37a6837813e418486af8cbef436ab82a8be3e3fa Mon Sep 17 00:00:00 2001 +From: Darren Archibald +Date: Fri, 23 Feb 2024 06:06:30 -0800 +Subject: [PATCH] tests/unittests: add a new unit test for network manager net + activator (#4672) + +Some changes in behavior in network manager net activator was brought in with +the commit +d1d5166895da ("net/nm: check for presence of ifcfg files when nm connection files are absent") + +This change adds some unit tests that exercizes network manager activator's +bring_up_interface() method that tests failure scenarios as well as cases +where an ifcfg file is used to bring the interface up. + +Signed-off-by: Ani Sinha +(cherry picked from commit bb474df78bfe45ea5f05907eb710e8d5de764fc8) +Signed-off-by: Darren Archibald +--- + tests/unittests/test_net_activators.py | 101 +++++++++++++++++++++++++ + 1 file changed, 101 insertions(+) + +diff --git a/tests/unittests/test_net_activators.py b/tests/unittests/test_net_activators.py +index 2a363ec..f95c8a7 100644 +--- a/tests/unittests/test_net_activators.py ++++ b/tests/unittests/test_net_activators.py +@@ -288,6 +288,107 @@ class TestActivatorsBringUp: + for call in m_subp.call_args_list: + assert call in expected_call_list + ++class TestNetworkManagerActivatorBringUp: ++ @patch("cloudinit.subp.subp", return_value=("", "")) ++ @patch( ++ "cloudinit.net.network_manager.available_nm_ifcfg_rh", ++ return_value=True, ++ ) ++ @patch("os.path.isfile") ++ @patch("os.path.exists", return_value=True) ++ def test_bring_up_interface_no_nm_conn( ++ self, m_exists, m_isfile, m_plugin, m_subp ++ ): ++ """ ++ There is no network manager connection file but ifcfg-rh plugin is ++ present and ifcfg interface config files are also present. In this ++ case, we should use ifcfg files. ++ """ ++ ++ def fake_isfile_no_nmconn(filename): ++ return False if filename.endswith(".nmconnection") else True ++ ++ m_isfile.side_effect = fake_isfile_no_nmconn ++ ++ expected_call_list = [ ++ ( ++ ( ++ [ ++ "nmcli", ++ "connection", ++ "load", ++ "".join( ++ [ ++ "/etc/sysconfig/network-scripts/ifcfg-eth0", ++ ] ++ ), ++ ], ++ ), ++ {}, ++ ), ++ ( ++ ( ++ [ ++ "nmcli", ++ "connection", ++ "up", ++ "filename", ++ "".join( ++ [ ++ "/etc/sysconfig/network-scripts/ifcfg-eth0", ++ ] ++ ), ++ ], ++ ), ++ {}, ++ ), ++ ] ++ ++ index = 0 ++ assert NetworkManagerActivator.bring_up_interface("eth0") ++ for call in m_subp.call_args_list: ++ assert call == expected_call_list[index] ++ index += 1 ++ ++ @patch("cloudinit.subp.subp", return_value=("", "")) ++ @patch( ++ "cloudinit.net.network_manager.available_nm_ifcfg_rh", ++ return_value=False, ++ ) ++ @patch("os.path.isfile") ++ @patch("os.path.exists", return_value=True) ++ def test_bring_up_interface_no_plugin_no_nm_conn( ++ self, m_exists, m_isfile, m_plugin, m_subp ++ ): ++ """ ++ The ifcfg-rh plugin is absent and nmconnection file is also ++ not present. In this case, we can't use ifcfg file and the ++ interface bring up should fail. ++ """ ++ ++ def fake_isfile_no_nmconn(filename): ++ return False if filename.endswith(".nmconnection") else True ++ ++ m_isfile.side_effect = fake_isfile_no_nmconn ++ assert not NetworkManagerActivator.bring_up_interface("eth0") ++ ++ @patch("cloudinit.subp.subp", return_value=("", "")) ++ @patch( ++ "cloudinit.net.network_manager.available_nm_ifcfg_rh", ++ return_value=True, ++ ) ++ @patch("os.path.isfile", return_value=False) ++ @patch("os.path.exists", return_value=True) ++ def test_bring_up_interface_no_conn_file( ++ self, m_exists, m_isfile, m_plugin, m_subp ++ ): ++ """ ++ Neither network manager connection files are present nor ++ ifcfg files are present. Even if ifcfg-rh plugin is present, ++ we can not bring up the interface. So bring_up_interface() ++ should fail. ++ """ ++ assert not NetworkManagerActivator.bring_up_interface("eth0") + + IF_UP_DOWN_BRING_DOWN_CALL_LIST: list = [ + ((["ifdown", "eth0"],), {}), +-- +2.31.1 + diff --git a/ci-downstream-fix-test_cloudstack.py-since-pytest-fixtu.patch b/ci-downstream-fix-test_cloudstack.py-since-pytest-fixtu.patch new file mode 100644 index 0000000..44cb18c --- /dev/null +++ b/ci-downstream-fix-test_cloudstack.py-since-pytest-fixtu.patch @@ -0,0 +1,96 @@ +From c96e5802145fd0c7e0d939b335f1abe953643063 Mon Sep 17 00:00:00 2001 +From: Ani Sinha +Date: Mon, 23 Mar 2026 13:50:11 +0530 +Subject: [PATCH 3/3] downstream: fix test_cloudstack.py since pytest fixtures + cannot be used + +RH-Author: Ani Sinha +RH-MergeRequest: 178: fix(cloudstack): Improve domain-name DHCP lease lookup +RH-Jira: RHEL-159032 +RH-Acked-by: Emanuele Giuseppe Esposito +RH-Acked-by: xiachen +RH-Commit: [3/3] 0c7a39a2ee00228bfbd5de87d95e08d0d9c32101 + +pytest.mark.parametrize decorator cannot be used for functions inside classes +that are derived from unittest.TestCase[1]. Here, the test class is derived +from CiTestCase which in turn is derived from TestCase class which is again +itself derived from unittest.TestCase. This was removed from the upstream +commit 589c9461db1 ("Fix: Add Ephemeral Network for CloudStackLocal DS (#6144)") +which we are not backporting. Hence, we change the test code such that the +main test function is called for each of the previously declared parameterized +values. + +This patch should not be needed after a rebase when 589c9461db1 pulled in +through rebase. + +X-downstream-only: true + +1. https://stackoverflow.com/questions/63720118/pytest-parametrize-i-am-getting-missing-required-positional-arguments +Signed-off-by: Ani Sinha +--- + tests/unittests/sources/test_cloudstack.py | 45 ++++++++++++---------- + 1 file changed, 24 insertions(+), 21 deletions(-) + +diff --git a/tests/unittests/sources/test_cloudstack.py b/tests/unittests/sources/test_cloudstack.py +index 0f987066..f3b08a47 100644 +--- a/tests/unittests/sources/test_cloudstack.py ++++ b/tests/unittests/sources/test_cloudstack.py +@@ -328,31 +328,34 @@ class TestCloudStackHostname(CiTestCase): + result = ds.get_hostname(fqdn=True) + self.assertTupleEqual(expected, result) + +- @pytest.mark.parametrize( +- "lease_key,expected_domain", +- [ +- ("DOMAINNAME", "example.com"), +- ("Domain", "example.com"), +- ("domain-name", "example.com"), +- ], +- ) + def test__get_domainname_supports_all_casing_variants( +- self, lease_key, expected_domain ++ self, + ): + """Ensure _get_domainname works with DOMAINNAME, Domain and + domain-name.""" +- # Mock the helper to return the domain only when the exact key is asked +- with patch( +- "cloudinit.net.dhcp.networkd_get_option_from_leases" +- ) as m_get: +- m_get.side_effect = lambda key, extra_keys=None: ( +- "example.com " if key == lease_key else None +- ) +- +- ds = DataSourceCloudStack( +- {}, distro=MockDistro(), paths=helpers.Paths({}) +- ) +- assert ds._get_domainname() == expected_domain ++ cases = [ ++ ("DOMAINNAME", "example.com"), ++ ("Domain", "example.com"), ++ ("domain-name", "example.com"), ++ ] ++ ++ def testit(lease_key, expected_domain): ++ # Mock the helper to return the domain only when ++ # the exact key is asked ++ with patch( ++ "cloudinit.net.dhcp.networkd_get_option_from_leases" ++ ) as m_get: ++ m_get.side_effect = lambda key, extra_keys=None: ( ++ "example.com " if key == lease_key else None ++ ) ++ ++ ds = DataSourceCloudStack( ++ {}, distro=MockDistro(), paths=helpers.Paths({}) ++ ) ++ assert ds._get_domainname() == expected_domain ++ ++ for lease_key, expected_domain in cases: ++ testit(lease_key, expected_domain) + + + @pytest.mark.usefixtures("dhclient_exists") +-- +2.47.3 + diff --git a/ci-fix-Pass-interface-string-to-get_newest_lease-6648.patch b/ci-fix-Pass-interface-string-to-get_newest_lease-6648.patch new file mode 100644 index 0000000..756f8cf --- /dev/null +++ b/ci-fix-Pass-interface-string-to-get_newest_lease-6648.patch @@ -0,0 +1,40 @@ +From c016e0c7521f45e343874e8df6da857be64c5ea7 Mon Sep 17 00:00:00 2001 +From: Leah <76408777+goldberl@users.noreply.github.com> +Date: Tue, 6 Jan 2026 15:01:59 -0500 +Subject: [PATCH 1/3] fix: Pass interface string to get_newest_lease() (#6648) + +RH-Author: Ani Sinha +RH-MergeRequest: 178: fix(cloudstack): Improve domain-name DHCP lease lookup +RH-Jira: RHEL-159032 +RH-Acked-by: Emanuele Giuseppe Esposito +RH-Acked-by: xiachen +RH-Commit: [1/3] a5eb297936e0253fc93e9ba4808af8d5636eb285 + +In DataSourceCloudStack.py, get_newest_lease() is currently being +passed a Distro object, causing a Python type error. This PR +changes the Distro object to the interface string to fix this error. + +(cherry picked from commit e02b739fc094eb8b56391705c2989f4aecbe139b) +Signed-off-by: Ani Sinha +--- + cloudinit/sources/DataSourceCloudStack.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/cloudinit/sources/DataSourceCloudStack.py b/cloudinit/sources/DataSourceCloudStack.py +index 61bf94f5..6d19077c 100644 +--- a/cloudinit/sources/DataSourceCloudStack.py ++++ b/cloudinit/sources/DataSourceCloudStack.py +@@ -314,7 +314,9 @@ def get_vr_address(distro): + return latest_address + + with suppress(FileNotFoundError): +- latest_lease = distro.dhcp_client.get_newest_lease(distro) ++ latest_lease = distro.dhcp_client.get_newest_lease( ++ distro.fallback_interface ++ ) + if latest_lease: + LOG.debug( + "Found SERVER_ADDRESS '%s' via ephemeral %s lease ", +-- +2.47.3 + diff --git a/ci-fix-cloudstack-Improve-domain-name-DHCP-lease-lookup.patch b/ci-fix-cloudstack-Improve-domain-name-DHCP-lease-lookup.patch new file mode 100644 index 0000000..d770c1e --- /dev/null +++ b/ci-fix-cloudstack-Improve-domain-name-DHCP-lease-lookup.patch @@ -0,0 +1,156 @@ +From d45780e65158d7f9b0a00933f8998934f5ceb4cf Mon Sep 17 00:00:00 2001 +From: CodeBleu <400979+CodeBleu@users.noreply.github.com> +Date: Tue, 20 Jan 2026 13:52:54 -0500 +Subject: [PATCH 2/3] fix(cloudstack): Improve domain-name DHCP lease lookup + (Cloudstack) (#6554) + +RH-Author: Ani Sinha +RH-MergeRequest: 178: fix(cloudstack): Improve domain-name DHCP lease lookup +RH-Jira: RHEL-159032 +RH-Acked-by: Emanuele Giuseppe Esposito +RH-Acked-by: xiachen +RH-Commit: [2/3] 5f3c7dac734ddcc068f086866963d05c42e0c24f + +* Adding case-insensitive options for systemd-networkd leases ("DOMAINNAME", "Domain", "domain-name"). +* Falling back gracefully from systemd leases to ISC dhclient leases. +* Including dhcpcd ephemeral leases as an additional fallback. +* Returning an empty string when no domain name found instead of None for non-fatal missing cases. + +(cherry picked from commit d2bf883931723cfdc9f529eba5395d83059d09c6) +Signed-off-by: Ani Sinha +--- + cloudinit/sources/DataSourceCloudStack.py | 50 +++++++++++----------- + tests/unittests/sources/test_cloudstack.py | 27 ++++++++++++ + 2 files changed, 53 insertions(+), 24 deletions(-) + +diff --git a/cloudinit/sources/DataSourceCloudStack.py b/cloudinit/sources/DataSourceCloudStack.py +index 6d19077c..98189c23 100644 +--- a/cloudinit/sources/DataSourceCloudStack.py ++++ b/cloudinit/sources/DataSourceCloudStack.py +@@ -23,6 +23,7 @@ from cloudinit import sources, subp + from cloudinit import url_helper as uhelp + from cloudinit import util + from cloudinit.net import dhcp ++from cloudinit.net.dhcp import NoDHCPLeaseError + from cloudinit.sources.helpers import ec2 + + LOG = logging.getLogger(__name__) +@@ -97,46 +98,47 @@ class DataSourceCloudStack(sources.DataSource): + self.cfg = {} + + def _get_domainname(self): ++ """Try obtaining a "domain-name" DHCP lease parameter: ++ - From systemd-networkd lease (case-insensitive) ++ - From ISC dhclient ++ - From dhcpcd (ephemeral) ++ - Return empty string if not found (non-fatal) + """ +- Try obtaining a "domain-name" DHCP lease parameter: +- - From systemd-networkd lease +- - From dhclient lease +- """ ++ + LOG.debug("Try obtaining domain name from networkd leases") +- domainname = dhcp.networkd_get_option_from_leases("DOMAINNAME") +- if domainname: +- return domainname ++ for key in ["DOMAINNAME", "Domain", "domain-name"]: ++ domainname = dhcp.networkd_get_option_from_leases(key) ++ if domainname: ++ return domainname.strip() ++ + LOG.debug( +- "Could not obtain FQDN from networkd leases. " +- "Falling back to ISC dhclient" ++ "Could not obtain FQDN from networkd leases. Falling back to " ++ "ISC dhclient" + ) +- +- # some distros might use isc-dhclient for network setup via their +- # network manager. If this happens, the lease is more recent than the +- # ephemeral lease, so use it first. + with suppress(dhcp.NoDHCPLeaseMissingDhclientError): + domain_name = dhcp.IscDhclient().get_key_from_latest_lease( + self.distro, "domain-name" + ) + if domain_name: +- return domain_name ++ return domain_name.strip() + + LOG.debug( +- "Could not obtain FQDN from ISC dhclient leases. " +- "Falling back to %s", ++ "Could not obtain FQDN from ISC dhclient leases. Falling back to " ++ "%s", + self.distro.dhcp_client.client_name, + ) +- +- # If no distro leases were found, check the ephemeral lease that +- # cloud-init set up. +- with suppress(FileNotFoundError): ++ try: + latest_lease = self.distro.dhcp_client.get_newest_lease( + self.distro.fallback_interface + ) +- domain_name = latest_lease.get("domain-name") or None +- return domain_name +- LOG.debug("No dhcp leases found") +- return None ++ domain_name = latest_lease.get("domain-name") ++ if domain_name: ++ return domain_name.strip() ++ except (NoDHCPLeaseError, FileNotFoundError, AttributeError): ++ pass ++ ++ LOG.debug("No domain name found in any DHCP lease; returning empty") ++ return "" + + def get_hostname( + self, +diff --git a/tests/unittests/sources/test_cloudstack.py b/tests/unittests/sources/test_cloudstack.py +index a64d80f3..0f987066 100644 +--- a/tests/unittests/sources/test_cloudstack.py ++++ b/tests/unittests/sources/test_cloudstack.py +@@ -1,5 +1,6 @@ + # This file is part of cloud-init. See LICENSE file for license information. + from textwrap import dedent ++from unittest.mock import patch + + import pytest + +@@ -327,6 +328,32 @@ class TestCloudStackHostname(CiTestCase): + result = ds.get_hostname(fqdn=True) + self.assertTupleEqual(expected, result) + ++ @pytest.mark.parametrize( ++ "lease_key,expected_domain", ++ [ ++ ("DOMAINNAME", "example.com"), ++ ("Domain", "example.com"), ++ ("domain-name", "example.com"), ++ ], ++ ) ++ def test__get_domainname_supports_all_casing_variants( ++ self, lease_key, expected_domain ++ ): ++ """Ensure _get_domainname works with DOMAINNAME, Domain and ++ domain-name.""" ++ # Mock the helper to return the domain only when the exact key is asked ++ with patch( ++ "cloudinit.net.dhcp.networkd_get_option_from_leases" ++ ) as m_get: ++ m_get.side_effect = lambda key, extra_keys=None: ( ++ "example.com " if key == lease_key else None ++ ) ++ ++ ds = DataSourceCloudStack( ++ {}, distro=MockDistro(), paths=helpers.Paths({}) ++ ) ++ assert ds._get_domainname() == expected_domain ++ + + @pytest.mark.usefixtures("dhclient_exists") + class TestCloudStackPasswordFetching(CiTestCase): +-- +2.47.3 + diff --git a/cloud-init.spec b/cloud-init.spec index dcbb53c..20222e6 100644 --- a/cloud-init.spec +++ b/cloud-init.spec @@ -6,7 +6,7 @@ Name: cloud-init Version: 24.4 -Release: 6%{?dist}.1 +Release: 6.0.1%{?dist}.2 Summary: Cloud instance init scripts License: Apache-2.0 OR GPL-3.0-only URL: https://github.com/canonical/cloud-init @@ -32,6 +32,27 @@ Patch11: ci-feat-aliyun-datasource-support-crawl-metadata-at-onc.patch Patch12: ci-fix-Don-t-attempt-to-identify-non-x86-OpenStack-inst.patch # For RHEL-100617 - CVE-2024-6174 cloud-init: From CVEorg collector [rhel-10.1] Patch13: ci-fix-strict-disable-in-ds-identify-on-no-datasources-.patch +# For RHEL-159032 - [GSS][Secure Support] [RHEL-10] cloud-init requests lease before DHCP can provide one [rhel-10.1.z] +Patch14: ci-fix-Pass-interface-string-to-get_newest_lease-6648.patch +# For RHEL-159032 - [GSS][Secure Support] [RHEL-10] cloud-init requests lease before DHCP can provide one [rhel-10.1.z] +Patch15: ci-fix-cloudstack-Improve-domain-name-DHCP-lease-lookup.patch +# For RHEL-159032 - [GSS][Secure Support] [RHEL-10] cloud-init requests lease before DHCP can provide one [rhel-10.1.z] +Patch16: ci-downstream-fix-test_cloudstack.py-since-pytest-fixtu.patch + +# Oracle patches +Patch100: 0041-enable-ec2_utils-to-stop-retrying-to-get-ec2-metadata.patch +Patch101: ignore-enslaved-interface.patch +Patch102: ol-sysconfig-add-Oracle-Linux-variant-to-known-distros.patch +Patch103: 0106-tests-unittests-add-a-new-unit-test-for-network-mana.patch + +# Oracle specific patches (preferred prefix: "ol" or "orabugNNNNNNNN") +Patch1001: orabug30435672-003-cloud-init-collect-logs.patch +Patch1002: orabug30435672-004-ol-cloud-config.patch +Patch1003: orabug30435672-006-cc_spacewalk.py.patch +Patch1005: orabug32183938-009-missing-sshd-services.patch +Patch1006: orabug32183938-010-missing-sshd-services-in-rhel-systemd.patch +Patch1007: orabug34845400-Add-Oracle-to-distro-detection-logic-in-cloud.cfg.tm.patch +Patch1008: orabug37065979-DataSourceOracle-network-getdata-retries.patch BuildArch: noarch @@ -179,6 +200,18 @@ elif [ $1 -eq 2 ]; then # there will be stale systemd config /bin/systemctl is-enabled cloud-config.service >/dev/null 2>&1 && /bin/systemctl reenable cloud-config.service >/dev/null 2>&1 || : + + /bin/systemctl is-enabled cloud-final.service >/dev/null 2>&1 && + /bin/systemctl reenable cloud-final.service >/dev/null 2>&1 || : + + /bin/systemctl is-enabled cloud-init.service >/dev/null 2>&1 && + /bin/systemctl reenable cloud-init.service >/dev/null 2>&1 || : + + /bin/systemctl is-enabled cloud-init-local.service >/dev/null 2>&1 && + /bin/systemctl reenable cloud-init-local.service >/dev/null 2>&1 || : + + /bin/systemctl is-enabled cloud-init.target >/dev/null 2>&1 && + /bin/systemctl reenable cloud-init.target >/dev/null 2>&1 || : fi %preun %systemd_preun cloud-config.service cloud-config.target cloud-final.service cloud-init.service cloud-init.target cloud-init-local.service @@ -237,6 +270,30 @@ fi %changelog +* Tue Apr 07 2026 EL Errata - 24.4-6.0.1.el10_1.2 +- NetworkManagerActivator brings up interface failed when using sysconfig renderer [RHEL-18981] +- Include module cc_write_files_deferred in config template [Orabug: 36959464] +- Fix Oracle Datasource network, getdata methods and increase retries [Orabug: 37065979] +- Fix log file permission [Orabug: 35302969] +- Update detection logic for OL distros in config template [Orabug: 34845400] +- Added missing services in rhel/systemd/cloud-init.service [Orabug: 32183938] +- Added missing services in cloud-init.service.tmpl for sshd [Orabug: 32183938] +- Forward port applicable cloud-init 18.4-2.0.3 changes to cloud-init-18-5 [Orabug: 30435672] +- limit permissions [Orabug: 31352433] +- Changes to ignore all enslaved interfaces [Orabug: 30092148] +- add modified version of enable-ec2_utils-to-stop-retrying-to-get-ec2-metadata.patch: + 1. Enable ec2_utils.py having a way to stop retrying to get ec2 metadata + 2. Apply stop retrying to get ec2 metadata to helper/openstack.py MetadataReader + Resolves: Oracle-Bug:41660 (Bugzilla) +- added OL to list of known distros + +* Thu Mar 26 2026 Miroslav Rezanina - 24.4-6.el10_1.2 +- ci-fix-Pass-interface-string-to-get_newest_lease-6648.patch [RHEL-159032] +- ci-fix-cloudstack-Improve-domain-name-DHCP-lease-lookup.patch [RHEL-159032] +- ci-downstream-fix-test_cloudstack.py-since-pytest-fixtu.patch [RHEL-159032] +- Resolves: RHEL-159032 + ([GSS][Secure Support] [RHEL-10] cloud-init requests lease before DHCP can provide one [rhel-10.1.z]) + * Wed Dec 10 2025 Miroslav Rezanina - 24.4-6.el10_1.1 - ci-downstream-Do-not-override-changes-in-disable-sshd-k.patch [RHEL-128905] - Resolves: RHEL-128905 @@ -500,3 +557,4 @@ fi * Wed Feb 16 2022 Charalampos Stratakis - 21.3-6 - Remove redundant dependencies on nose and mock + diff --git a/ignore-enslaved-interface.patch b/ignore-enslaved-interface.patch new file mode 100644 index 0000000..cfefbe4 --- /dev/null +++ b/ignore-enslaved-interface.patch @@ -0,0 +1,44 @@ +From e7aba0f0ccd6f023667f41385f25044a94428ed3 Mon Sep 17 00:00:00 2001 +From: Darren Archibald +Date: Fri, 23 Feb 2024 05:56:06 -0800 +Subject: [PATCH] ignore enslaved interface + + Changes to ignore all enslaved interfaces. + https://jira.oci.oraclecorp.com/browse/LINUX-1947 + + Orabug: 30092148 + + Signed-off-by: Si-Wei Liu + Signed-off-by: Darren Archibald +--- + cloudinit/net/__init__.py | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py +index c0888f5..b093796 100644 +--- a/cloudinit/net/__init__.py ++++ b/cloudinit/net/__init__.py +@@ -335,6 +335,10 @@ def is_netfail_standby(devname, driver=None): + return True + + ++def is_slave(devname): ++ return os.path.exists(sys_dev_path(devname, "master")) ++ ++ + def is_renamed(devname): + """ + /* interface name assignment types (sysfs name_assign_type attribute) */ +@@ -1054,6 +1058,9 @@ def get_interfaces( + if is_bridge(name): + filtered_logger("Ignoring bridge interface: %s", name) + continue ++ if is_slave(name): ++ filtered_logger("Ignoring bridge interface: %s", name) ++ continue + if filter_vlan and is_vlan(name): + continue + if is_bond(name): +-- +2.31.1 + diff --git a/ol-sysconfig-add-Oracle-Linux-variant-to-known-distros.patch b/ol-sysconfig-add-Oracle-Linux-variant-to-known-distros.patch new file mode 100644 index 0000000..c8b89d8 --- /dev/null +++ b/ol-sysconfig-add-Oracle-Linux-variant-to-known-distros.patch @@ -0,0 +1,26 @@ +From 8735577c8a683407e94abed0cfccc3aacbb9aa47 Mon Sep 17 00:00:00 2001 +From: Si-Wei Liu +Date: Wed, 10 Jun 2020 20:59:29 -0400 +Subject: [PATCH] sysconfig: add Oracle Linux variant to known distros + +otherwise anything sysconfig breaks on Oracle Linux. + +JIRA: https://jira.oci.oraclecorp.com/browse/LINUX-6128 + +Signed-off-by: Si-Wei Liu +--- + cloudinit/net/sysconfig.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/cloudinit/net/sysconfig.py b/cloudinit/net/sysconfig.py +index e94590f..55b7db5 100644 +--- a/cloudinit/net/sysconfig.py ++++ b/cloudinit/net/sysconfig.py +@@ -35,6 +35,7 @@ + "suse", + "TencentOS", + "virtuozzo", ++ "ol", + ] + + diff --git a/orabug30435672-003-cloud-init-collect-logs.patch b/orabug30435672-003-cloud-init-collect-logs.patch new file mode 100644 index 0000000..4a82f7e --- /dev/null +++ b/orabug30435672-003-cloud-init-collect-logs.patch @@ -0,0 +1,72 @@ +From c6d9e755b6233e98764678bb86a1bc45df168df2 Mon Sep 17 00:00:00 2001 +From: Darren Archibald +Date: Thu, 29 Aug 2024 04:00:14 -0700 +Subject: [PATCH] Update cloud-init collect-logs for Oracle Linux + +Updating the code to collect triage logs with OL distro specic methods. + +Orabug: 30435672 + +Signed-off-by: Vijay Balakrishna +Reviewed-by: Si-Wei Liu +Acked-by: Joe Kennedy +Reviewed-by: Laurence Rochfort +Signed-off-by: Rajesh Harekal + +diff -urN a/cloudinit/cmd/devel/logs.py b/cloudinit/cmd/devel/logs.py +--- a/cloudinit/cmd/devel/logs.py 2025-01-27 15:12:24.357097951 -0800 ++++ b/cloudinit/cmd/devel/logs.py 2025-01-27 15:50:44.097173379 -0800 +@@ -21,7 +21,7 @@ + from cloudinit.stages import Init + from cloudinit.subp import ProcessExecutionError, subp + from cloudinit.temp_utils import tempdir +-from cloudinit.util import copy, get_config_logfiles, write_file ++from cloudinit.util import copy, get_config_logfiles, write_file, system_info + + LOG = cast(loggers.CustomLoggerType, logging.getLogger(__name__)) + +@@ -214,13 +214,23 @@ + file_path=log_dir / "version", + msg="cloud-init --version", + ) +- dpkg_ver = _write_command_output_to_file( +- cmd=["dpkg-query", "--show", "-f=${Version}\n", "cloud-init"], +- file_path=log_dir / "dpkg-version", +- msg="dpkg version", +- ) +- if not version: +- version = dpkg_ver or "not-available" ++ if system_info()['variant'] == "ol": ++ rpm_ver = _write_command_output_to_file( ++ cmd=["rpm", "-q", "--queryformat", ++ "[%{VERSION}-%{RELEASE}.%{ARCH}]\n", "cloud-init"], ++ file_path=log_dir / "rpm-version", ++ msg="rpm version", ++ ) ++ if not version: ++ version = rpm_ver if rpm_ver else "not-available" ++ else: ++ dpkg_ver = _write_command_output_to_file( ++ cmd=["dpkg-query", "--show", "-f=${Version}\n", "cloud-init"], ++ file_path=log_dir / "dpkg-version", ++ msg="dpkg version", ++ ) ++ if not version: ++ version = dpkg_ver if dpkg_ver else "not-available" + + + def _collect_system_logs( + +diff -urN a/cloudinit/util.py b/cloudinit/util.py +--- a/cloudinit/util.py 2025-01-27 16:02:32.019230892 -0800 ++++ b/cloudinit/util.py 2025-01-27 16:03:05.491012873 -0800 +@@ -629,6 +629,7 @@ + "suse", + "tencentos", + "virtuozzo", ++ "ol", + ): + variant = linux_dist + elif linux_dist in ("ubuntu", "linuxmint", "mint"): + diff --git a/orabug30435672-004-ol-cloud-config.patch b/orabug30435672-004-ol-cloud-config.patch new file mode 100644 index 0000000..5958b77 --- /dev/null +++ b/orabug30435672-004-ol-cloud-config.patch @@ -0,0 +1,112 @@ +From 250aa45f74e29b95f81b24811c972369605bd24e Mon Sep 17 00:00:00 2001 +From: Vijay Balakrishna +Date: Tue, 5 Nov 2019 16:00:21 -0500 +Subject: [PATCH] Add static cloud.cfg file for OL7. + +Adding OL specific cloud.cfg file to enable updates cloud-init +config file independently, adding newly verified ntp module. + +Orabug: 30435672 + +Signed-off-by: Vijay Balakrishna +Signed-off-by: Si-Wei Liu +Acked-by: Joe Kennedy +Reviewed-by: Laurence Rochfort + +--- + ol/README.ol | 6 ++++++ + ol/cloud.cfg | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 75 insertions(+) + create mode 100644 ol/README.ol + create mode 100644 ol/cloud.cfg + +diff --git a/ol/README.ol b/ol/README.ol +new file mode 100644 +index 0000000..f59d559 +--- /dev/null ++++ b/ol/README.ol +@@ -0,0 +1,6 @@ ++The following cloud-init modules are currently unsupported on this OS: ++ - apt_update_upgrade ('apt_update', 'apt_upgrade', 'apt_mirror', 'apt_preserve_sources_list', 'apt_old_mirror', 'apt_sources', 'debconf_selections', 'packages' options) ++ - byobu ('byobu_by_default' option) ++ - chef ++ - grub_dpkg ++ - rh_subscription +diff --git a/ol/cloud.cfg b/ol/cloud.cfg +new file mode 100644 +index 0000000..2ee1fb3 +--- /dev/null ++++ b/ol/cloud.cfg +@@ -0,0 +1,69 @@ ++users: ++ - default ++ ++disable_root: 1 ++ssh_pwauth: 0 ++ ++mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2'] ++resize_rootfs_tmp: /dev ++ssh_deletekeys: 0 ++ssh_genkeytypes: ~ ++syslog_fix_perms: ~ ++disable_vmware_customization: false ++ ++cloud_init_modules: ++ - disk_setup ++ - migrator ++ - bootcmd ++ - write-files ++ - growpart ++ - resizefs ++ - set_hostname ++ - update_hostname ++ - update_etc_hosts ++ - rsyslog ++ - users-groups ++ - ssh ++ ++cloud_config_modules: ++ - mounts ++ - locale ++ - set-passwords ++ - ntp ++ - yum-add-repo ++ - package-update-upgrade-install ++ - timezone ++ - puppet ++ - chef ++ - salt-minion ++ - mcollective ++ - disable-ec2-metadata ++ - runcmd ++ ++cloud_final_modules: ++ - rightscale_userdata ++ - scripts-per-once ++ - scripts-per-boot ++ - scripts-per-instance ++ - scripts-user ++ - ssh-authkey-fingerprints ++ - keys-to-console ++ - phone-home ++ - final-message ++ - power-state-change ++ ++system_info: ++ default_user: ++ name: cloud-user ++ lock_passwd: true ++ gecos: Cloud User ++ groups: [adm, systemd-journal] ++ sudo: ["ALL=(ALL) NOPASSWD:ALL"] ++ shell: /bin/bash ++ distro: rhel ++ paths: ++ cloud_dir: /var/lib/cloud ++ templates_dir: /etc/cloud/templates ++ ssh_svcname: sshd ++ ++# vim:syntax=yaml +-- +1.8.3.1 + diff --git a/orabug30435672-006-cc_spacewalk.py.patch b/orabug30435672-006-cc_spacewalk.py.patch new file mode 100644 index 0000000..0130c01 --- /dev/null +++ b/orabug30435672-006-cc_spacewalk.py.patch @@ -0,0 +1,51 @@ +From 2b92e042bb8a4510abec38fcfc302d8de1e28f37 Mon Sep 17 00:00:00 2001 +From: Darren Archibald +Date: Fri, 23 Feb 2024 06:55:32 -0800 +Subject: [PATCH] spacewalk: fix CA cert file path for Oracle Linux + +Update the CA cert file that is available in Oracle Linux to register with ULN. + +Orabug: 30435672 + +Signed-off-by: Si-Wei Liu +Signed-off-by: Vijay Balakrishna +Acked-by: Joe Kennedy +Reviewed-by: Laurence Rochfort +Signed-off-by: Darren Archibald +Signed-off-by: Rajesh Harekal + +diff -urN a/cloudinit/config/cc_spacewalk.py b/cloudinit/config/cc_spacewalk.py +--- a/cloudinit/config/cc_spacewalk.py 2025-01-28 10:51:15.364254013 -0800 ++++ b/cloudinit/config/cc_spacewalk.py 2025-01-28 10:53:56.899893366 -0800 +@@ -3,7 +3,7 @@ + + import logging + +-from cloudinit import subp ++from cloudinit import subp, util + from cloudinit.cloud import Cloud + from cloudinit.config import Config + from cloudinit.config.schema import MetaSchema +@@ -21,6 +21,7 @@ + distros = ["redhat", "fedora", "openeuler"] + required_packages = ["rhn-setup"] + def_ca_cert_path = "/usr/share/rhn/RHN-ORG-TRUSTED-SSL-CERT" ++ol_ca_cert_path = "/usr/share/rhn/ULN-CA-CERT" + + + def is_registered(): +@@ -74,9 +75,14 @@ + # Need to have this installed before further things will work. + cloud.distro.install_packages(required_packages) + if not is_registered(): ++ if util.system_info()['variant'] == "ol": ++ cert = ol_ca_cert_path ++ else: ++ cert = def_ca_cert_path + do_register( + spacewalk_server, + cloud.datasource.get_hostname(fqdn=True).hostname, ++ ca_cert_path=cert, + proxy=cfg.get("proxy"), + activation_key=cfg.get("activation_key"), + ) diff --git a/orabug32183938-009-missing-sshd-services.patch b/orabug32183938-009-missing-sshd-services.patch new file mode 100644 index 0000000..fc78fa2 --- /dev/null +++ b/orabug32183938-009-missing-sshd-services.patch @@ -0,0 +1,31 @@ +cloud-init service file is missing sshd required services +Orabug: 32183938 + +in the systemd sshd-keygen.target file, the following services are listed: +[Unit] +Wants=sshd-keygen@rsa.service +Wants=sshd-keygen@ecdsa.service +Wants=sshd-keygen@ed25519.service + +Need to add the following to the cloud-init service file: +Before=sshd-keygen@rsa.service +Before=sshd-keygen@ecdsa.service +Before=sshd-keygen@ed25519.service + +Signed-off-by: Isaac Chen +Signed-off-by: Rajesh Harekal + +diff -urN cloud-init-24.4/systemd/cloud-init.service.tmpl.orig cloud-init-24.4/systemd/cloud-init.service.tmpl +--- cloud-init-24.4/systemd/cloud-init.service.tmpl 2025-01-28 11:13:57.339346352 -0800 ++++ cloud-init-24.4/systemd/cloud-init.service.tmpl 2025-01-28 11:14:31.587669418 -0800 +@@ -28,7 +28,9 @@ + After=dbus.service + {% endif %} + Before=network-online.target +-Before=sshd-keygen.service ++Before=sshd-keygen@rsa.service ++Before=sshd-keygen@ecdsa.service ++Before=sshd-keygen@ed25519.service + Before=sshd.service + Before=systemd-user-sessions.service + {% if variant in ["ubuntu", "unknown", "debian"] %} diff --git a/orabug32183938-010-missing-sshd-services-in-rhel-systemd.patch b/orabug32183938-010-missing-sshd-services-in-rhel-systemd.patch new file mode 100644 index 0000000..7cb4fb0 --- /dev/null +++ b/orabug32183938-010-missing-sshd-services-in-rhel-systemd.patch @@ -0,0 +1,22 @@ +cloud-init service file is missing sshd required services +Orabug: 32183938 + +This patch is the supplement of patch orabug32183938-009, where changes +to cloud-init.service also need to be added to files in rhel/systemd. + +Signed-off-by: Isaac Chen + +diff -up cloud-init-19.4/systemd/cloud-init.service.tmpl.orig cloud-init-19.4/systemd/cloud-init.service.tmpl +--- cloud-init-19.4/systemd/cloud-init.service.tmpl.orig 2020-12-11 19:59:37.331277979 -0800 ++++ cloud-init-19.4/systemd/cloud-init.service.tmpl 2020-12-11 20:00:38.867459043 -0800 +@@ -5,7 +5,9 @@ + DefaultDependencies=no + {% endif %} + Wants=cloud-init-local.service +-Wants=sshd-keygen.service ++Wants=sshd-keygen@rsa.service ++Wants=sshd-keygen@ecdsa.service ++Wants=sshd-keygen@ed25519.service + Wants=sshd.service + After=cloud-init-local.service + After=systemd-networkd-wait-online.service diff --git a/orabug34845400-Add-Oracle-to-distro-detection-logic-in-cloud.cfg.tm.patch b/orabug34845400-Add-Oracle-to-distro-detection-logic-in-cloud.cfg.tm.patch new file mode 100644 index 0000000..9909a4b --- /dev/null +++ b/orabug34845400-Add-Oracle-to-distro-detection-logic-in-cloud.cfg.tm.patch @@ -0,0 +1,267 @@ +From 1042542db662f362fc74469e1c24df4eb08bf346 Mon Sep 17 00:00:00 2001 +From: Darren Archibald +Date: Thu, 29 Aug 2024 04:26:17 -0700 +Subject: [PATCH] Add Oracle to distro detection logic in cloud.cfg.tmpl + +Oracle Linux is being detected as "ol" variant by cloud-init. +This patch adds "ol" to the list of supported variants, and applies needed settings to it. +You can notice that variant "ol" is being set as distro "rhel" in a couple of places, +that is expected as this designated that base distro for "ol" is "rhel" ( which is true ) + +The main reason for this change is that cloud-init package dropped hardcoded configs that set OL as rhel +and to make cloud-init behave on OL systems as expected we need to add "ol" designation to supported list. + +Orabug: 34845400 +Signed-off-by: Alex Burmashev +Signed-off-by: Darren Archibald +--- + cloudinit/distros/__init__.py | 1 + + cloudinit/sources/DataSourceRbxCloud.py | 2 +- + config/cloud.cfg.tmpl | 43 +++++++++++++++++-------- + systemd/cloud-final.service | 4 ++- + systemd/cloud-init-local.service.tmpl | 12 ++++--- + systemd/cloud-init.service.tmpl | 8 +++-- + systemd/cloud-init-generator.tmpl | 1 +++-- + tests/unittests/test_util.py | 1 + + 7 files changed, 50 insertions(+), 21 deletions(-) + +diff --git a/cloudinit/distros/__init__.py b/cloudinit/distros/__init__.py +index 9c4d6b2..47629c6 100644 +--- a/cloudinit/distros/__init__.py ++++ b/cloudinit/distros/__init__.py +@@ -79,6 +79,7 @@ OSFAMILIES = { + "rhel", + "rocky", + "virtuozzo", ++ "ol", + ], + "suse": [ + "opensuse", +diff --git a/cloudinit/sources/DataSourceRbxCloud.py b/cloudinit/sources/DataSourceRbxCloud.py +index 6729e84..2265ddb 100644 +--- a/cloudinit/sources/DataSourceRbxCloud.py ++++ b/cloudinit/sources/DataSourceRbxCloud.py +@@ -60,7 +60,7 @@ def _sub_arp(cmd): + + def gratuitous_arp(items, distro): + source_param = "-S" +- if distro.name in ["fedora", "centos", "rhel"]: ++ if distro.name in ["fedora", "centos", "rhel", "ol"]: + source_param = "-s" + for item in items: + try: +diff --git a/config/cloud.cfg.tmpl b/config/cloud.cfg.tmpl +index a470120..f440830 100644 +--- a/config/cloud.cfg.tmpl ++++ b/config/cloud.cfg.tmpl +@@ -59,10 +59,10 @@ + {% endif %} + + {%- if variant in ["alpine", "amazon", "fedora", "OpenCloudOS", "openeuler", +- "openmandriva", "photon", "TencentOS"] or is_rhel %} ++ "openmandriva", "photon", "TencentOS", "ol"] or is_rhel %} + +-{% if is_rhel %} +-mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.after=cloud-init-network.service,_netdev', '0', '2'] ++{% if variant in ["ol"] or is_rhel %} ++mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.after=cloud-init.service,_netdev', '0', '2'] + {% else %} + mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2'] + {% endif %} +@@ -166,18 +166,20 @@ + - ubuntu_pro + {% endif %} + {% elif variant in ["azurelinux", "fedora", "mariner", "openeuler", +- "openmandriva", "photon"] or is_rhel %} ++ "openmandriva", "photon", "ol"] or is_rhel %} + {% if is_rhel %} + - rh_subscription + {% endif %} +-{% if variant not in ["azurelinux", "mariner", "photon"] %} ++{% if variant not in ["azurelinux", "mariner", "photon", "ol"] %} + - spacewalk + {% endif %} + - yum_add_repo + {% elif variant == "suse" %} + - zypper_add_repo + {% endif %} ++{% if variant not in ["ol"] %} + - ntp ++{% endif %} + - timezone + {% if variant not in ["azurelinux"] %} + - disable_ec2_metadata +@@ -207,6 +209,8 @@ + {% if variant not in ["azurelinux"] %} + - mcollective + - salt_minion ++{% endif %} ++{% if variant not in ["azurelinux", "ol"] %} + - reset_rmc + {% endif %} + - scripts_vendor +@@ -230,6 +234,8 @@ + "OpenCloudOS", "openeuler", "openmandriva", "photon", "suse", + "TencentOS", "ubuntu"] or is_rhel %} + distro: {{ variant }} ++{% elif variant == "ol" %} ++ distro: rhel + {% elif variant == "dragonfly" %} + distro: dragonflybsd + {% else %} +@@ -238,7 +244,9 @@ + {% endif %} + # Default user name + that default users groups (if added/used) + default_user: +-{% if variant in usernames %} ++{% if variant == "ol" %} ++ name: cloud-user ++{% elif variant in usernames %} + name: {{ usernames[variant] }} + {% else %} + name: {{ variant }} +@@ -246,11 +254,13 @@ + {% if variant in ["alpine", "amazon", "aosc", "arch", "azurelinux", "debian", "fedora", + "gentoo", "mariner", "OpenCloudOS", "openeuler", + "openmandriva", "photon", "suse", "TencentOS", "ubuntu", +- "unknown"] ++ "unknown", "ol"] + or is_bsd or is_rhel %} + lock_passwd: True + {% endif %} +-{% if variant in gecos %} ++{% if variant == "ol" %} ++ gecos: Cloud User ++{% elif variant in gecos %} + gecos: {{ gecos[variant] }} + {% else %} + gecos: {{ variant }} Cloud User +@@ -328,7 +338,7 @@ + {% if variant in ["alpine", "amazon", "aosc", "arch", "azurelinux", "debian", "fedora", + "gentoo", "mariner", "OpenCloudOS", "openeuler", + "openmandriva", "photon", "suse", "TencentOS", "ubuntu", +- "unknown"] ++ "unknown", "ol"] + or is_rhel %} + # Other config here will be given to the distro class and/or path classes + paths: +@@ -375,7 +385,7 @@ + ssh_svcname: ssh + {% elif variant in ["alpine", "amazon", "aosc", "arch", "azurelinux", "fedora", + "gentoo", "mariner", "OpenCloudOS", "openeuler", +- "openmandriva", "photon", "suse", "TencentOS"] ++ "openmandriva", "photon", "suse", "TencentOS", "ol"] + or is_rhel %} + ssh_svcname: sshd + {% endif %} + +diff --git a/systemd/cloud-final.service b/systemd/cloud-final.service +index ab3daed..1c69dde 100644 +--- a/systemd/cloud-final.service ++++ b/systemd/cloud-final.service +@@ -3,7 +3,6 @@ + Description=Cloud-init: Final Stage + After=network-online.target time-sync.target cloud-config.service rc-local.service + After=multi-user.target +-Before=apt-daily.service + Wants=network-online.target cloud-config.service + ConditionPathExists=!/etc/cloud/cloud-init.disabled + ConditionKernelCommandLine=!cloud-init=disabled + +diff --git a/systemd/cloud-init-local.service.tmpl b/systemd/cloud-init-local.service.tmpl +index 3a1ca7f..4750c36 100644 +--- a/systemd/cloud-init-local.service.tmpl ++++ b/systemd/cloud-init-local.service.tmpl +@@ -2,19 +2,21 @@ + [Unit] + # https://docs.cloud-init.io/en/latest/explanation/boot.html + Description=Cloud-init: Local Stage (pre-network) +-{% if variant in ["almalinux", "cloudlinux", "ubuntu", "unknown", "debian", "rhel"] %} ++{% if variant in ["almalinux", "cloudlinux", "ubuntu", "unknown", "debian", "rhel", "ol"] %} + DefaultDependencies=no + {% endif %} + Wants=network-pre.target ++{% if variant not in ["ol"] %} + After=hv_kvp_daemon.service +-{% if variant in ["almalinux", "cloudlinux", "rhel"] %} ++{% endif %} ++{% if variant in ["almalinux", "cloudlinux", "rhel", "ol"] %} + Requires=dbus.socket + After=dbus.socket + {% endif %} + After=systemd-remount-fs.service + Before=network-pre.target + Before=shutdown.target +-{% if variant in ["almalinux", "cloudlinux", "rhel"] %} ++{% if variant in ["almalinux", "cloudlinux", "rhel", "ol"] %} + Before=firewalld.target + {% endif %} + {% if variant in ["ubuntu", "unknown", "debian"] %} +@@ -28,7 +30,7 @@ + + [Service] + Type=oneshot +-{% if variant in ["almalinux", "cloudlinux", "rhel"] %} ++{% if variant in ["almalinux", "cloudlinux", "rhel", "ol"] %} + ExecStartPre=/sbin/restorecon /run/cloud-init + {% endif %} + ExecStart=/usr/bin/cloud-init init --local +diff --git a/systemd/cloud-init.service.tmpl b/systemd/cloud-init.service.tmpl +index 90d45f2..2e1ce48 100644 +--- a/systemd/cloud-init.service.tmpl ++++ b/systemd/cloud-init.service.tmpl +@@ -2,7 +2,7 @@ + [Unit] + # https://docs.cloud-init.io/en/latest/explanation/boot.html + Description=Cloud-init: Network Stage +-{% if variant not in ["almalinux", "cloudlinux", "photon", "rhel"] %} ++{% if variant not in ["almalinux", "cloudlinux", "photon", "rhel", "ol"] %} + DefaultDependencies=no + {% endif %} + Wants=cloud-init-local.service +@@ -11,13 +11,15 @@ + Wants=sshd-keygen@ed25519.service + Wants=sshd.service + After=cloud-init-local.service ++{% if variant not in ["ol"] %} + After=systemd-networkd-wait-online.service ++{% endif %} + {% if variant in ["ubuntu", "unknown", "debian"] %} + After=networking.service + {% endif %} + {% if variant in ["almalinux", "centos", "cloudlinux", "eurolinux", "fedora", + "miraclelinux", "openeuler", "OpenCloudOS", "openmandriva", "rhel", "rocky", +- "suse", "TencentOS", "virtuozzo"] %} ++ "suse", "TencentOS", "virtuozzo", "ol"] %} + + After=NetworkManager.service + After=NetworkManager-wait-online.service + +diff --git a/systemd/cloud-init-generator.tmpl b/systemd/cloud-init-generator.tmpl +--- a/systemd/cloud-init-generator.tmpl ++++ b/systemd/cloud-init-generator.tmpl +@@ -21,7 +21,7 @@ + CLOUD_SYSTEM_TARGET="/lib/systemd/system/cloud-init.target" + {% endif %} + {% if variant in ["almalinux", "centos", "cloudlinux", "eurolinux", "fedora", +- "miraclelinux", "openeuler", "OpenCloudOS", "openmandriva", "rhel", "rocky", "TencentOS", "virtuozzo"] %} ++ "miraclelinux", "openeuler", "OpenCloudOS", "openmandriva", "rhel", "rocky", "TencentOS", "virtuozzo", "ol"] %} + dsidentify="/usr/libexec/cloud-init/ds-identify" + {% elif variant == "benchmark" %} + dsidentify="/bin/true" + +diff --git a/tests/unittests/test_util.py b/tests/unittests/test_util.py +index b534a1a..49087ad 100644 +--- a/tests/unittests/test_util.py ++++ b/tests/unittests/test_util.py +@@ -1334,6 +1334,7 @@ class TestGetVariant: + ({"system": "linux", "dist": ("sles",)}, "suse"), + ({"system": "linux", "dist": ("sle_hpc",)}, "suse"), + ({"system": "linux", "dist": ("my_distro",)}, "linux"), ++ ({"system": "linux", "dist": ("ol",)}, "ol"), + ({"system": "Windows", "dist": ("dontcare",)}, "windows"), + ({"system": "Darwin", "dist": ("dontcare",)}, "darwin"), + ({"system": "Freebsd", "dist": ("dontcare",)}, "freebsd"), +-- +2.31.1 + diff --git a/orabug37065979-DataSourceOracle-network-getdata-retries.patch b/orabug37065979-DataSourceOracle-network-getdata-retries.patch new file mode 100644 index 0000000..5a2835e --- /dev/null +++ b/orabug37065979-DataSourceOracle-network-getdata-retries.patch @@ -0,0 +1,115 @@ +Patch to adapt DataSourceOracle and make it functional for OCI. +Also includes setting for retries and timeouts previously provided by +a separate patch to help PCA instances get IMDS data. + +Orabug: 37065979 + +Signed-off-by: Rajesh Harekal +--- +diff -git a/cloudinit/sources/DataSourceOracle.py b/cloudinit/sources/DataSourceOracle.py +--- a/cloudinit/sources/DataSourceOracle.py 2025-03-07 16:04:37.773216485 -0800 ++++ a/cloudinit/sources/DataSourceOracle.py 2025-03-07 16:32:33.174574170 -0800 +@@ -15,6 +15,7 @@ + + import base64 + import ipaddress ++import os + import json + import logging + import time +@@ -32,6 +33,8 @@ + + LOG = logging.getLogger(__name__) + ++ISCSI_IBFT_PATH='/sys/firmware/acpi/tables/iBFT' ++ + BUILTIN_DS_CONFIG = { + # Don't use IMDS to configure secondary NICs by default + "configure_secondary_nics": False, +@@ -135,8 +138,8 @@ + perform_dhcp_setup = True + + # Careful...these can be overridden in __init__ +- url_max_wait = 30 +- url_timeout = 5 ++ url_max_wait = 180 ++ url_timeout = 20 + + def __init__(self, sys_cfg, *args, **kwargs): + super(DataSourceOracle, self).__init__(sys_cfg, *args, **kwargs) +@@ -149,7 +152,7 @@ + ] + ) + self._network_config_source = KlibcOracleNetworkConfigSource() +- self._network_config: dict = {"config": [], "version": 1} ++ self._network_config = sources.UNSET + + url_params = self.get_url_params() + self.url_max_wait = url_params.max_wait_seconds +@@ -274,7 +277,7 @@ + + def _is_iscsi_root(self) -> bool: + """Return whether we are on a iscsi machine.""" +- return self._network_config_source.is_applicable() ++ return self._network_config_source.is_applicable() or bool(os.path.exists(ISCSI_IBFT_PATH)) + + def _get_iscsi_config(self) -> dict: + return self._network_config_source.render_config() +@@ -294,34 +297,31 @@ + + set_primary = False + # this is v1 +- if self._is_iscsi_root(): +- self._network_config = self._get_iscsi_config() +- if not self._has_network_config(): +- LOG.warning( +- "Could not obtain network configuration from initramfs. " +- "Falling back to IMDS." ++ if self._network_config == sources.UNSET: ++ # this is v1 ++ if not self._has_network_config(): ++ self._network_config = self.distro.generate_fallback_config() ++ set_primary = True ++ ++ set_secondary = self.ds_cfg.get( ++ "configure_secondary_nics", ++ BUILTIN_DS_CONFIG["configure_secondary_nics"], + ) +- set_primary = True +- +- set_secondary = self.ds_cfg.get( +- "configure_secondary_nics", +- BUILTIN_DS_CONFIG["configure_secondary_nics"], +- ) +- if set_primary or set_secondary: +- try: +- # Mutate self._network_config to include primary and/or +- # secondary VNICs +- self._add_network_config_from_opc_imds(set_primary) +- except Exception: +- util.logexc( +- LOG, +- "Failed to parse IMDS network configuration!", +- ) ++ if set_primary or set_secondary: ++ try: ++ # Mutate self._network_config to include primary and/or ++ # secondary VNICs ++ self._add_network_config_from_opc_imds(set_primary) ++ except Exception: ++ util.logexc( ++ LOG, ++ "Failed to parse IMDS network configuration!", ++ ) + +- # we need to verify that the nic selected is not a netfail over +- # device and, if it is a netfail master, then we need to avoid +- # emitting any match by mac +- _ensure_netfailover_safe(self._network_config) ++ # we need to verify that the nic selected is not a netfail over ++ # device and, if it is a netfail master, then we need to avoid ++ # emitting any match by mac ++ _ensure_netfailover_safe(self._network_config) + + return self._network_config +