summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--0001-Add-initial-redhat-changes.patch99
-rw-r--r--0002-Do-not-write-NM_CONTROLLED-no-in-generated-interface.patch564
-rw-r--r--0003-Setting-autoconnect-priority-setting-for-network-scr.patch582
-rw-r--r--0004-net-network_manager-do-not-set-may-fail-to-False-for.patch140
-rw-r--r--0005-net-allow-dhcp6-configuration-from-generate_fallback.patch172
-rw-r--r--0006-net-nm-check-for-presence-of-ifcfg-files-when-nm-con.patch113
-rw-r--r--0007-test-jsonschema-Pin-jsonschema-version-4781.patch38
-rw-r--r--0008-fix-clean-stop-warning-when-running-clean-command-47.patch121
-rw-r--r--ci-Pin-pythes-8.0.0.patch44
-rw-r--r--ci-Retain-exit-code-in-cloud-init-status-for-recoverabl.patch65
-rw-r--r--ci-Revert-Use-grep-for-faster-parsing-of-cloud-config-i.patch242
-rw-r--r--ci-fix-Add-types-to-network-v1-schema-4841.patch110
-rw-r--r--cloud-init-tmpfiles.conf1
-rw-r--r--cloud-init.spec697
-rw-r--r--sources1
16 files changed, 2990 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..997bb45 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/23.4.tar.gz
diff --git a/0001-Add-initial-redhat-changes.patch b/0001-Add-initial-redhat-changes.patch
new file mode 100644
index 0000000..5024340
--- /dev/null
+++ b/0001-Add-initial-redhat-changes.patch
@@ -0,0 +1,99 @@
+From 03345a88b8b0008a4a81e010d46290f5ba643ebc Mon Sep 17 00:00:00 2001
+From: Ani Sinha <anisinha@redhat.com>
+Date: Wed, 13 Dec 2023 11:54:55 +0530
+Subject: [PATCH] Add initial redhat changes
+
+Adding minimal set of changes necessary for successful build of the package
+on RHEL/CentOS 9 Stream koji.
+
+Additional changes on top of the changes in 23.1.1 rebase:
+ - Updated VERSION, TARSHA512, MARKER and BUILD_TARGET_RHEL parameters in
+ Makefile.common in .dist/
+ - Squashed unit test fixes for the downstream changes in cloudinit/settings.py.
+
+Changes from 23.1.1 rebase follows:
+
+Merged patches (23.1.1):
+724a80ac Add TargetRelease
+967a4405b rhel/cloud.cfg: remove ssh_genkeytypes in settings.py and set in cloud.cfg
+^ Merged since it removes hunks added in this commit itself
+
+Discarded because not needed anymore (packit):
+e3fd7ce12 Configure Packit to ignore the .gitignore file
+e18654e9 Fixes for packit support
+
+Discarded because file does not exist anymore and templates are aligned with upstream:
+3576b12460bf18557857ee25df6bf530dab66612 Adding _netdev to the default mount configuration
+8092b57ab245856ff1fdde1469960608a489c95e Remove rhel specific files
+
+Added the following entry to %files to keep track of the new README file in config/clean.d/README
+%doc %{_sysconfdir}/cloud/clean.d/README
+
+ignored
+c75e509b0 Revert "Revert "Setting highest autoconnect priority for network-scripts""
+0eba5c619 Revert "Setting highest autoconnect priority for network-scripts"
+
+ignored
+ba19343c0d9807d0c68a2d8e4ab274f3ca884247 Add Gitlab CI
+fe09305a5479a4814d6c46df07a906bafa29d637 Delete .gitlab-ci.yml
+
+Conflicts:
+missing rhel/ static files and "" instead of '' in setup.py
+
+X-downstram-only: true
+Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+---
+ cloudinit/settings.py | 5 +++--
+ tests/unittests/cmd/test_main.py | 15 +++++++++------
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+diff --git a/cloudinit/settings.py b/cloudinit/settings.py
+index 592e144d..5ced21bd 100644
+--- a/cloudinit/settings.py
++++ b/cloudinit/settings.py
+@@ -54,13 +54,14 @@ CFG_BUILTIN = {
+ ],
+ "def_log_file": "/var/log/cloud-init.log",
+ "log_cfgs": [],
+- "syslog_fix_perms": ["syslog:adm", "root:adm", "root:wheel", "root:root"],
++ "mount_default_fields": [None, None, "auto", "defaults,nofail", "0", "2"],
++ "syslog_fix_perms": [],
+ "system_info": {
+ "paths": {
+ "cloud_dir": "/var/lib/cloud",
+ "templates_dir": "/etc/cloud/templates/",
+ },
+- "distro": "ubuntu",
++ "distro": "rhel",
+ "network": {"renderers": None},
+ },
+ "vendor_data": {"enabled": True, "prefix": []},
+diff --git a/tests/unittests/cmd/test_main.py b/tests/unittests/cmd/test_main.py
+index ab427115..19d26ebe 100644
+--- a/tests/unittests/cmd/test_main.py
++++ b/tests/unittests/cmd/test_main.py
+@@ -119,14 +119,17 @@ class TestMain(FilesystemMockingTestCase):
+ {
+ "def_log_file": "/var/log/cloud-init.log",
+ "log_cfgs": [],
+- "syslog_fix_perms": [
+- "syslog:adm",
+- "root:adm",
+- "root:wheel",
+- "root:root",
+- ],
+ "vendor_data": {"enabled": True, "prefix": []},
+ "vendor_data2": {"enabled": True, "prefix": []},
++ "syslog_fix_perms": [],
++ "mount_default_fields": [
++ None,
++ None,
++ "auto",
++ "defaults,nofail",
++ "0",
++ "2",
++ ],
+ }
+ )
+ updated_cfg.pop("system_info")
diff --git a/0002-Do-not-write-NM_CONTROLLED-no-in-generated-interface.patch b/0002-Do-not-write-NM_CONTROLLED-no-in-generated-interface.patch
new file mode 100644
index 0000000..7a224d1
--- /dev/null
+++ b/0002-Do-not-write-NM_CONTROLLED-no-in-generated-interface.patch
@@ -0,0 +1,564 @@
+From 5129908caa1867c7f584ec8d38607cf56b20521a Mon Sep 17 00:00:00 2001
+From: Eduardo Otubo <otubo@redhat.com>
+Date: Fri, 7 May 2021 13:36:06 +0200
+Subject: [PATCH] Do not write NM_CONTROLLED=no in generated interface config
+ files
+
+Conflicts 20.3:
+ - Not appplying patch on cloudinit/net/sysconfig.py since it now has a
+mechanism to identify if cloud-init is running on RHEL, having the
+correct settings for NM_CONTROLLED.
+
+Merged patches (21.1):
+- ecbace48 sysconfig: Don't write BOOTPROTO=dhcp for ipv6 dhcp
+- a1a00383 include 'NOZEROCONF=yes' in /etc/sysconfig/network
+X-downstream-only: true
+Signed-off-by: Eduardo Otubo <otubo@redhat.com>
+Signed-off-by: Ryan McCabe <rmccabe@redhat.com>
+
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+---
+ cloudinit/net/sysconfig.py | 12 ++++-
+ tests/unittests/cmd/devel/test_net_convert.py | 1 -
+ tests/unittests/distros/test_netconfig.py | 8 ---
+ tests/unittests/test_net.py | 53 -------------------
+ 4 files changed, 10 insertions(+), 64 deletions(-)
+
+diff --git a/cloudinit/net/sysconfig.py b/cloudinit/net/sysconfig.py
+index 7570a5e3..f01c4236 100644
+--- a/cloudinit/net/sysconfig.py
++++ b/cloudinit/net/sysconfig.py
+@@ -317,7 +317,6 @@ class Renderer(renderer.Renderer):
+ "rhel": {
+ "ONBOOT": True,
+ "USERCTL": False,
+- "NM_CONTROLLED": False,
+ "BOOTPROTO": "none",
+ },
+ "suse": {"BOOTPROTO": "static", "STARTMODE": "auto"},
+@@ -1030,7 +1029,16 @@ class Renderer(renderer.Renderer):
+ # Distros configuring /etc/sysconfig/network as a file e.g. Centos
+ if sysconfig_path.endswith("network"):
+ util.ensure_dir(os.path.dirname(sysconfig_path))
+- netcfg = [_make_header(), "NETWORKING=yes"]
++ netcfg = []
++ for line in util.load_file(sysconfig_path, quiet=True).split("\n"):
++ if "cloud-init" in line:
++ break
++ if not line.startswith(
++ ("NETWORKING=", "IPV6_AUTOCONF=", "NETWORKING_IPV6=")
++ ):
++ netcfg.append(line)
++ # Now generate the cloud-init portion of sysconfig/network
++ netcfg.extend([_make_header(), "NETWORKING=yes"])
+ if network_state.use_ipv6:
+ netcfg.append("NETWORKING_IPV6=yes")
+ netcfg.append("IPV6_AUTOCONF=no")
+diff --git a/tests/unittests/cmd/devel/test_net_convert.py b/tests/unittests/cmd/devel/test_net_convert.py
+index fb72963f..7b9121b2 100644
+--- a/tests/unittests/cmd/devel/test_net_convert.py
++++ b/tests/unittests/cmd/devel/test_net_convert.py
+@@ -62,7 +62,6 @@ SAMPLE_SYSCONFIG_CONTENT = """\
+ #
+ BOOTPROTO=dhcp
+ DEVICE=eth0
+-NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+diff --git a/tests/unittests/distros/test_netconfig.py b/tests/unittests/distros/test_netconfig.py
+index 7ba430f2..962ff7fb 100644
+--- a/tests/unittests/distros/test_netconfig.py
++++ b/tests/unittests/distros/test_netconfig.py
+@@ -723,7 +723,6 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ GATEWAY=192.168.1.254
+ IPADDR=192.168.1.5
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -733,7 +732,6 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ """\
+ BOOTPROTO=dhcp
+ DEVICE=eth1
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -764,7 +762,6 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ IPV6_AUTOCONF=no
+ IPV6_DEFAULTGW=2607:f0d0:1002:0011::1
+ IPV6_FORCE_ACCEPT_RA=no
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -774,7 +771,6 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ """\
+ BOOTPROTO=dhcp
+ DEVICE=eth1
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -821,7 +817,6 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ HWADDR=00:16:3e:60:7c:df
+ IPADDR=192.10.1.2
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -833,7 +828,6 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ DEVICE=infra0
+ IPADDR=10.0.1.2
+ NETMASK=255.255.0.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ PHYSDEV=eth0
+ USERCTL=no
+@@ -869,7 +863,6 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ DEVICE=eth0
+ IPADDR=192.10.1.2
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -881,7 +874,6 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ DEVICE=eth0.1001
+ IPADDR=10.0.1.2
+ NETMASK=255.255.0.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ PHYSDEV=eth0
+ USERCTL=no
+diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
+index c5509536..052b0674 100644
+--- a/tests/unittests/test_net.py
++++ b/tests/unittests/test_net.py
+@@ -585,7 +585,6 @@ GATEWAY=172.19.3.254
+ HWADDR=fa:16:3e:ed:9a:59
+ IPADDR=172.19.1.34
+ NETMASK=255.255.252.0
+-NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -750,7 +749,6 @@ IPADDR=172.19.1.34
+ IPADDR1=10.0.0.10
+ NETMASK=255.255.252.0
+ NETMASK1=255.255.255.0
+-NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -912,7 +910,6 @@ IPV6_AUTOCONF=no
+ IPV6_DEFAULTGW=2001:DB8::1
+ IPV6_FORCE_ACCEPT_RA=no
+ NETMASK=255.255.252.0
+-NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -1143,7 +1140,6 @@ NETWORK_CONFIGS = {
+ BOOTPROTO=none
+ DEVICE=eth1
+ HWADDR=cf:d6:af:48:e8:80
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -1162,7 +1158,6 @@ NETWORK_CONFIGS = {
+ IPADDR=192.168.21.3
+ NETMASK=255.255.255.0
+ METRIC=10000
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -1319,7 +1314,6 @@ NETWORK_CONFIGS = {
+ BOOTPROTO=none
+ DEVICE=eth1
+ HWADDR=cf:d6:af:48:e8:80
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -1338,7 +1332,6 @@ NETWORK_CONFIGS = {
+ IPADDR=192.168.21.3
+ NETMASK=255.255.255.0
+ METRIC=10000
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -1581,7 +1574,6 @@ NETWORK_CONFIGS = {
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -1725,7 +1717,6 @@ NETWORK_CONFIGS = {
+ DHCPV6C=yes
+ IPV6INIT=yes
+ DEVICE=iface0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -1816,7 +1807,6 @@ NETWORK_CONFIGS = {
+ IPV6INIT=yes
+ IPV6_FORCE_ACCEPT_RA=yes
+ DEVICE=iface0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -1892,7 +1882,6 @@ NETWORK_CONFIGS = {
+ IPV6INIT=yes
+ IPV6_FORCE_ACCEPT_RA=no
+ DEVICE=iface0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -1956,7 +1945,6 @@ NETWORK_CONFIGS = {
+ IPV6_AUTOCONF=yes
+ IPV6INIT=yes
+ DEVICE=iface0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -2014,7 +2002,6 @@ NETWORK_CONFIGS = {
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
+ DEVICE=iface0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -2071,7 +2058,6 @@ NETWORK_CONFIGS = {
+ IPV6_AUTOCONF=yes
+ IPV6INIT=yes
+ DEVICE=iface0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -2157,7 +2143,6 @@ NETWORK_CONFIGS = {
+ IPV6_FAILURE_FATAL=yes
+ IPV6_FORCE_ACCEPT_RA=yes
+ DEVICE=iface0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -2198,7 +2183,6 @@ NETWORK_CONFIGS = {
+ """\
+ BOOTPROTO=dhcp
+ DEVICE=iface0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -2275,7 +2259,6 @@ NETWORK_CONFIGS = {
+ BOOTPROTO=dhcp
+ DEVICE=iface0
+ ETHTOOL_OPTS="wol g"
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -2619,7 +2602,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ DHCPV6C=yes
+ IPV6INIT=yes
+ MACADDR=aa:bb:cc:dd:ee:ff
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Bond
+ USERCTL=no"""
+@@ -2629,7 +2611,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ BOOTPROTO=dhcp
+ DEVICE=bond0.200
+ DHCLIENT_SET_DEFAULT_ROUTE=no
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ PHYSDEV=bond0
+ USERCTL=no
+@@ -2649,7 +2630,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ IPV6_DEFAULTGW=2001:4800:78ff:1b::1
+ MACADDR=bb:bb:bb:bb:bb:aa
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ PRIO=22
+ STP=no
+@@ -2661,7 +2641,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ BOOTPROTO=none
+ DEVICE=eth0
+ HWADDR=c0:d6:9f:2c:e8:80
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -2680,7 +2659,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ MTU=1500
+ NETMASK=255.255.255.0
+ NETMASK1=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ PHYSDEV=eth0
+ USERCTL=no
+@@ -2692,7 +2670,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ DEVICE=eth1
+ HWADDR=aa:d6:9f:2c:e8:80
+ MASTER=bond0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ SLAVE=yes
+ TYPE=Ethernet
+@@ -2704,7 +2681,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ DEVICE=eth2
+ HWADDR=c0:bb:9f:2c:e8:80
+ MASTER=bond0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ SLAVE=yes
+ TYPE=Ethernet
+@@ -2716,7 +2692,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ BRIDGE=br0
+ DEVICE=eth3
+ HWADDR=66:bb:9f:2c:e8:80
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -2727,7 +2702,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ BRIDGE=br0
+ DEVICE=eth4
+ HWADDR=98:bb:9f:2c:e8:80
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -2738,7 +2712,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ DEVICE=eth5
+ DHCLIENT_SET_DEFAULT_ROUTE=no
+ HWADDR=98:bb:9f:2c:e8:8a
+- NM_CONTROLLED=no
+ ONBOOT=no
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -2751,7 +2724,6 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ IPADDR=192.168.200.7
+ MTU=9000
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=InfiniBand
+ USERCTL=no"""
+@@ -3473,7 +3445,6 @@ iface bond0 inet6 static
+ MTU=9000
+ NETMASK=255.255.255.0
+ NETMASK1=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Bond
+ USERCTL=no
+@@ -3485,7 +3456,6 @@ iface bond0 inet6 static
+ DEVICE=bond0s0
+ HWADDR=aa:bb:cc:dd:e8:00
+ MASTER=bond0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ SLAVE=yes
+ TYPE=Ethernet
+@@ -3513,7 +3483,6 @@ iface bond0 inet6 static
+ DEVICE=bond0s1
+ HWADDR=aa:bb:cc:dd:e8:01
+ MASTER=bond0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ SLAVE=yes
+ TYPE=Ethernet
+@@ -3662,7 +3631,6 @@ iface bond0 inet6 static
+ BOOTPROTO=none
+ DEVICE=en0
+ HWADDR=aa:bb:cc:dd:e8:00
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -3683,7 +3651,6 @@ iface bond0 inet6 static
+ MTU=2222
+ NETMASK=255.255.255.0
+ NETMASK1=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ PHYSDEV=en0
+ USERCTL=no
+@@ -3811,7 +3778,6 @@ iface bond0 inet6 static
+ DEVICE=br0
+ IPADDR=192.168.2.2
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ PRIO=22
+ STP=no
+@@ -3829,7 +3795,6 @@ iface bond0 inet6 static
+ IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -3845,7 +3810,6 @@ iface bond0 inet6 static
+ IPV6INIT=yes
+ IPV6_AUTOCONF=no
+ IPV6_FORCE_ACCEPT_RA=no
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -4030,7 +3994,6 @@ iface bond0 inet6 static
+ HWADDR=52:54:00:12:34:00
+ IPADDR=192.168.1.2
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=no
+ TYPE=Ethernet
+ USERCTL=no
+@@ -4042,7 +4005,6 @@ iface bond0 inet6 static
+ DEVICE=eth1
+ HWADDR=52:54:00:12:34:aa
+ MTU=1480
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -4053,7 +4015,6 @@ iface bond0 inet6 static
+ BOOTPROTO=none
+ DEVICE=eth2
+ HWADDR=52:54:00:12:34:ff
+- NM_CONTROLLED=no
+ ONBOOT=no
+ TYPE=Ethernet
+ USERCTL=no
+@@ -4138,7 +4099,6 @@ iface bond0 inet6 static
+ BOOTPROTO=none
+ DEVICE=eth0
+ HWADDR=cf:d6:af:48:e8:80
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no"""
+@@ -4736,7 +4696,6 @@ class TestRhelSysConfigRendering(CiTestCase):
+ BOOTPROTO=dhcp
+ DEVICE=eth1000
+ HWADDR=07-1c-c6-75-a4-be
+-NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -4948,7 +4907,6 @@ GATEWAY=10.0.2.2
+ HWADDR=52:54:00:12:34:00
+ IPADDR=10.0.2.15
+ NETMASK=255.255.255.0
+-NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -4979,7 +4937,6 @@ HWADDR=fa:16:3e:25:b4:59
+ IPADDR=51.68.89.122
+ MTU=1500
+ NETMASK=255.255.240.0
+-NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -4993,7 +4950,6 @@ DEVICE=eth1
+ DHCLIENT_SET_DEFAULT_ROUTE=no
+ HWADDR=fa:16:3e:b1:ca:29
+ MTU=9000
+-NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -5018,7 +4974,6 @@ USERCTL=no
+ #
+ BOOTPROTO=dhcp
+ DEVICE=eth0
+-NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -5251,7 +5206,6 @@ USERCTL=no
+ IPV6_FORCE_ACCEPT_RA=no
+ IPV6_DEFAULTGW=2001:db8::1
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -5283,7 +5237,6 @@ USERCTL=no
+ """\
+ BOOTPROTO=none
+ DEVICE=eno1
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -5296,7 +5249,6 @@ USERCTL=no
+ IPADDR=192.6.1.9
+ MTU=1495
+ NETMASK=255.255.255.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ PHYSDEV=eno1
+ USERCTL=no
+@@ -5332,7 +5284,6 @@ USERCTL=no
+ IPADDR=10.101.8.65
+ MTU=1334
+ NETMASK=255.255.255.192
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Bond
+ USERCTL=no
+@@ -5344,7 +5295,6 @@ USERCTL=no
+ BOOTPROTO=none
+ DEVICE=enp0s0
+ MASTER=bond0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ SLAVE=yes
+ TYPE=Bond
+@@ -5357,7 +5307,6 @@ USERCTL=no
+ BOOTPROTO=none
+ DEVICE=enp0s1
+ MASTER=bond0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ SLAVE=yes
+ TYPE=Bond
+@@ -5388,7 +5337,6 @@ USERCTL=no
+ DEVICE=eno1
+ HWADDR=07-1c-c6-75-a4-be
+ METRIC=100
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -5479,7 +5427,6 @@ USERCTL=no
+ IPV6_FORCE_ACCEPT_RA=no
+ MTU=1400
+ NETMASK=255.255.248.0
+- NM_CONTROLLED=no
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
diff --git a/0003-Setting-autoconnect-priority-setting-for-network-scr.patch b/0003-Setting-autoconnect-priority-setting-for-network-scr.patch
new file mode 100644
index 0000000..3a1513b
--- /dev/null
+++ b/0003-Setting-autoconnect-priority-setting-for-network-scr.patch
@@ -0,0 +1,582 @@
+From 8a2fcbbcfdfc1df6f6c18f96588154f40083a239 Mon Sep 17 00:00:00 2001
+From: Ani Sinha <anisinha@redhat.com>
+Date: Wed, 13 Dec 2023 11:55:16 +0530
+Subject: [PATCH] Setting autoconnect priority setting for network-scripts
+
+Squashed the following three downstream only commits from RHEL 9.3:
+
+Commit 1:
+
+Setting highest autoconnect priority for network-scripts
+
+RH-Author: Eduardo Otubo <otubo@redhat.com>
+RH-MergeRequest: 22: Setting highest autoconnect priority for network-scripts
+RH-Commit: [1/1] 34f1d62f8934a983a124df95b861a1e448681d3b (otubo/cloud-init-src)
+RH-Bugzilla: 2036060
+RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
+RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
+
+Set the highest autoconnect priority for network-scripts which is
+loaded by NetworkManager ifcfg-rh plugin. Note that keyfile is the only
+and default existing plugin on RHEL9, by setting the highest autoconnect
+priority for network-scripts, NetworkManager will activate
+network-scripts but keyfile. Network-scripts path:
+
+Since this is a blocking issue, we decided to have this one-liner
+downstream-only patch so we can move forward and have a better
+NetworkManager support later on the release.
+
+rhbz: 2036060
+x-downstream-only: yes
+
+Commit 2:
+
+net/sysconfig: do not use the highest autoconnect priority
+
+Using the highest priority is a very big hammer that we may not want to use. We
+may want users to override the cloud init generated ifcfg files for custom
+configuration of interfaces. If cloud init uses the highest priority, nothing
+can beat it. Hence lower the priority to 120 allowing values from 121 to 999
+to be used by users if they want to use a custom interface nm keyfile.
+
+X-downstream-only: true
+
+Suggested-by: thaller@redhat.com
+fixes: c589da20eb92231 ("Setting highest autoconnect priority for network-scripts")
+
+Commit 3:
+
+test fixes: update tests to reflect AUTOCONNECT_PRIORITY setting
+
+X-downstream-only: true
+fixes: 0a2c6b6118ff ("net/sysconfig: do not use the highest autoconnect priority")
+fixes: c589da20eb92 ("Setting highest autoconnect priority for network-scripts")
+
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+---
+ cloudinit/net/sysconfig.py | 1 +
+ tests/unittests/cmd/devel/test_net_convert.py | 1 +
+ tests/unittests/distros/test_netconfig.py | 8 +++
+ tests/unittests/test_net.py | 53 +++++++++++++++++++
+ 4 files changed, 63 insertions(+)
+
+diff --git a/cloudinit/net/sysconfig.py b/cloudinit/net/sysconfig.py
+index f01c4236..d39f4fe3 100644
+--- a/cloudinit/net/sysconfig.py
++++ b/cloudinit/net/sysconfig.py
+@@ -318,6 +318,7 @@ class Renderer(renderer.Renderer):
+ "ONBOOT": True,
+ "USERCTL": False,
+ "BOOTPROTO": "none",
++ "AUTOCONNECT_PRIORITY": 120,
+ },
+ "suse": {"BOOTPROTO": "static", "STARTMODE": "auto"},
+ }
+diff --git a/tests/unittests/cmd/devel/test_net_convert.py b/tests/unittests/cmd/devel/test_net_convert.py
+index 7b9121b2..288e3e37 100644
+--- a/tests/unittests/cmd/devel/test_net_convert.py
++++ b/tests/unittests/cmd/devel/test_net_convert.py
+@@ -60,6 +60,7 @@ DHCP=ipv4
+ SAMPLE_SYSCONFIG_CONTENT = """\
+ # Created by cloud-init automatically, do not edit.
+ #
++AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=eth0
+ ONBOOT=yes
+diff --git a/tests/unittests/distros/test_netconfig.py b/tests/unittests/distros/test_netconfig.py
+index 962ff7fb..4c624079 100644
+--- a/tests/unittests/distros/test_netconfig.py
++++ b/tests/unittests/distros/test_netconfig.py
+@@ -717,6 +717,7 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ expected_cfgs = {
+ self.ifcfg_path("eth0"): dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=eth0
+@@ -730,6 +731,7 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ ),
+ self.ifcfg_path("eth1"): dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=eth1
+ ONBOOT=yes
+@@ -754,6 +756,7 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ expected_cfgs = {
+ self.ifcfg_path("eth0"): dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=eth0
+@@ -769,6 +772,7 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ ),
+ self.ifcfg_path("eth1"): dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=eth1
+ ONBOOT=yes
+@@ -812,6 +816,7 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ expected_cfgs = {
+ self.ifcfg_path("eth0"): dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth0
+ HWADDR=00:16:3e:60:7c:df
+@@ -824,6 +829,7 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ ),
+ self.ifcfg_path("infra0"): dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=infra0
+ IPADDR=10.0.1.2
+@@ -859,6 +865,7 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ expected_cfgs = {
+ self.ifcfg_path("eth0"): dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth0
+ IPADDR=192.10.1.2
+@@ -870,6 +877,7 @@ class TestNetCfgDistroRedhat(TestNetCfgDistroBase):
+ ),
+ self.ifcfg_path("eth0.1001"): dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth0.1001
+ IPADDR=10.0.1.2
+diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
+index 052b0674..cef4fa2d 100644
+--- a/tests/unittests/test_net.py
++++ b/tests/unittests/test_net.py
+@@ -578,6 +578,7 @@ dns = none
+ """
+ # Created by cloud-init automatically, do not edit.
+ #
++AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=eth0
+@@ -740,6 +741,7 @@ dns = none
+ """
+ # Created by cloud-init automatically, do not edit.
+ #
++AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=eth0
+@@ -897,6 +899,7 @@ dns = none
+ """
+ # Created by cloud-init automatically, do not edit.
+ #
++AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=eth0
+@@ -1137,6 +1140,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-eth1": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth1
+ HWADDR=cf:d6:af:48:e8:80
+@@ -1146,6 +1150,7 @@ NETWORK_CONFIGS = {
+ ),
+ "ifcfg-eth99": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEFROUTE=yes
+ DEVICE=eth99
+@@ -1311,6 +1316,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-eth1": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth1
+ HWADDR=cf:d6:af:48:e8:80
+@@ -1320,6 +1326,7 @@ NETWORK_CONFIGS = {
+ ),
+ "ifcfg-eth99": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEFROUTE=yes
+ DEVICE=eth99
+@@ -1566,6 +1573,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=iface0
+ IPADDR=192.168.14.2
+@@ -1712,6 +1720,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=iface0
+ DHCPV6C=yes
+@@ -1801,6 +1810,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=iface0
+ DHCPV6C=yes
+@@ -1876,6 +1886,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=iface0
+ DHCPV6C=yes
+@@ -1940,6 +1951,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=iface0
+ IPV6_AUTOCONF=yes
+@@ -1995,6 +2007,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=iface0
+ IPV6ADDR=2001:1::1/64
+@@ -2051,6 +2064,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=iface0
+ DHCPV6C=yes
+@@ -2135,6 +2149,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=iface0
+ DHCPV6C=yes
+@@ -2181,6 +2196,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=iface0
+ ONBOOT=yes
+@@ -2256,6 +2272,7 @@ NETWORK_CONFIGS = {
+ "expected_sysconfig_rhel": {
+ "ifcfg-iface0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=iface0
+ ETHTOOL_OPTS="wol g"
+@@ -2591,6 +2608,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ "expected_sysconfig_rhel": {
+ "ifcfg-bond0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BONDING_MASTER=yes
+ BONDING_OPTS="mode=active-backup """
+ """xmit_hash_policy=layer3+4 """
+@@ -2608,6 +2626,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ ),
+ "ifcfg-bond0.200": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=bond0.200
+ DHCLIENT_SET_DEFAULT_ROUTE=no
+@@ -2619,6 +2638,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ "ifcfg-br0": textwrap.dedent(
+ """\
+ AGEING=250
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=br0
+@@ -2638,6 +2658,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ ),
+ "ifcfg-eth0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth0
+ HWADDR=c0:d6:9f:2c:e8:80
+@@ -2647,6 +2668,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ ),
+ "ifcfg-eth0.101": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=eth0.101
+@@ -2666,6 +2688,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ ),
+ "ifcfg-eth1": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth1
+ HWADDR=aa:d6:9f:2c:e8:80
+@@ -2677,6 +2700,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ ),
+ "ifcfg-eth2": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth2
+ HWADDR=c0:bb:9f:2c:e8:80
+@@ -2688,6 +2712,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ ),
+ "ifcfg-eth3": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ BRIDGE=br0
+ DEVICE=eth3
+@@ -2698,6 +2723,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ ),
+ "ifcfg-eth4": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ BRIDGE=br0
+ DEVICE=eth4
+@@ -2708,6 +2734,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ ),
+ "ifcfg-eth5": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=eth5
+ DHCLIENT_SET_DEFAULT_ROUTE=no
+@@ -2718,6 +2745,7 @@ pre-down route del -net 10.0.0.0/8 gw 11.0.0.1 metric 3 || true
+ ),
+ "ifcfg-ib0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=ib0
+ HWADDR=a0:00:02:20:fe:80:00:00:00:00:00:00:ec:0d:9a:03:00:15:e2:c1
+@@ -3422,6 +3450,7 @@ iface bond0 inet6 static
+ "expected_sysconfig_rhel": {
+ "ifcfg-bond0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BONDING_MASTER=yes
+ BONDING_OPTS="mode=active-backup xmit_hash_policy=layer3+4 """
+ """miimon=100 num_grat_arp=5 """
+@@ -3452,6 +3481,7 @@ iface bond0 inet6 static
+ ),
+ "ifcfg-bond0s0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=bond0s0
+ HWADDR=aa:bb:cc:dd:e8:00
+@@ -3479,6 +3509,7 @@ iface bond0 inet6 static
+ ),
+ "ifcfg-bond0s1": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=bond0s1
+ HWADDR=aa:bb:cc:dd:e8:01
+@@ -3628,6 +3659,7 @@ iface bond0 inet6 static
+ "expected_sysconfig_rhel": {
+ "ifcfg-en0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=en0
+ HWADDR=aa:bb:cc:dd:e8:00
+@@ -3637,6 +3669,7 @@ iface bond0 inet6 static
+ ),
+ "ifcfg-en0.99": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=en0.99
+@@ -3774,6 +3807,7 @@ iface bond0 inet6 static
+ "expected_sysconfig_rhel": {
+ "ifcfg-br0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=br0
+ IPADDR=192.168.2.2
+@@ -3787,6 +3821,7 @@ iface bond0 inet6 static
+ ),
+ "ifcfg-eth0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ BRIDGE=br0
+ DEVICE=eth0
+@@ -3802,6 +3837,7 @@ iface bond0 inet6 static
+ ),
+ "ifcfg-eth1": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ BRIDGE=br0
+ DEVICE=eth1
+@@ -3989,6 +4025,7 @@ iface bond0 inet6 static
+ "expected_sysconfig_rhel": {
+ "ifcfg-eth0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth0
+ HWADDR=52:54:00:12:34:00
+@@ -4001,6 +4038,7 @@ iface bond0 inet6 static
+ ),
+ "ifcfg-eth1": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth1
+ HWADDR=52:54:00:12:34:aa
+@@ -4012,6 +4050,7 @@ iface bond0 inet6 static
+ ),
+ "ifcfg-eth2": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth2
+ HWADDR=52:54:00:12:34:ff
+@@ -4096,6 +4135,7 @@ iface bond0 inet6 static
+ "expected_sysconfig_rhel": {
+ "ifcfg-eth0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eth0
+ HWADDR=cf:d6:af:48:e8:80
+@@ -4693,6 +4733,7 @@ class TestRhelSysConfigRendering(CiTestCase):
+ expected_content = """
+ # Created by cloud-init automatically, do not edit.
+ #
++AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=eth1000
+ HWADDR=07-1c-c6-75-a4-be
+@@ -4900,6 +4941,7 @@ USERCTL=no
+ expected = """\
+ # Created by cloud-init automatically, do not edit.
+ #
++AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=interface0
+@@ -4929,6 +4971,7 @@ USERCTL=no
+ expected_i1 = """\
+ # Created by cloud-init automatically, do not edit.
+ #
++AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=eth0
+@@ -4945,6 +4988,7 @@ USERCTL=no
+ expected_i2 = """\
+ # Created by cloud-init automatically, do not edit.
+ #
++AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=eth1
+ DHCLIENT_SET_DEFAULT_ROUTE=no
+@@ -4972,6 +5016,7 @@ USERCTL=no
+ expected = """\
+ # Created by cloud-init automatically, do not edit.
+ #
++AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=eth0
+ ONBOOT=yes
+@@ -5191,6 +5236,7 @@ USERCTL=no
+ "expected_sysconfig": {
+ "ifcfg-ens3": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=ens3
+@@ -5235,6 +5281,7 @@ USERCTL=no
+ expected = {
+ "ifcfg-eno1": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eno1
+ ONBOOT=yes
+@@ -5244,6 +5291,7 @@ USERCTL=no
+ ),
+ "ifcfg-eno1.1000": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEVICE=eno1.1000
+ IPADDR=192.6.1.9
+@@ -5276,6 +5324,7 @@ USERCTL=no
+ expected = {
+ "ifcfg-bond0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BONDING_MASTER=yes
+ BONDING_SLAVE0=enp0s0
+ BONDING_SLAVE1=enp0s1
+@@ -5291,6 +5340,7 @@ USERCTL=no
+ ),
+ "ifcfg-enp0s0": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BONDING_MASTER=yes
+ BOOTPROTO=none
+ DEVICE=enp0s0
+@@ -5303,6 +5353,7 @@ USERCTL=no
+ ),
+ "ifcfg-enp0s1": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BONDING_MASTER=yes
+ BOOTPROTO=none
+ DEVICE=enp0s1
+@@ -5333,6 +5384,7 @@ USERCTL=no
+ expected = {
+ "ifcfg-eno1": textwrap.dedent(
+ """\
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=eno1
+ HWADDR=07-1c-c6-75-a4-be
+@@ -5411,6 +5463,7 @@ USERCTL=no
+ """\
+ # Created by cloud-init automatically, do not edit.
+ #
++ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=none
+ DEFROUTE=yes
+ DEVICE=eth0
diff --git a/0004-net-network_manager-do-not-set-may-fail-to-False-for.patch b/0004-net-network_manager-do-not-set-may-fail-to-False-for.patch
new file mode 100644
index 0000000..f8de026
--- /dev/null
+++ b/0004-net-network_manager-do-not-set-may-fail-to-False-for.patch
@@ -0,0 +1,140 @@
+From 5fa8113a9efaa90f293b95477c4fa44e3d4b6537 Mon Sep 17 00:00:00 2001
+From: Ani Sinha <anisinha@redhat.com>
+Date: Thu, 23 Nov 2023 12:27:51 +0530
+Subject: [PATCH] net/network_manager: do not set "may-fail" to False for both
+ ipv4 and ipv6 dhcp
+
+If "may-fail" is set to False in the Network Manager keyfile for both ipv4
+and ipv6 for dhcp configuration, it essentially means both ipv4 and ipv6 network
+initialization using dhcp must succeed for the overall network configuration to
+succeed. This means, for environments where only ipv4 or ipv6 is available but
+not both and we need to configure both ipv4 and ipv6 dhcp, the overall
+network configuration will fail. This is not what we want. When both ipv4
+and ipv6 dhcp are configured, it is enough for the overall configuration to
+succeed if any one succeeds.
+Therefore, set "may-fail" to True for both ipv4 and ipv6 if and only if both
+ipv4 and ipv6 are configured as dhcp in the Network Manager keyfile and
+"may-fail" is set to False for both. If both ipv4 and ipv6 are configured
+in the keyfile and if for any of them "may-fail" is already set to True,then
+do nothing.
+All other cases remain same as before.
+
+Please see discussions in PR #4474.
+
+Co-authored-by: James Falcon <james.falcon@canonical.com>
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+(cherry picked from commit 29dd5ace73ad60c7452c39b840045fb47fe0711f)
+---
+ cloudinit/net/network_manager.py | 59 ++++++++++++++++++++++++++++++++
+ tests/unittests/test_net.py | 8 ++---
+ 2 files changed, 63 insertions(+), 4 deletions(-)
+
+diff --git a/cloudinit/net/network_manager.py b/cloudinit/net/network_manager.py
+index 8374cfcc..8a99eb3a 100644
+--- a/cloudinit/net/network_manager.py
++++ b/cloudinit/net/network_manager.py
+@@ -71,6 +71,57 @@ class NMConnection:
+ if not self.config.has_option(section, option):
+ self.config[section][option] = value
+
++ def _config_option_is_set(self, section, option):
++ """
++ Checks if a config option is set. Returns True if it is,
++ else returns False.
++ """
++ return self.config.has_section(section) and self.config.has_option(
++ section, option
++ )
++
++ def _get_config_option(self, section, option):
++ """
++ Returns the value of a config option if its set,
++ else returns None.
++ """
++ if self._config_option_is_set(section, option):
++ return self.config[section][option]
++ else:
++ return None
++
++ def _change_set_config_option(self, section, option, value):
++ """
++ Overrides the value of a config option if its already set.
++ Else, if the config option is not set, it does nothing.
++ """
++ if self._config_option_is_set(section, option):
++ self.config[section][option] = value
++
++ def _set_mayfail_true_if_both_false_dhcp(self):
++ """
++ If for both ipv4 and ipv6, 'may-fail' is set to be False,
++ set it to True for both of them.
++ """
++ for family in ["ipv4", "ipv6"]:
++ if self._get_config_option(family, "may-fail") != "false":
++ # if either ipv4 or ipv6 sections are not set/configured,
++ # or if both are configured but for either ipv4 or ipv6,
++ # 'may-fail' is not 'false', do not do anything.
++ return
++ if self._get_config_option(family, "method") not in [
++ "dhcp",
++ "auto",
++ ]:
++ # if both v4 and v6 are not dhcp, do not do anything.
++ return
++
++ # If we landed here, it means both ipv4 and ipv6 are configured
++ # with dhcp/auto and both have 'may-fail' set to 'false'. So set
++ # both to 'true'.
++ for family in ["ipv4", "ipv6"]:
++ self._change_set_config_option(family, "may-fail", "true")
++
+ def _set_ip_method(self, family, subnet_type):
+ """
+ Ensures there's appropriate [ipv4]/[ipv6] for given family
+@@ -271,6 +322,14 @@ class NMConnection:
+ if family == "ipv4" and "mtu" in subnet:
+ ipv4_mtu = subnet["mtu"]
+
++ # 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
++ # what we want. If we have configured both ipv4 and ipv6 dhcp, any one
++ # succeeding should be enough. Therefore, if "may-fail" is set to
++ # False for both ipv4 and ipv6 dhcp, set them both to True.
++ self._set_mayfail_true_if_both_false_dhcp()
++
+ if ipv4_mtu is None:
+ ipv4_mtu = device_mtu
+ if not ipv4_mtu == device_mtu:
+diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
+index cef4fa2d..fb4c863c 100644
+--- a/tests/unittests/test_net.py
++++ b/tests/unittests/test_net.py
+@@ -1477,11 +1477,11 @@ NETWORK_CONFIGS = {
+
+ [ipv4]
+ method=auto
+- may-fail=false
++ may-fail=true
+
+ [ipv6]
+ method=auto
+- may-fail=false
++ may-fail=true
+
+ """
+ ),
+@@ -1650,11 +1650,11 @@ NETWORK_CONFIGS = {
+
+ [ipv6]
+ method=auto
+- may-fail=false
++ may-fail=true
+
+ [ipv4]
+ method=auto
+- may-fail=false
++ may-fail=true
+
+ """
+ ),
diff --git a/0005-net-allow-dhcp6-configuration-from-generate_fallback.patch b/0005-net-allow-dhcp6-configuration-from-generate_fallback.patch
new file mode 100644
index 0000000..56a4ca7
--- /dev/null
+++ b/0005-net-allow-dhcp6-configuration-from-generate_fallback.patch
@@ -0,0 +1,172 @@
+From 54e87eaad7841270e530beff2dcfe68292ae87ef Mon Sep 17 00:00:00 2001
+From: Ani Sinha <anisinha@redhat.com>
+Date: Tue, 21 Nov 2023 13:57:15 +0530
+Subject: [PATCH] net: allow dhcp6 configuration from
+ generate_fallback_configuration()
+
+This will make sure on Azure we can use both dhcp4 and dhcp6 when IMDS is not
+used. This is useful in situations where only ipv6 network is available and
+there is no dhcp4 running.
+
+This change is mostly a reversal of commit 29ed5f5b646ee and therefore,
+re-application of the commit 518047aea9 with some small changes.
+
+The issue that caused the reversal of 518047aea9 is fixed by the earlier commit:
+cab0eaf290af7 ("net/network_manager: do not set "may-fail" to False for both ipv4 and ipv6 dhcp")
+
+Fixes GH-4439
+
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+(cherry picked from commit 0264e969166846b2f5cf87ccdb051a3a795eca15)
+---
+ cloudinit/net/__init__.py | 7 ++++++-
+ tests/unittests/net/test_init.py | 4 ++++
+ tests/unittests/test_net.py | 24 +++++++++++++++++++++---
+ 3 files changed, 31 insertions(+), 4 deletions(-)
+
+diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py
+index bf21633b..c0888f52 100644
+--- a/cloudinit/net/__init__.py
++++ b/cloudinit/net/__init__.py
+@@ -571,7 +571,12 @@ def generate_fallback_config(config_driver=None):
+ match = {
+ "macaddress": read_sys_net_safe(target_name, "address").lower()
+ }
+- cfg = {"dhcp4": True, "set-name": target_name, "match": match}
++ cfg = {
++ "dhcp4": True,
++ "dhcp6": True,
++ "set-name": target_name,
++ "match": match,
++ }
+ if config_driver:
+ driver = device_driver(target_name)
+ if driver:
+diff --git a/tests/unittests/net/test_init.py b/tests/unittests/net/test_init.py
+index 561d5151..60a44186 100644
+--- a/tests/unittests/net/test_init.py
++++ b/tests/unittests/net/test_init.py
+@@ -261,6 +261,7 @@ class TestGenerateFallbackConfig(CiTestCase):
+ "eth1": {
+ "match": {"macaddress": mac},
+ "dhcp4": True,
++ "dhcp6": True,
+ "set-name": "eth1",
+ }
+ },
+@@ -278,6 +279,7 @@ class TestGenerateFallbackConfig(CiTestCase):
+ "eth0": {
+ "match": {"macaddress": mac},
+ "dhcp4": True,
++ "dhcp6": True,
+ "set-name": "eth0",
+ }
+ },
+@@ -293,6 +295,7 @@ class TestGenerateFallbackConfig(CiTestCase):
+ "ethernets": {
+ "eth0": {
+ "dhcp4": True,
++ "dhcp6": True,
+ "match": {"macaddress": mac},
+ "set-name": "eth0",
+ }
+@@ -359,6 +362,7 @@ class TestGenerateFallbackConfig(CiTestCase):
+ "ethernets": {
+ "ens3": {
+ "dhcp4": True,
++ "dhcp6": True,
+ "match": {"name": "ens3"},
+ "set-name": "ens3",
+ }
+diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
+index fb4c863c..d9ef493b 100644
+--- a/tests/unittests/test_net.py
++++ b/tests/unittests/test_net.py
+@@ -4339,6 +4339,7 @@ class TestGenerateFallbackConfig(CiTestCase):
+ "ethernets": {
+ "eth0": {
+ "dhcp4": True,
++ "dhcp6": True,
+ "set-name": "eth0",
+ "match": {
+ "macaddress": "00:11:22:33:44:55",
+@@ -4423,6 +4424,9 @@ iface lo inet loopback
+
+ auto eth0
+ iface eth0 inet dhcp
++
++# control-alias eth0
++iface eth0 inet6 dhcp
+ """
+ self.assertEqual(expected.lstrip(), contents.lstrip())
+
+@@ -4512,6 +4516,9 @@ iface lo inet loopback
+
+ auto eth1
+ iface eth1 inet dhcp
++
++# control-alias eth1
++iface eth1 inet6 dhcp
+ """
+ self.assertEqual(expected.lstrip(), contents.lstrip())
+
+@@ -4736,7 +4743,9 @@ class TestRhelSysConfigRendering(CiTestCase):
+ AUTOCONNECT_PRIORITY=120
+ BOOTPROTO=dhcp
+ DEVICE=eth1000
++DHCPV6C=yes
+ HWADDR=07-1c-c6-75-a4-be
++IPV6INIT=yes
+ ONBOOT=yes
+ TYPE=Ethernet
+ USERCTL=no
+@@ -5646,7 +5655,8 @@ class TestOpenSuseSysConfigRendering(CiTestCase):
+ expected_content = """
+ # Created by cloud-init automatically, do not edit.
+ #
+-BOOTPROTO=dhcp4
++BOOTPROTO=dhcp
++DHCLIENT6_MODE=managed
+ LLADDR=07-1c-c6-75-a4-be
+ STARTMODE=auto
+ """.lstrip()
+@@ -6032,7 +6042,11 @@ class TestNetworkManagerRendering(CiTestCase):
+
+ [ipv4]
+ method=auto
+- may-fail=false
++ may-fail=true
++
++ [ipv6]
++ method=auto
++ may-fail=true
+
+ """
+ ),
+@@ -6298,6 +6312,9 @@ iface lo inet loopback
+
+ auto eth1000
+ iface eth1000 inet dhcp
++
++# control-alias eth1000
++iface eth1000 inet6 dhcp
+ """
+ self.assertEqual(expected.lstrip(), contents.lstrip())
+
+@@ -6357,6 +6374,7 @@ class TestNetplanNetRendering:
+ ethernets:
+ eth1000:
+ dhcp4: true
++ dhcp6: true
+ match:
+ macaddress: 07-1c-c6-75-a4-be
+ set-name: eth1000
+@@ -7856,7 +7874,7 @@ class TestNetworkdNetRendering(CiTestCase):
+ Name=eth1000
+ MACAddress=07-1c-c6-75-a4-be
+ [Network]
+- DHCP=ipv4"""
++ DHCP=yes"""
+ ).rstrip(" ")
+
+ expected = self.create_conf_dict(expected.splitlines())
diff --git a/0006-net-nm-check-for-presence-of-ifcfg-files-when-nm-con.patch b/0006-net-nm-check-for-presence-of-ifcfg-files-when-nm-con.patch
new file mode 100644
index 0000000..40c2490
--- /dev/null
+++ b/0006-net-nm-check-for-presence-of-ifcfg-files-when-nm-con.patch
@@ -0,0 +1,113 @@
+From c0df864e373e1e34bf23c4869acdf7d20aea7aaf Mon Sep 17 00:00:00 2001
+From: Ani Sinha <anisinha@redhat.com>
+Date: Thu, 7 Dec 2023 02:39:51 +0530
+Subject: [PATCH] net/nm: check for presence of ifcfg files when nm connection
+ files are absent (#4645)
+
+On systems that use network manager to manage connections and activate network
+interfaces, they may also use ifcfg files for configuring
+interfaces using ifcfg-rh network manager plugin. When network manager is used
+as the activator, we need to also check for the presence of ifcfg interface
+config file when the network manager connection file is absent and if ifcfg-rh
+plugin is present.
+Hence, with this change, network manager activator first tries to use network
+manager connection files to bring up or bring down the interface. If the
+connection files are not present and if ifcfg-rh plugin is present, it tries to
+use ifcfg files for the interface. If the plugin or the ifcfg files are not
+present, the activator fails to activate or deactivate the interface and it
+bails out with warning log.
+
+Fixes: GH-4640
+
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+(cherry picked from commit d1d5166895da471cff3606c70d4e8ab6eec1c006)
+---
+ cloudinit/net/activators.py | 7 +++++++
+ cloudinit/net/network_manager.py | 33 ++++++++++++++++++++++++++++++--
+ 2 files changed, 38 insertions(+), 2 deletions(-)
+
+diff --git a/cloudinit/net/activators.py b/cloudinit/net/activators.py
+index e69da40d..dd858862 100644
+--- a/cloudinit/net/activators.py
++++ b/cloudinit/net/activators.py
+@@ -117,6 +117,13 @@ class NetworkManagerActivator(NetworkActivator):
+ from cloudinit.net.network_manager import conn_filename
+
+ filename = conn_filename(device_name)
++ if filename is None:
++ LOG.warning(
++ "Unable to find an interface config file. "
++ "Unable to bring up interface."
++ )
++ return False
++
+ cmd = ["nmcli", "connection", "load", filename]
+ if _alter_interface(cmd, device_name):
+ cmd = ["nmcli", "connection", "up", "filename", filename]
+diff --git a/cloudinit/net/network_manager.py b/cloudinit/net/network_manager.py
+index 8a99eb3a..76a0ac15 100644
+--- a/cloudinit/net/network_manager.py
++++ b/cloudinit/net/network_manager.py
+@@ -17,10 +17,12 @@ from typing import Optional
+ from cloudinit import subp, util
+ from cloudinit.net import is_ipv6_address, renderer, subnet_is_ipv6
+ from cloudinit.net.network_state import NetworkState
++from cloudinit.net.sysconfig import available_nm_ifcfg_rh
+
+ NM_RUN_DIR = "/etc/NetworkManager"
+ NM_LIB_DIR = "/usr/lib/NetworkManager"
+ NM_CFG_FILE = "/etc/NetworkManager/NetworkManager.conf"
++IFCFG_CFG_FILE = "/etc/sysconfig/network-scripts"
+ NM_IPV6_ADDR_GEN_CONF = """# This is generated by cloud-init. Do not edit.
+ #
+ [.config]
+@@ -442,7 +444,7 @@ class Renderer(renderer.Renderer):
+ for con_id, conn in self.connections.items():
+ if not conn.valid():
+ continue
+- name = conn_filename(con_id, target)
++ name = nm_conn_filename(con_id, target)
+ util.write_file(name, conn.dump(), 0o600)
+
+ # Select EUI64 to be used by default by NM for creating the address
+@@ -452,12 +454,39 @@ class Renderer(renderer.Renderer):
+ )
+
+
+-def conn_filename(con_id, target=None):
++def nm_conn_filename(con_id, target=None):
+ target_con_dir = subp.target_path(target, NM_RUN_DIR)
+ con_file = f"cloud-init-{con_id}.nmconnection"
+ return f"{target_con_dir}/system-connections/{con_file}"
+
+
++def sysconfig_conn_filename(devname, target=None):
++ target_con_dir = subp.target_path(target, IFCFG_CFG_FILE)
++ con_file = f"ifcfg-{devname}"
++ return f"{target_con_dir}/{con_file}"
++
++
++def conn_filename(devname):
++ """
++ This function returns the name of the interface config file.
++ It first checks for presence of network manager connection file.
++ If absent and ifcfg-rh plugin for network manager is available,
++ it returns the name of the ifcfg file if it is present. If the
++ plugin is not present or the plugin is present but ifcfg file is
++ not, it returns None.
++ This function is called from NetworkManagerActivator class in
++ activators.py.
++ """
++ conn_file = nm_conn_filename(devname)
++ # If the network manager connection file is absent, also check for
++ # presence of ifcfg files for the same interface (if nm-ifcfg-rh plugin is
++ # present, network manager can handle ifcfg files). If both network manager
++ # connection file and ifcfg files are absent, return None.
++ if not os.path.isfile(conn_file) and available_nm_ifcfg_rh():
++ conn_file = sysconfig_conn_filename(devname)
++ return conn_file if os.path.isfile(conn_file) else None
++
++
+ def cloud_init_nm_conf_filename(target=None):
+ target_con_dir = subp.target_path(target, NM_RUN_DIR)
+ conf_file = "30-cloud-init-ip6-addr-gen-mode.conf"
diff --git a/0007-test-jsonschema-Pin-jsonschema-version-4781.patch b/0007-test-jsonschema-Pin-jsonschema-version-4781.patch
new file mode 100644
index 0000000..ad7e5d6
--- /dev/null
+++ b/0007-test-jsonschema-Pin-jsonschema-version-4781.patch
@@ -0,0 +1,38 @@
+From e5258b60a3dbf44ef1faac91db2b45dab09de0b5 Mon Sep 17 00:00:00 2001
+From: Brett Holman <brett.holman@canonical.com>
+Date: Tue, 16 Jan 2024 12:43:17 -0700
+Subject: [PATCH] test(jsonschema): Pin jsonschema version (#4781)
+
+Release 4.21.0 broke tests
+
+(cherry picked from commit 034a5cdf10582da0492321f861b2b8b42182a54e)
+---
+ requirements.txt | 2 +-
+ test-requirements.txt | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/requirements.txt b/requirements.txt
+index edec46a7..a095de18 100644
+--- a/requirements.txt
++++ b/requirements.txt
+@@ -28,7 +28,7 @@ requests
+ jsonpatch
+
+ # For validating cloud-config sections per schema definitions
+-jsonschema
++jsonschema<=4.20.0
+
+ # Used by DataSourceVMware to inspect the host's network configuration during
+ # the "setup()" function.
+diff --git a/test-requirements.txt b/test-requirements.txt
+index 19488b94..46a98b4c 100644
+--- a/test-requirements.txt
++++ b/test-requirements.txt
+@@ -9,6 +9,6 @@ pytest!=7.3.2
+ pytest-cov
+ pytest-mock
+ setuptools
+-jsonschema
++jsonschema<=4.20.0
+ responses
+ passlib
diff --git a/0008-fix-clean-stop-warning-when-running-clean-command-47.patch b/0008-fix-clean-stop-warning-when-running-clean-command-47.patch
new file mode 100644
index 0000000..72884d5
--- /dev/null
+++ b/0008-fix-clean-stop-warning-when-running-clean-command-47.patch
@@ -0,0 +1,121 @@
+From 9e8fbb736d5e8db8bcf0fbc35a76bdad9251990a Mon Sep 17 00:00:00 2001
+From: d1r3ct0r <calvin.mwadime@canonical.com>
+Date: Sat, 20 Jan 2024 02:11:47 +0300
+Subject: [PATCH] fix(clean): stop warning when running clean command (#4761)
+
+When the clean command is run, runparts is called and README in
+/etc/cloud/clean.d is not executable which leads to a warning.
+
+No longer deliver the README in our deb package, move content
+to our online docs. Continue to deliver the /etc/cloud/clean.d
+directory as it is used by installers like subiquity.
+
+Fixes: GH-4760
+(cherry picked from commit da08a260965e35fa63def1cd8b8b472f7c354ffe)
+
+There is a downstream only change that is squashed with the upstream commit.
+The spec file under .distro/ has been updated so as to not include
+/etc/cloud/clean.d/README file. Otherwise, we shall see errors like the
+following during the build process:
+
+error: File not found: /builddir/build/.../etc/cloud/clean.d/README
+
+After a rebase, we can only maintain the downstream spec file change as
+the rest of it is clean cherry-pick from upstream.
+
+X-downstream-only: true
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+---
+ config/clean.d/README | 18 ------------------
+ doc/rtd/reference/cli.rst | 27 +++++++++++++++++++++++++++
+ packages/redhat/cloud-init.spec.in | 1 -
+ packages/suse/cloud-init.spec.in | 1 -
+ 4 files changed, 27 insertions(+), 20 deletions(-)
+ delete mode 100644 config/clean.d/README
+
+diff --git a/config/clean.d/README b/config/clean.d/README
+deleted file mode 100644
+index 9b0feebe..00000000
+--- a/config/clean.d/README
++++ /dev/null
+@@ -1,18 +0,0 @@
+--- cloud-init's clean.d run-parts directory --
+-
+-This directory is provided for third party applications which need
+-additional configuration artifact cleanup from the filesystem when
+-the command `cloud-init clean` is invoked.
+-
+-The `cloud-init clean` operation is typically performed by image creators
+-when preparing a golden image for clone and redeployment. The clean command
+-removes any cloud-init semaphores, allowing cloud-init to treat the next
+-boot of this image as the "first boot". When the image is next booted
+-cloud-init will performing all initial configuration based on any valid
+-datasource meta-data and user-data.
+-
+-Any executable scripts in this subdirectory will be invoked in lexicographical
+-order with run-parts by the command: sudo cloud-init clean.
+-
+-Typical format of such scripts would be a ##-<some-app> like the following:
+- /etc/cloud/clean.d/99-live-installer
+diff --git a/doc/rtd/reference/cli.rst b/doc/rtd/reference/cli.rst
+index 04e05c55..c36775a8 100644
+--- a/doc/rtd/reference/cli.rst
++++ b/doc/rtd/reference/cli.rst
+@@ -83,6 +83,33 @@ re-run all stages as it did on first boot.
+ config files for ssh daemon. Argument `network` removes all generated
+ config files for network. `all` removes config files of all types.
+
++.. note::
++
++ Cloud-init provides the directory :file:`/etc/cloud/clean.d/` for third party
++ applications which need additional configuration artifact cleanup from
++ the fileystem when the `clean` command is invoked.
++
++ The :command:`clean` operation is typically performed by image creators
++ when preparing a golden image for clone and redeployment. The clean command
++ removes any cloud-init semaphores, allowing cloud-init to treat the next
++ boot of this image as the "first boot". When the image is next booted
++ cloud-init will performing all initial configuration based on any valid
++ datasource meta-data and user-data.
++
++ Any executable scripts in this subdirectory will be invoked in lexicographical
++ order with run-parts when running the :command:`clean` command.
++
++ Typical format of such scripts would be a ##-<some-app> like the following:
++ :file:`/etc/cloud/clean.d/99-live-installer`
++
++ An example of a script is:
++
++ .. code-block:: bash
++
++ sudo rm -rf /var/lib/installer_imgs/
++ sudo rm -rf /var/log/installer/
++
++
+ .. _cli_collect_logs:
+
+ :command:`collect-logs`
+diff --git a/packages/redhat/cloud-init.spec.in b/packages/redhat/cloud-init.spec.in
+index 97e95096..accfb1b6 100644
+--- a/packages/redhat/cloud-init.spec.in
++++ b/packages/redhat/cloud-init.spec.in
+@@ -190,7 +190,6 @@ fi
+ # Configs
+ %config(noreplace) %{_sysconfdir}/cloud/cloud.cfg
+ %dir %{_sysconfdir}/cloud/clean.d
+-%config(noreplace) %{_sysconfdir}/cloud/clean.d/README
+ %dir %{_sysconfdir}/cloud/cloud.cfg.d
+ %config(noreplace) %{_sysconfdir}/cloud/cloud.cfg.d/*.cfg
+ %config(noreplace) %{_sysconfdir}/cloud/cloud.cfg.d/README
+diff --git a/packages/suse/cloud-init.spec.in b/packages/suse/cloud-init.spec.in
+index 62a9129b..fae3c12b 100644
+--- a/packages/suse/cloud-init.spec.in
++++ b/packages/suse/cloud-init.spec.in
+@@ -115,7 +115,6 @@ version_pys=$(cd "%{buildroot}" && find . -name version.py -type f)
+
+ # Configs
+ %dir %{_sysconfdir}/cloud/clean.d
+-%config(noreplace) %{_sysconfdir}/cloud/clean.d/README
+ %config(noreplace) %{_sysconfdir}/cloud/cloud.cfg
+ %dir %{_sysconfdir}/cloud/cloud.cfg.d
+ %config(noreplace) %{_sysconfdir}/cloud/cloud.cfg.d/*.cfg
diff --git a/ci-Pin-pythes-8.0.0.patch b/ci-Pin-pythes-8.0.0.patch
new file mode 100644
index 0000000..cdb8413
--- /dev/null
+++ b/ci-Pin-pythes-8.0.0.patch
@@ -0,0 +1,44 @@
+From 7f3b0ff968409a880596e04aece4e4c504fb9c64 Mon Sep 17 00:00:00 2001
+From: Brett Holman <brett.holman@canonical.com>
+Date: Mon, 29 Jan 2024 12:03:36 -0700
+Subject: [PATCH] ci: Pin pytest<8.0.0. (#4816)
+
+The latest pytest release broke some tests in non-obvious ways. Pin
+the version for now so that CI passes.
+
+(cherry picked from commit 7c96c9cd9318e816ce4564b58a2c98271363c447)
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+---
+ integration-requirements.txt | 2 +-
+ test-requirements.txt | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/integration-requirements.txt b/integration-requirements.txt
+index 1f8b54a5..c0792d63 100644
+--- a/integration-requirements.txt
++++ b/integration-requirements.txt
+@@ -7,7 +7,7 @@ pycloudlib>=5.10.0,<1!6
+ # test/unittests/conftest.py to be loaded by our integration-tests tox env
+ # resulting in an unmet dependency issue:
+ # https://github.com/pytest-dev/pytest/issues/11104
+-pytest!=7.3.2
++pytest!=7.3.2,<8.0.0
+
+ packaging
+ passlib
+diff --git a/test-requirements.txt b/test-requirements.txt
+index 46a98b4c..3d2480fd 100644
+--- a/test-requirements.txt
++++ b/test-requirements.txt
+@@ -4,7 +4,7 @@
+ # test/unittests/conftest.py to be loaded by our integration-tests tox env
+ # resulting in an unmet dependency issue:
+ # https://github.com/pytest-dev/pytest/issues/11104
+-pytest!=7.3.2
++pytest!=7.3.2,<8.0.0
+
+ pytest-cov
+ pytest-mock
+--
+2.39.3
+
diff --git a/ci-Retain-exit-code-in-cloud-init-status-for-recoverabl.patch b/ci-Retain-exit-code-in-cloud-init-status-for-recoverabl.patch
new file mode 100644
index 0000000..dd63da2
--- /dev/null
+++ b/ci-Retain-exit-code-in-cloud-init-status-for-recoverabl.patch
@@ -0,0 +1,65 @@
+From cc31dc321ae35995ceff93e67aaf0b0c660aa890 Mon Sep 17 00:00:00 2001
+From: Ani Sinha <anisinha@redhat.com>
+Date: Tue, 12 Mar 2024 12:52:10 +0530
+Subject: [PATCH] Retain exit code in cloud-init status for recoverable errors
+
+RH-Author: Ani Sinha <None>
+RH-MergeRequest: 71: Retain exit code in cloud-init status for recoverable errors
+RH-Jira: RHEL-28549
+RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
+RH-Acked-by: Cathy Avery <cavery@redhat.com>
+RH-Commit: [1/1] 00934ade88c481c012bc1947fa44e5ed59f82858 (anisinha/cloud-init)
+
+Version 23.4 of cloud-init changed the status code reported by cloud-init for
+recoverable errors from 0 to 2. Please see the commit
+70acb7f2a30d58 ("Add support for cloud-init "degraded" state (#4500)")
+
+This change has the potential to break customers who are expecting a 0 status
+and where warnings can be expected. Hence, revert the status code from 2 to 0
+even in case of recoverable errors. This retains the old behavior and hence
+avoids breaking scripts and software stack that expects 0 on the end user side.
+
+Cannonical has made a similar change downstream for similar reasons. Please see
+https://bugs.launchpad.net/ubuntu/+source/cloud-init/+bug/2048522
+and the corresponding downstream patch:
+https://github.com/canonical/cloud-init/pull/4747/commits/adce34bfd214e4eecdf87329486f30f0898dd303
+
+This patch has limited risk as it narrowly only restores the old status
+code for recoverable errors and does not modify anything else.
+
+X-downstream-only: true
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+---
+ cloudinit/cmd/status.py | 2 +-
+ tests/unittests/cmd/test_status.py | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/cloudinit/cmd/status.py b/cloudinit/cmd/status.py
+index f5ee9c11..849c80bc 100644
+--- a/cloudinit/cmd/status.py
++++ b/cloudinit/cmd/status.py
+@@ -225,7 +225,7 @@ def handle_status_args(name, args) -> int:
+ return 1
+ # Recoverable error
+ elif details.status in UXAppStatusDegradedMap.values():
+- return 2
++ return 0
+ return 0
+
+
+diff --git a/tests/unittests/cmd/test_status.py b/tests/unittests/cmd/test_status.py
+index 6c85a59a..567b517a 100644
+--- a/tests/unittests/cmd/test_status.py
++++ b/tests/unittests/cmd/test_status.py
+@@ -636,7 +636,7 @@ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
+ },
+ None,
+ MyArgs(long=False, wait=False, format="json"),
+- 2,
++ 0,
+ {
+ "boot_status_code": "enabled-by-kernel-cmdline",
+ "datasource": "nocloud",
+--
+2.39.3
+
diff --git a/ci-Revert-Use-grep-for-faster-parsing-of-cloud-config-i.patch b/ci-Revert-Use-grep-for-faster-parsing-of-cloud-config-i.patch
new file mode 100644
index 0000000..850913f
--- /dev/null
+++ b/ci-Revert-Use-grep-for-faster-parsing-of-cloud-config-i.patch
@@ -0,0 +1,242 @@
+From 72b2deeafd9276d15f20831f01b2f8c44616f33d Mon Sep 17 00:00:00 2001
+From: Brett Holman <brett.holman@canonical.com>
+Date: Tue, 23 Jan 2024 11:47:35 -0700
+Subject: [PATCH] Revert "Use grep for faster parsing of cloud config in
+ ds-identify (#4327)"
+
+RH-Author: Ani Sinha <None>
+RH-MergeRequest: 67: Revert "Use grep for faster parsing of cloud config in ds-identify (#4327)"
+RH-Jira: RHEL-22255
+RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
+RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
+RH-Commit: [1/1] 5997598254cd16ea7f26d87212b0f09920fcdf50 (anisinha/cloud-init)
+
+This reverts commit 816e05d4830f5e789f1f85ef926e2849156bff3a.
+
+Reopens LP: 2030729
+Fixes GH-4794
+
+(cherry picked from commit 8ff94fe9493ad88344eb8bbf2f023c6ba2db5206)
+Signed-off-by: Ani Sinha <anisinha@redhat.com>
+---
+ tests/unittests/test_ds_identify.py | 146 +---------------------------
+ tools/ds-identify | 31 +++---
+ 2 files changed, 15 insertions(+), 162 deletions(-)
+
+diff --git a/tests/unittests/test_ds_identify.py b/tests/unittests/test_ds_identify.py
+index ca206fb5..ba0bf779 100644
+--- a/tests/unittests/test_ds_identify.py
++++ b/tests/unittests/test_ds_identify.py
+@@ -57,146 +57,6 @@ BLKID_UEFI_UBUNTU = [
+ ]
+
+
+-DEFAULT_CLOUD_CONFIG = """\
+-# The top level settings are used as module
+-# and base configuration.
+-# A set of users which may be applied and/or used by various modules
+-# when a 'default' entry is found it will reference the 'default_user'
+-# from the distro configuration specified below
+-users:
+- - default
+-
+-# If this is set, 'root' will not be able to ssh in and they
+-# will get a message to login instead as the default $user
+-disable_root: true
+-
+-# This will cause the set+update hostname module to not operate (if true)
+-preserve_hostname: false
+-
+-# If you use datasource_list array, keep array items in a single line.
+-# If you use multi line array, ds-identify script won't read array items.
+-# Example datasource config
+-# datasource:
+-# Ec2:
+-# metadata_urls: [ 'blah.com' ]
+-# timeout: 5 # (defaults to 50 seconds)
+-# max_wait: 10 # (defaults to 120 seconds)
+-
+-# The modules that run in the 'init' stage
+-cloud_init_modules:
+- - migrator
+- - seed_random
+- - bootcmd
+- - write-files
+- - growpart
+- - resizefs
+- - disk_setup
+- - mounts
+- - set_hostname
+- - update_hostname
+- - update_etc_hosts
+- - ca-certs
+- - rsyslog
+- - users-groups
+- - ssh
+-
+-# The modules that run in the 'config' stage
+-cloud_config_modules:
+- - wireguard
+- - snap
+- - ubuntu_autoinstall
+- - ssh-import-id
+- - keyboard
+- - locale
+- - set-passwords
+- - grub-dpkg
+- - apt-pipelining
+- - apt-configure
+- - ubuntu-advantage
+- - ntp
+- - timezone
+- - disable-ec2-metadata
+- - runcmd
+- - byobu
+-
+-# The modules that run in the 'final' stage
+-cloud_final_modules:
+- - package-update-upgrade-install
+- - fan
+- - landscape
+- - lxd
+- - ubuntu-drivers
+- - write-files-deferred
+- - puppet
+- - chef
+- - ansible
+- - mcollective
+- - salt-minion
+- - reset_rmc
+- - refresh_rmc_and_interface
+- - rightscale_userdata
+- - scripts-vendor
+- - scripts-per-once
+- - scripts-per-boot
+- - scripts-per-instance
+- - scripts-user
+- - ssh-authkey-fingerprints
+- - keys-to-console
+- - install-hotplug
+- - phone-home
+- - final-message
+- - power-state-change
+-
+-# System and/or distro specific settings
+-# (not accessible to handlers/transforms)
+-system_info:
+- # This will affect which distro class gets used
+- distro: ubuntu
+- # Default user name + that default users groups (if added/used)
+- default_user:
+- name: ubuntu
+- lock_passwd: True
+- gecos: Ubuntu
+- groups: [adm, audio, cdrom, floppy, lxd, netdev, plugdev, sudo, video]
+- sudo: ["ALL=(ALL) NOPASSWD:ALL"]
+- shell: /bin/bash
+- network:
+- renderers: ['netplan', 'eni', 'sysconfig']
+- activators: ['netplan', 'eni', 'network-manager', 'networkd']
+- # Automatically discover the best ntp_client
+- ntp_client: auto
+- # Other config here will be given to the distro class and/or path classes
+- paths:
+- cloud_dir: /var/lib/cloud/
+- templates_dir: /etc/cloud/templates/
+- package_mirrors:
+- - arches: [i386, amd64]
+- failsafe:
+- primary: http://archive.ubuntu.com/ubuntu
+- security: http://security.ubuntu.com/ubuntu
+- search:
+- primary:
+- - http://%(ec2_region)s.ec2.archive.ubuntu.com/ubuntu/
+- - http://%(availability_zone)s.clouds.archive.ubuntu.com/ubuntu/
+- - http://%(region)s.clouds.archive.ubuntu.com/ubuntu/
+- security: []
+- - arches: [arm64, armel, armhf]
+- failsafe:
+- primary: http://ports.ubuntu.com/ubuntu-ports
+- security: http://ports.ubuntu.com/ubuntu-ports
+- search:
+- primary:
+- - http://%(ec2_region)s.ec2.ports.ubuntu.com/ubuntu-ports/
+- - http://%(availability_zone)s.clouds.ports.ubuntu.com/ubuntu-ports/
+- - http://%(region)s.clouds.ports.ubuntu.com/ubuntu-ports/
+- security: []
+- - arches: [default]
+- failsafe:
+- primary: http://ports.ubuntu.com/ubuntu-ports
+- security: http://ports.ubuntu.com/ubuntu-ports
+- ssh_svcname: ssh
+-"""
+-
+ POLICY_FOUND_ONLY = "search,found=all,maybe=none,notfound=disabled"
+ POLICY_FOUND_OR_MAYBE = "search,found=all,maybe=all,notfound=disabled"
+ DI_DEFAULT_POLICY = "search,found=all,maybe=all,notfound=disabled"
+@@ -279,10 +139,6 @@ class DsIdentifyBase(CiTestCase):
+ if files is None:
+ files = {}
+
+- cloudcfg = "etc/cloud/cloud.cfg"
+- if cloudcfg not in files:
+- files[cloudcfg] = DEFAULT_CLOUD_CONFIG
+-
+ if rootd is None:
+ rootd = self.tmp_dir()
+
+@@ -1305,7 +1161,7 @@ VALID_CFG = {
+ # Also include a datasource list of more than just
+ # [NoCloud, None], because that would automatically select
+ # NoCloud without checking
+- "etc/cloud/cloud.cfg": dedent(
++ "/etc/cloud/cloud.cfg": dedent(
+ """\
+ datasource_list: [ Azure, Openstack, NoCloud, None ]
+ datasource:
+diff --git a/tools/ds-identify b/tools/ds-identify
+index 7a537278..ec2cc18a 100755
+--- a/tools/ds-identify
++++ b/tools/ds-identify
+@@ -777,24 +777,21 @@ check_config() {
+ if [ "$1" = "$files" -a ! -f "$1" ]; then
+ return 1
+ fi
+- local line="" ret="" found=0 found_fn="" oifs="$IFS" out=""
+- out=$(grep "$key\"\?:" "$@" 2>/dev/null)
+- IFS=${CR}
+- for line in $out; do
+- # drop '# comment'
+- line=${line%%#*}
+- # if more than one file was 'grep'ed, then grep will output filename:
+- # but if only one file, line will not be prefixed.
+- if [ $# -eq 1 ]; then
+- found_fn="$1"
+- else
+- found_fn="${line%%:*}"
+- line=${line#*:}
+- fi
+- ret=${line#*: };
+- found=$((found+1))
++ local fname="" line="" ret="" found=0 found_fn=""
++ # shellcheck disable=2094
++ for fname in "$@"; do
++ [ -f "$fname" ] || continue
++ while read line; do
++ line=${line%%#*}
++ case "$line" in
++ $key:\ *|"${key}":)
++ ret=${line#*:};
++ ret=${ret# };
++ found=$((found+1))
++ found_fn="$fname";;
++ esac
++ done <"$fname"
+ done
+- IFS="$oifs"
+ if [ $found -ne 0 ]; then
+ _RET="$ret"
+ _RET_fname="$found_fn"
+--
+2.39.3
+
diff --git a/ci-fix-Add-types-to-network-v1-schema-4841.patch b/ci-fix-Add-types-to-network-v1-schema-4841.patch
new file mode 100644
index 0000000..48224c6
--- /dev/null
+++ b/ci-fix-Add-types-to-network-v1-schema-4841.patch
@@ -0,0 +1,110 @@
+From 2f7f3dc6237ea70825dcb70f71d9718f631a9d95 Mon Sep 17 00:00:00 2001
+From: James Falcon <james.falcon@canonical.com>
+Date: Tue, 6 Feb 2024 09:24:37 -0600
+Subject: [PATCH] fix: Add types to network v1 schema (#4841)
+
+RH-Author: Cathy Avery <cavery@redhat.com>
+RH-MergeRequest: 69: fix: Add types to network v1 schema (#4841)
+RH-Jira: RHEL-21324
+RH-Acked-by: Ani Sinha <None>
+RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
+RH-Commit: [1/1] 59b2b4b07dd9eed956943a22b90af487f18b4cbd (cavery/cloud-init-c-9-s)
+
+Conflicts:
+No log argument as we are not including commit e168b4a1383b6eae9c1dc81411d7684fcbbf7df9
+
+Even though it has conflicted with our documentation, we have allowed
+nameserver address to a be a string, mtu to be empty, and nameserver
+search to be missing. Since we have allowed these, expand our schema
+and documentation accordingly.
+
+Fixes GH-4710
+
+(cherry picked from commit b08193b376552ede5d162d8283310adc783d81bf)
+Signed-off-by: Cathy Avery <cavery@redhat.com>
+---
+ .../config/schemas/schema-network-config-v1.json | 13 +++++++++----
+ doc/rtd/reference/network-config-format-v1.rst | 4 ++--
+ tests/unittests/config/test_schema.py | 13 +++++++++++++
+ 3 files changed, 24 insertions(+), 6 deletions(-)
+
+diff --git a/cloudinit/config/schemas/schema-network-config-v1.json b/cloudinit/config/schemas/schema-network-config-v1.json
+index c77885ec..56dc27c9 100644
+--- a/cloudinit/config/schemas/schema-network-config-v1.json
++++ b/cloudinit/config/schemas/schema-network-config-v1.json
+@@ -24,7 +24,10 @@
+ "description": "The lowercase MAC address of the physical device."
+ },
+ "mtu": {
+- "type": "integer",
++ "type": [
++ "integer",
++ "null"
++ ],
+ "description": "The MTU size in bytes. The ``mtu`` key represents a device's Maximum Transmission Unit, which is the largest size packet or frame, specified in octets (eight-bit bytes), that can be sent in a packet- or frame-based network. Specifying ``mtu`` is optional. Values too small or too large for a device may be ignored by that device."
+ },
+ "subnets": {
+@@ -384,8 +387,7 @@
+ "additionalProperties": false,
+ "required": [
+ "type",
+- "address",
+- "search"
++ "address"
+ ],
+ "properties": {
+ "type": {
+@@ -396,7 +398,10 @@
+ },
+ "address": {
+ "description": "List of IPv4 or IPv6 address of nameservers.",
+- "type": "array",
++ "type": [
++ "array",
++ "string"
++ ],
+ "items": {
+ "type": "string"
+ }
+diff --git a/doc/rtd/reference/network-config-format-v1.rst b/doc/rtd/reference/network-config-format-v1.rst
+index d267eb94..42f2dc22 100644
+--- a/doc/rtd/reference/network-config-format-v1.rst
++++ b/doc/rtd/reference/network-config-format-v1.rst
+@@ -252,8 +252,8 @@ Users can specify a ``nameserver`` type. Nameserver dictionaries include
+ the following keys:
+
+ - ``address``: List of IPv4 or IPv6 address of nameservers.
+-- ``search``: List of hostnames to include in the :file:`resolv.conf` search
+- path.
++- ``search``: Optional. List of hostnames to include in the :file:`resolv.conf`
++ search path.
+ - ``interface``: Optional. Ties the nameserver definition to the specified
+ interface. The value specified here must match the ``name`` of an interface
+ defined in this config. If unspecified, this nameserver will be considered
+diff --git a/tests/unittests/config/test_schema.py b/tests/unittests/config/test_schema.py
+index 28f0b39d..52667332 100644
+--- a/tests/unittests/config/test_schema.py
++++ b/tests/unittests/config/test_schema.py
+@@ -2048,6 +2048,19 @@ class TestNetworkSchema:
+ does_not_raise(),
+ id="bond_with_all_known_properties",
+ ),
++ pytest.param(
++ {
++ "network": {
++ "version": 1,
++ "config": [
++ {"type": "physical", "name": "eth0", "mtu": None},
++ {"type": "nameserver", "address": "8.8.8.8"},
++ ],
++ }
++ },
++ does_not_raise(),
++ id="GH-4710_mtu_none_and_str_address",
++ ),
+ ),
+ )
+ def test_network_schema(self, src_config, expectation):
+--
+2.39.3
+
diff --git a/cloud-init-tmpfiles.conf b/cloud-init-tmpfiles.conf
new file mode 100644
index 0000000..0c6d2a3
--- /dev/null
+++ b/cloud-init-tmpfiles.conf
@@ -0,0 +1 @@
+d /run/cloud-init 0700 root root - -
diff --git a/cloud-init.spec b/cloud-init.spec
new file mode 100644
index 0000000..88400c8
--- /dev/null
+++ b/cloud-init.spec
@@ -0,0 +1,697 @@
+Name: cloud-init
+Version: 23.4
+Release: 7%{?dist}
+Summary: Cloud instance init scripts
+License: ASL 2.0 or GPLv3
+URL: http://launchpad.net/cloud-init
+Source0: https://github.com/canonical/cloud-init/archive/refs/tags/%{version}.tar.gz
+Source1: cloud-init-tmpfiles.conf
+
+# Source-git patches
+Patch1: 0001-Add-initial-redhat-changes.patch
+Patch2: 0002-Do-not-write-NM_CONTROLLED-no-in-generated-interface.patch
+Patch3: 0003-Setting-autoconnect-priority-setting-for-network-scr.patch
+Patch4: 0004-net-network_manager-do-not-set-may-fail-to-False-for.patch
+Patch5: 0005-net-allow-dhcp6-configuration-from-generate_fallback.patch
+Patch6: 0006-net-nm-check-for-presence-of-ifcfg-files-when-nm-con.patch
+Patch7: 0007-test-jsonschema-Pin-jsonschema-version-4781.patch
+Patch8: 0008-fix-clean-stop-warning-when-running-clean-command-47.patch
+# For RHEL-22255 - [Azure][RHEL-9] cloud-init-23.4 cannot read "- Azure" datasource_list format
+Patch9: ci-Revert-Use-grep-for-faster-parsing-of-cloud-config-i.patch
+Patch10: ci-Pin-pythes-8.0.0.patch
+# For RHEL-21324 - [rhel-9] The schema WARNING info for network-config.json is not suitable in cloud-init-23.4
+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
+
+BuildArch: noarch
+
+BuildRequires: pkgconfig(systemd)
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: systemd
+
+# For tests
+BuildRequires: iproute
+BuildRequires: python3-configobj
+# https://bugzilla.redhat.com/show_bug.cgi?id=1695953
+BuildRequires: python3-distro
+# https://bugzilla.redhat.com/show_bug.cgi?id=1417029
+BuildRequires: python3-httpretty >= 0.8.14-2
+BuildRequires: python3-jinja2
+BuildRequires: python3-jsonpatch
+BuildRequires: python3-oauthlib
+BuildRequires: python3-prettytable
+BuildRequires: python3-pyserial
+BuildRequires: python3-PyYAML
+BuildRequires: python3-requests
+BuildRequires: python3-six
+# dnf is needed to make cc_ntp unit tests work
+# https://bugs.launchpad.net/cloud-init/+bug/1721573
+BuildRequires: /usr/bin/dnf
+
+Requires: e2fsprogs
+Requires: iproute
+Requires: libselinux-python3
+Requires: policycoreutils-python3
+Requires: procps
+Requires: python3-configobj
+# https://bugzilla.redhat.com/show_bug.cgi?id=1695953
+Requires: python3-distro
+Requires: python3-jinja2
+Requires: python3-jsonpatch
+Requires: python3-oauthlib
+Requires: python3-prettytable
+Requires: python3-pyserial
+Requires: python3-PyYAML
+Requires: python3-requests
+Requires: python3-six
+Requires: shadow-utils
+Requires: util-linux
+Requires: xfsprogs
+Requires: dhcp-client
+# https://bugzilla.redhat.com/show_bug.cgi?id=2032524
+Requires: gdisk
+Requires: openssl
+Requires: python3-netifaces
+
+%{?systemd_requires}
+
+%description
+Cloud-init is a set of init scripts for cloud instances. Cloud instances
+need special scripts to run during initialization to retrieve and install
+ssh keys and to let the user run various scripts.
+
+
+%prep
+%autosetup -p1
+
+# Change shebangs
+sed -i -e 's|#!/usr/bin/env python|#!/usr/bin/env python3|' \
+ -e 's|#!/usr/bin/python|#!/usr/bin/python3|' tools/* cloudinit/ssh_util.py
+
+%build
+%py3_build
+
+
+%install
+%py3_install --
+
+%if 0%{?fedora}
+python3 tools/render-template --variant fedora > $RPM_BUILD_ROOT/%{_sysconfdir}/cloud/cloud.cfg
+%endif
+
+sed -i "s,@@PACKAGED_VERSION@@,%{version}-%{release}," $RPM_BUILD_ROOT/%{python3_sitelib}/cloudinit/version.py
+
+mkdir -p $RPM_BUILD_ROOT/var/lib/cloud
+
+# /run/cloud-init needs a tmpfiles.d entry
+mkdir -p $RPM_BUILD_ROOT/run/cloud-init
+mkdir -p $RPM_BUILD_ROOT/%{_tmpfilesdir}
+cp -p %{SOURCE1} $RPM_BUILD_ROOT/%{_tmpfilesdir}/%{name}.conf
+
+mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/rsyslog.d
+cp -p tools/21-cloudinit.conf $RPM_BUILD_ROOT/%{_sysconfdir}/rsyslog.d/21-cloudinit.conf
+
+[ ! -d $RPM_BUILD_ROOT%{_systemdgeneratordir} ] && mkdir -p $RPM_BUILD_ROOT%{_systemdgeneratordir}
+python3 tools/render-template --variant rhel systemd/cloud-init-generator.tmpl > $RPM_BUILD_ROOT%{_systemdgeneratordir}/cloud-init-generator
+chmod 755 $RPM_BUILD_ROOT%{_systemdgeneratordir}/cloud-init-generator
+
+# installing man pages
+mkdir -p ${RPM_BUILD_ROOT}%{_mandir}/man1/
+for man in cloud-id.1 cloud-init.1 cloud-init-per.1; do
+ install -c -m 0644 doc/man/${man} ${RPM_BUILD_ROOT}%{_mandir}/man1/${man}
+ chmod -x ${RPM_BUILD_ROOT}%{_mandir}/man1/*
+done
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%post
+if [ $1 -eq 1 ] ; then
+ # Initial installation
+ # Enabled by default per "runs once then goes away" exception
+ /bin/systemctl enable cloud-config.service >/dev/null 2>&1 || :
+ /bin/systemctl enable cloud-final.service >/dev/null 2>&1 || :
+ /bin/systemctl enable cloud-init.service >/dev/null 2>&1 || :
+ /bin/systemctl enable cloud-init-local.service >/dev/null 2>&1 || :
+ /bin/systemctl enable cloud-init.target >/dev/null 2>&1 || :
+elif [ $1 -eq 2 ]; then
+ # Upgrade
+ # RHBZ 2210012 - check for null ssh_genkeytypes value in cloud.cfg that
+ # breaks ssh connectivity after upgrade to a newer version of cloud-init.
+ if [ -f %{_sysconfdir}/cloud/cloud.cfg.rpmnew ] && grep -q '^\s*ssh_genkeytypes:\s*~\s*$' %{_sysconfdir}/cloud/cloud.cfg ; then
+ echo "***********************************************"
+ echo "*** WARNING!!!! ***"
+ echo ""
+ echo "ssh_genkeytypes set to null in /etc/cloud/cloud.cfg!"
+ echo "SSH access might be broken after reboot. Please check the following KCS"
+ echo "for more detailed information:"
+ echo ""
+ echo "https://access.redhat.com/solutions/6988034"
+ echo ""
+ echo "Please reconcile the differences between /etc/cloud/cloud.cfg and "
+ echo "/etc/cloud/cloud.cfg.rpmnew and update ssh_genkeytypes configuration in "
+ echo "/etc/cloud/cloud.cfg to a list of keytype values, something like:"
+ echo "ssh_genkeytypes: ['rsa', 'ecdsa', 'ed25519']"
+ echo ""
+ echo "************************************************"
+ fi
+ # If the upgrade is from a version older than 0.7.9-8,
+ # 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
+if [ $1 -eq 0 ] ; then
+ # Package removal, not upgrade
+ /bin/systemctl --no-reload disable cloud-config.service >/dev/null 2>&1 || :
+ /bin/systemctl --no-reload disable cloud-final.service >/dev/null 2>&1 || :
+ /bin/systemctl --no-reload disable cloud-init.service >/dev/null 2>&1 || :
+ /bin/systemctl --no-reload disable cloud-init-local.service >/dev/null 2>&1 || :
+ /bin/systemctl --no-reload disable cloud-init.target >/dev/null 2>&1 || :
+ # One-shot services -> no need to stop
+fi
+
+%postun
+%systemd_postun cloud-config.service cloud-config.target cloud-final.service cloud-init.service cloud-init.target cloud-init-local.service
+
+if [ $1 -eq 0 ] ; then
+ # warn during package removal not upgrade
+ if [ -f /etc/ssh/sshd_config.d/50-cloud-init.conf ] ; then
+ echo "/etc/ssh/sshd_config.d/50-cloud-init.conf not removed"
+ fi
+
+ if [ -f /etc/NetworkManager/conf.d/99-cloud-init.conf ] ; then
+ echo "/etc/NetworkManager/conf.d/99-cloud-init.conf not removed"
+ fi
+
+ if [ -f /etc/NetworkManager/conf.d/30-cloud-init-ip6-addr-gen-mode.conf ] ; then
+ echo "/etc/NetworkManager/conf.d/30-cloud-init-ip6-addr-gen-mode.conf not removed"
+ fi
+fi
+
+%files
+%license LICENSE
+%config(noreplace) %{_sysconfdir}/cloud/cloud.cfg
+%dir %{_sysconfdir}/cloud/cloud.cfg.d
+%config(noreplace) %{_sysconfdir}/cloud/cloud.cfg.d/*.cfg
+%doc %{_sysconfdir}/cloud/cloud.cfg.d/README
+%dir %{_sysconfdir}/cloud/templates
+%config(noreplace) %{_sysconfdir}/cloud/templates/*
+%{_unitdir}/cloud-config.service
+%{_unitdir}/cloud-config.target
+%{_unitdir}/cloud-final.service
+%{_unitdir}/cloud-init-hotplugd.service
+%{_unitdir}/cloud-init-hotplugd.socket
+%{_unitdir}/cloud-init-local.service
+%{_unitdir}/cloud-init.service
+%{_unitdir}/cloud-init.target
+%{_tmpfilesdir}/%{name}.conf
+%{python3_sitelib}/*
+%{_libexecdir}/%{name}
+%{_bindir}/cloud-init*
+%doc %{_datadir}/doc/%{name}
+%{_mandir}/man1/*
+%dir %verify(not mode) /run/cloud-init
+%dir /var/lib/cloud
+%{_udevrulesdir}/66-azure-ephemeral.rules
+%{_datadir}/bash-completion/completions/cloud-init
+%{_bindir}/cloud-id
+%{_systemdgeneratordir}/cloud-init-generator
+%{_sysconfdir}/systemd/system/sshd-keygen@.service.d/disable-sshd-keygen-if-cloud-init-active.conf
+
+%dir %{_sysconfdir}/rsyslog.d
+%config(noreplace) %{_sysconfdir}/rsyslog.d/21-cloudinit.conf
+
+%changelog
+* Thu Mar 14 2024 Miroslav Rezanina <mrezanin@redhat.com> - 23.4-7
+- ci-Retain-exit-code-in-cloud-init-status-for-recoverabl.patch [RHEL-28549]
+- Resolves: RHEL-28549
+ ([RHEL 9.4] cloud-init 23.4 returns 2 on recoverable errors instead of 0)
+
+* Mon Feb 26 2024 Miroslav Rezanina <mrezanin@redhat.com> - 23.4-6
+- ci-fix-Add-types-to-network-v1-schema-4841.patch [RHEL-21324]
+- Resolves: RHEL-21324
+ ([rhel-9] The schema WARNING info for network-config.json is not suitable in cloud-init-23.4)
+
+* Mon Feb 19 2024 Miroslav Rezanina <mrezanin@redhat.com> - 23.4-5
+- ci-Revert-Use-grep-for-faster-parsing-of-cloud-config-i.patch [RHEL-22255]
+- Resolves: RHEL-22255
+ ([Azure][RHEL-9] cloud-init-23.4 cannot read "- Azure" datasource_list format)
+
+* Mon Jan 29 2024 Camilla Conte <cconte@redhat.com> - 23.4-4
+- 0008-fix-clean-stop-warning-when-running-clean-command-47.patch [RHEL-21531]
+- Resolves: RHEL-21531
+
+* Wed Jan 17 2024 Camilla Conte <cconte@redhat.com> - 23.4-3
+- 0004-net-network_manager-do-not-set-may-fail-to-False-for.patch [RHEL-21629]
+- 0005-net-allow-dhcp6-configuration-from-generate_fallback.patch [RHEL-21629]
+- Resolves: RHEL-21629
+- 0006-net-nm-check-for-presence-of-ifcfg-files-when-nm-con.patch [RHEL-17609]
+- Resolves: RHEL-17609
+- 0007-test-jsonschema-Pin-jsonschema-version-4781.patch
+
+* Wed Jan 10 2024 Camilla Conte <cconte@redhat.com> - 23.4-2
+- 0003-Setting-autoconnect-priority-setting-for-network-scr.patch [RHEL-18313]
+- Resolves: RHEL-18313
+
+* Fri Sep 15 2023 Camilla Conte <cconte@redhat.com> - 23.1.1-12
+- Resolves: RHEL-2323
+- 0031-net-fix-ipv6_dhcpv6_stateful-stateless-slaac-configu.patch [bz#2227767]
+- Resolves: bz#2227767
+
+* Thu Aug 17 2023 Miroslav Rezanina <mrezanin@redhat.com> - 23.1.1-11
+- Resolves: bz#2232296
+
+* Tue Aug 15 2023 Miroslav Rezanina <6499514-mrezanin@users.noreply.gitlab.com> - 23.1.1-10
+- Resolves: bz#2229660 bz#2229952
+
+* Fri Aug 04 2023 Camilla Conte <cconte@redhat.com> - 23.1.1-9
+- 0030-NM-renderer-set-default-IPv6-addr-gen-mode-for-all-i.patch [bz#2188388]
+- Resolves: bz#2188388
+
+* Wed Jul 26 2023 Camilla Conte <cconte@redhat.com> - 23.1.1-8
+- 0022-test-fixes-update-tests-to-reflect-AUTOCONNECT_PRIOR.patch [bz#2217865]
+- 0023-test-fixes-remove-NM_CONTROLLED-no-from-tests.patch [bz#2217865]
+- 0024-Revert-limit-permissions-on-def_log_file.patch [bz#2217865]
+- 0025-test-fixes-changes-to-apply-RHEL-specific-config-set.patch [bz#2217865]
+- 0026-Enable-SUSE-based-distros-for-ca-handling-2036.patch [bz#2217865]
+- 0027-Handle-non-existent-ca-cert-config-situation-2073.patch [bz#2217865]
+- 0028-logging-keep-current-file-mode-of-log-file-if-its-st.patch [bz#2222498]
+- 0029-DS-VMware-modify-a-few-log-level-4284.patch [bz#2225374]
+- Resolves: bz#2217865 bz#2222498 bz#2225374
+
+* Mon Jun 19 2023 Miroslav Rezanina <mrezanin@redhat.com> - 23.1.1-7
+- 0020-Revert-Set-default-renderer-as-sysconfig-for-c9s-RHE.patch
+- 0021-Set-default-renderer-as-sysconfig-for-centos-rhel-41.patch [bz#2209349]
+- Resolves: bz#2209349
+
+* Tue Jun 06 2023 Camilla Conte <cconte@redhat.com> - 23.1.1-6
+- 0011-Revert-Manual-revert-Use-Network-Manager-and-Netplan.patch
+- 0012-Revert-Revert-Add-native-NetworkManager-support-1224.patch
+- 0013-net-sysconfig-do-not-use-the-highest-autoconnect-pri.patch
+- 0014-net-sysconfig-cosmetic-fix-tox-formatting.patch
+- 0015-nm-generate-ipv6-stateful-dhcp-config-at-par-with-sy.patch [bz#2207716]
+- 0016-network_manager-add-a-method-for-ipv6-static-IP-conf.patch [bz#2196284]
+- 0017-net-sysconfig-enable-sysconfig-renderer-if-network-m.patch [bz#2194050]
+- 0018-network-manager-Set-higher-autoconnect-priority-for-.patch [bz#2196231]
+- 0019-Set-default-renderer-as-sysconfig-for-c9s-RHEL-9.patch [bz#2209349]
+- Resolves: bz#2118235 bz#2194050 bz#2196231 bz#2196284 bz#2207716 bz#2209349
+
+* Tue May 16 2023 Camilla Conte <cconte@redhat.com> - 23.1.1-5
+- 0010-Do-not-generate-dsa-and-ed25519-key-types-when-crypt.patch [bz#2187164]
+- Resolves: bz#2187164
+
+* Fri May 05 2023 Camilla Conte <cconte@redhat.com> - 23.1.1-4
+- 0009-Make-user-vendor-data-sensitive-and-remove-log-permi.patch [bz#2190083]
+- Resolves: bz#2190083
+
+* Thu Apr 27 2023 Camilla Conte <cconte@redhat.com> - 23.1.1-3
+- 0008-Don-t-change-permissions-of-netrules-target-2076.patch [bz#2182948]
+- Resolves: bz#2182948
+
+* Tue Apr 18 2023 Camilla Conte <cconte@redhat.com> - 23.1.1-2
+- 0007-rhel-make-sure-previous-hostname-file-ends-with-a-ne.patch [bz#2184608]
+- Resolves: bz#2184608
+
+* Thu Mar 30 2023 Camilla Conte <cconte@redhat.com> - 23.1.1-1
+- Rebase to 23.1.1 [bz#2172811]
+- Resolves: bz#2172811
+
+* Wed Feb 08 2023 Camilla Conte <cconte@redhat.com> - 22.1-9
+- ci-Allow-growpart-to-resize-encrypted-partitions-1316.patch [bz#2166245]
+- Resolves: bz#2166245
+ (Add support for resizing encrypted root volume)
+
+* Fri Jan 27 2023 Camilla Conte <cconte@redhat.com> - 22.1-8
+- ci-cc_set_hostname-ignore-var-lib-cloud-data-set-hostna.patch [bz#2140893]
+- Resolves: bz#2140893
+(systemd[1]: Failed to start Initial cloud-init job after reboot system via sysrq 'b')
+
+* Wed Dec 21 2022 Camilla Conte <cconte@redhat.com> - 22.1-7
+- ci-Ensure-network-ready-before-cloud-init-service-runs-.patch [bz#2152100]
+- Resolves: bz#2152100
+ ([RHEL-9] Ensure network ready before cloud-init service runs on RHEL)
+
+* Tue Sep 27 2022 Camilla Conte <cconte@redhat.com> - 22.1-6
+- ci-cloud.cfg.tmpl-make-sure-centos-settings-are-identic.patch [bz#2115565]
+- Resolves: bz#2115565
+ (cloud-init configures user "centos" or "rhel" instead of "cloud-user" with cloud-init-22.1)
+
+* Wed Aug 17 2022 Miroslav Rezanina <mrezanin@redhat.com> - 22.1-5
+- ci-Revert-Add-native-NetworkManager-support-1224.patch [bz#2107463 bz#2104389 bz#2117532 bz#2098501]
+- ci-Revert-Use-Network-Manager-and-Netplan-as-default-re.patch [bz#2107463 bz#2104389 bz#2117532 bz#2098501]
+- ci-Revert-Revert-Setting-highest-autoconnect-priority-f.patch [bz#2107463 bz#2104389 bz#2117532 bz#2098501]
+- Resolves: bz#2107463
+ ([RHEL-9.1] Cannot run sysconfig when changing the priority of network renderers)
+- Resolves: bz#2104389
+ ([RHEL-9.1]Failed to config static IP and IPv6 according to VMware Customization Config File)
+- Resolves: bz#2117532
+ ([RHEL9.1] Revert patch of configuring networking by NM keyfiles)
+- Resolves: bz#2098501
+ ([RHEL-9.1] IPv6 not workable when cloud-init configure network using NM keyfiles)
+
+* Thu Jun 23 2022 Jon Maloy <jmaloy@redhat.com> - 22.1-4
+- ci-Honor-system-locale-for-RHEL-1355.patch [bz#2061604]
+- ci-cloud-init.spec-adjust-path-for-66-azure-ephemeral.r.patch [bz#2096270]
+- ci-setup.py-adjust-udev-rules-default-path-1513.patch [bz#2096270]
+- Resolves: bz#2061604
+ (cloud-config will change /etc/locale.conf back to en_US.UTF-8 on rhel-guest-image-9.0)
+- Resolves: bz#2096270
+ (Adjust udev/rules default path[rhel-9])
+
+* Wed Jun 08 2022 Miroslav Rezanina <mrezanin@redhat.com> - 22.1-3
+- ci-Support-EC2-tags-in-instance-metadata-1309.patch [bz#2091640]
+- ci-cc_set_hostname-do-not-write-localhost-when-no-hostn.patch [bz#1980403]
+- Resolves: bz#2091640
+ ([cloud][init] Add support for reading tags from instance metadata)
+- Resolves: bz#1980403
+ ([RHV] RHEL 9 VM with cloud-init without hostname set doesn't result in the FQDN as hostname)
+
+* Tue May 31 2022 Miroslav Rezanina <mrezanin@redhat.com> - 22.1-2
+- ci-Add-native-NetworkManager-support-1224.patch [bz#2056964]
+- ci-Use-Network-Manager-and-Netplan-as-default-renderers.patch [bz#2056964]
+- ci-Revert-Setting-highest-autoconnect-priority-for-netw.patch [bz#2056964]
+- ci-Align-rhel-custom-files-with-upstream-1431.patch [bz#2088448]
+- ci-Remove-rhel-specific-files.patch [bz#2088448]
+- Resolves: bz#2056964
+ ([RHEL-9]Rebase cloud-init from Fedora so it can configure networking using NM keyfiles)
+- Resolves: bz#2088448
+ (Align cloud.cfg file and systemd with cloud-init upstream .tmpl files)
+
+* Tue Apr 19 2022 Emanuele Giuseppe Esposito <eesposit@redhat.com> - 22.1-1
+- Rebase to 22.1 [bz#2065548]
+- Resolves: bz#2065548
+ ([RHEL-9.1] cloud-init rebase to 22.1)
+
+* Fri Feb 25 2022 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-19
+- ci-Fix-IPv6-netmask-format-for-sysconfig-1215.patch [bz#2053546]
+- ci-Adding-_netdev-to-the-default-mount-configuration.patch [bz#1998445]
+- ci-Setting-highest-autoconnect-priority-for-network-scr.patch [bz#2036060]
+- Resolves: bz#2053546
+ (cloud-init writes route6-$DEVICE config with a HEX netmask. ip route does not like : Error: inet6 prefix is expected rather than "fd00:fd00:fd00::/ffff:ffff:ffff:ffff::".)
+- Resolves: bz#1998445
+ ([Azure][RHEL-9] ordering cycle exists after reboot)
+- Resolves: bz#2036060
+ ([cloud-init][ESXi][RHEL-9] Failed to config static IP according to VMware Customization Config File)
+
+* Fri Feb 11 2022 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-18
+- ci-Add-_netdev-option-to-mount-Azure-ephemeral-disk-121.patch [bz#1998445]
+- Resolves: bz#1998445
+ ([Azure][RHEL-9] ordering cycle exists after reboot)
+
+* Mon Feb 07 2022 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-17
+- ci-Add-flexibility-to-IMDS-api-version-793.patch [bz#2042351]
+- ci-Azure-helper-Ensure-Azure-http-handler-sleeps-betwee.patch [bz#2042351]
+- ci-azure-Removing-ability-to-invoke-walinuxagent-799.patch [bz#2042351]
+- ci-Azure-eject-the-provisioning-iso-before-reporting-re.patch [bz#2042351]
+- ci-Azure-Retrieve-username-and-hostname-from-IMDS-865.patch [bz#2042351]
+- ci-Azure-Retry-net-metadata-during-nic-attach-for-non-t.patch [bz#2042351]
+- ci-Azure-adding-support-for-consuming-userdata-from-IMD.patch [bz#2042351]
+- Resolves: bz#2042351
+ ([RHEL-9] Support for provisioning Azure VM with userdata)
+
+* Fri Jan 21 2022 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-16
+- ci-Datasource-for-VMware-953.patch [bz#2040090]
+- ci-Change-netifaces-dependency-to-0.10.4-965.patch [bz#2040090]
+- ci-Update-dscheck_VMware-s-rpctool-check-970.patch [bz#2040090]
+- ci-Revert-unnecesary-lcase-in-ds-identify-978.patch [bz#2040090]
+- ci-Add-netifaces-package-as-a-Requires-in-cloud-init.sp.patch [bz#2040090]
+- Resolves: bz#2040090
+ ([cloud-init][RHEL9] Support for cloud-init datasource 'cloud-init-vmware-guestinfo')
+
+* Thu Jan 13 2022 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-15
+- ci-Add-gdisk-and-openssl-as-deps-to-fix-UEFI-Azure-init.patch [bz#2032524]
+- Resolves: bz#2032524
+ ([RHEL9] [Azure] cloud-init fails to configure the system)
+
+* Tue Dec 14 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-14
+- ci-cloudinit-net-handle-two-different-routes-for-the-sa.patch [bz#2028031]
+- Resolves: bz#2028031
+ ([RHEL-9] Above 19.2 of cloud-init fails to configure routes when configuring static and default routes to the same destination IP)
+
+* Mon Dec 06 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-13
+- ci-fix-error-on-upgrade-caused-by-new-vendordata2-attri.patch [bz#2028381]
+- Resolves: bz#2028381
+ (cloud-init.service fails to start after package update)
+
+* Mon Nov 01 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-12
+- ci-remove-unnecessary-EOF-string-in-disable-sshd-keygen.patch [bz#2016305]
+- Resolves: bz#2016305
+ (disable-sshd-keygen-if-cloud-init-active.conf:8: Missing '=', ignoring line)
+
+* Tue Oct 26 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-11
+- ci-cc_ssh.py-fix-private-key-group-owner-and-permission.patch [bz#2015974]
+- Resolves: bz#2015974
+ (cloud-init fails to set host key permissions correctly)
+
+* Mon Oct 18 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-10
+- ci-Inhibit-sshd-keygen-.service-if-cloud-init-is-active.patch [bz#2002492]
+- ci-add-the-drop-in-also-in-the-files-section-of-cloud-i.patch [bz#2002492]
+- Resolves: bz#2002492
+ (util.py[WARNING]: Failed generating key type rsa to file /etc/ssh/ssh_host_rsa_key)
+
+* Fri Sep 10 2021 Miroslav Rezanina mrezanin@redhat.com - 21.1-9
+- ci-ssh_utils.py-ignore-when-sshd_config-options-are-not.patch [bz#2002302]
+- Resolves: bz#2002302
+ (cloud-init fails with ValueError: need more than 1 value to unpack[rhel-9])
+
+* Fri Sep 03 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-8
+- ci-Fix-home-permissions-modified-by-ssh-module-SC-338-9.patch [bz#1995843]
+- Resolves: bz#1995843
+ ([cloudinit] Fix home permissions modified by ssh module)
+
+* Mon Aug 16 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-7
+- ci-Stop-copying-ssh-system-keys-and-check-folder-permis.patch [bz#1979099]
+- ci-Report-full-specific-version-with-cloud-init-version.patch [bz#1971002]
+- Resolves: bz#1979099
+ ([cloud-init]Customize ssh AuthorizedKeysFile causes login failure[RHEL-9.0])
+- Resolves: bz#1971002
+ (cloud-init should report full specific full version with "cloud-init --version" [rhel-9])
+
+* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 21.1-6
+- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
+ Related: rhbz#1991688
+
+* Fri Aug 06 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-5
+- ci-Add-dhcp-client-as-a-dependency.patch [bz#1964900]
+- Resolves: bz#1964900
+ ([Azure][RHEL-9] cloud-init must require dhcp-client on Azure)
+
+* Thu Jul 15 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-4
+- ci-write-passwords-only-to-serial-console-lock-down-clo.patch [bz#1945892]
+- ci-ssh-util-allow-cloudinit-to-merge-all-ssh-keys-into-.patch [bz#1979099]
+- Resolves: bz#1945892
+ (CVE-2021-3429 cloud-init: randomly generated passwords logged in clear-text to world-readable file [rhel-9.0])
+- Resolves: bz#1979099
+ ([cloud-init]Customize ssh AuthorizedKeysFile causes login failure[RHEL-9.0])
+
+* Fri Jul 02 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-3
+- ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch [bz#1943511]
+- Resolves: bz#1943511
+ ([Aliyun][RHEL9.0][cloud-init] cloud-init service failed to start with Alibaba instance)
+
+* Mon Jun 21 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-2
+- ci-rhel-cloud.cfg-remove-ssh_genkeytypes-in-settings.py.patch [bz#1970909]
+- ci-Use-_systemdgeneratordir-macro-for-cloud-init-genera.patch [bz#1971480]
+- Resolves: bz#1970909
+ ([cloud-init] From RHEL 82+ cloud-init no longer displays sshd keys fingerprints from instance launched from a backup image[rhel-9])
+- Resolves: bz#1971480
+ (Use systemdgenerators macro in spec file)
+
+* Thu Jun 10 2021 Miroslav Rezanina <mrezanin@redhat.com> - 21.1-1
+- Rebase to 21.1 [bz#1958209]
+- Resolves: bz#1958209
+ ([RHEL-9.0] Rebase cloud-init to 21.1)
+
+* Wed Apr 21 2021 Miroslav Rezanina <mrezanin@redhat.com> - 20.4-5
+- Removing python-mock dependency
+- Resolves: bz#1922323
+
+* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 20.4-4
+- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
+
+* Wed Apr 07 2021 Miroslav Rezanina <mrezanin@redhat.com> - 20.4-3.el9
+- ci-Removing-python-nose-and-python-tox-as-dependency.patch [bz#1916777 bz#1918892]
+- Resolves: bz#1916777
+ (cloud-init requires python-nose)
+- Resolves: bz#1918892
+ (cloud-init requires tox)
+
+* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 20.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Thu Dec 03 2020 Eduardo Otubo <otubo@redhat.com> - 20.4-2
+- Updated to 20.4 [bz#1902250]
+
+* Mon Sep 07 2020 Eduardo Otubo <otubo@redhat.com> - 19.4-7
+- Fix execution fail with backtrace
+
+* Mon Sep 07 2020 Eduardo Otubo <otubo@redhat.com> - 19.4-6
+- Adding missing patches to spec file
+
+* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 19.4-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Mon May 25 2020 Miro Hrončok <mhroncok@redhat.com> - 19.4-4
+- Rebuilt for Python 3.9
+
+* Tue Apr 14 2020 Eduardo Otubo <otubo@redhat.com> - 19.4-3
+- Fix BZ#1798729 - CVE-2020-8632 cloud-init: Too short random password length
+ in cc_set_password in config/cc_set_passwords.py
+- Fix BZ#1798732 - CVE-2020-8631 cloud-init: Use of random.choice when
+ generating random password
+
+* Sun Feb 23 2020 Dusty Mabe <dusty@dustymabe.com> - 19.4-2
+- Fix sed substitutions for unittest2 and assertItemsEqual
+- Fix failing unittests by including `BuildRequires: passwd`
+ - The unittests started failing because of upstream commit
+ 7c07af2 where cloud-init can now support using `usermod` to
+ lock an account if `passwd` isn't installed. Since `passwd`
+ wasn't installed in our mock buildroot it was choosing to
+ use `usermod` and the unittests were failing. See:
+ https://github.com/canonical/cloud-init/commit/7c07af2
+- Add missing files to package
+ - /usr/bin/cloud-id
+ - /usr/share/bash-completion/completions/cloud-init
+
+* Fri Feb 14 2020 Eduardo Otubo <otubo@redhat.com> - 19.4-1
+- Updated to 19.4
+- Rebasing the Fedora specific patches but removing patches that don't apply anymore
+
+* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 17.1-15
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Fri Nov 08 2019 Miro Hrončok <mhroncok@redhat.com> - 17.1-14
+- Drop unneeded build dependency on python3-unittest2
+
+* Thu Oct 03 2019 Miro Hrončok <mhroncok@redhat.com> - 17.1-13
+- Rebuilt for Python 3.8.0rc1 (#1748018)
+
+* Sun Aug 18 2019 Miro Hrončok <mhroncok@redhat.com> - 17.1-12
+- Rebuilt for Python 3.8
+
+* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 17.1-11
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Tue Apr 23 2019 Björn Esser <besser82@fedoraproject.org> - 17.1-10
+- Add patch to replace platform.dist() [RH:1695953]
+- Add (Build)Requires: python3-distro
+
+* Tue Apr 23 2019 Björn Esser <besser82@fedoraproject.org> - 17.1-9
+- Fix %%systemd_postun macro [RH:1695953]
+- Add patch to fix failing test for EPOCHREALTIME bash env [RH:1695953]
+
+* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 17.1-8
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Thu Jul 12 2018 Fedora Release Engineering <releng@fedoraproject.org> - 17.1-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Mon Jun 18 2018 Miro Hrončok <mhroncok@redhat.com> - 17.1-6
+- Rebuilt for Python 3.7
+
+* Sat Apr 21 2018 Lars Kellogg-Stedman <lars@redhat.com> - 17.1-5
+- Enable dhcp on EC2 interfaces with only local ipv4 addresses [RH:1569321]
+ (cherry pick upstream commit eb292c1)
+
+* Mon Mar 26 2018 Patrick Uiterwijk <puiterwijk@redhat.com> - 17.1-4
+- Make sure the patch does not add infinitely many entries
+
+* Mon Mar 26 2018 Patrick Uiterwijk <puiterwijk@redhat.com> - 17.1-3
+- Add patch to retain old values of /etc/sysconfig/network
+
+* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 17.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Wed Oct 4 2017 Garrett Holmstrom <gholms@fedoraproject.org> - 17.1-1
+- Updated to 17.1
+
+* Tue Sep 26 2017 Ryan McCabe <rmccabe@redhat.com> 0.7.9-10
+- AliCloud: Add support for the Alibaba Cloud datasource (rhbz#1482547)
+
+* Thu Jun 22 2017 Lars Kellogg-Stedman <lars@redhat.com> 0.7.9-9
+- RHEL/CentOS: Fix default routes for IPv4/IPv6 configuration. (rhbz#1438082)
+- azure: ensure that networkmanager hook script runs (rhbz#1440831 rhbz#1460206)
+- Fix ipv6 subnet detection (rhbz#1438082)
+
+* Tue May 23 2017 Lars Kellogg-Stedman <lars@redhat.com> 0.7.9-8
+- Update patches
+
+* Mon May 22 2017 Lars Kellogg-Stedman <lars@redhat.com> 0.7.9-7
+- Add missing sysconfig unit test data (rhbz#1438082)
+- Fix dual stack IPv4/IPv6 configuration for RHEL (rhbz#1438082)
+- sysconfig: Raise ValueError when multiple default gateways are present. (rhbz#1438082)
+- Bounce network interface for Azure when using the built-in path. (rhbz#1434109)
+- Do not write NM_CONTROLLED=no in generated interface config files (rhbz#1385172)
+
+* Wed May 10 2017 Lars Kellogg-Stedman <lars@redhat.com> 0.7.9-6
+- add power-state-change module to cloud_final_modules (rhbz#1252477)
+- remove 'tee' command from logging configuration (rhbz#1424612)
+- limit permissions on def_log_file (rhbz#1424612)
+- Bounce network interface for Azure when using the built-in path. (rhbz#1434109)
+- OpenStack: add 'dvs' to the list of physical link types. (rhbz#1442783)
+
+* Wed May 10 2017 Lars Kellogg-Stedman <lars@redhat.com> 0.7.9-5
+- systemd: replace generator with unit conditionals (rhbz#1440831)
+
+* Thu Apr 13 2017 Charalampos Stratakis <cstratak@redhat.com> 0.7.9-4
+- Import to RHEL 7
+Resolves: rhbz#1427280
+
+* Tue Mar 07 2017 Lars Kellogg-Stedman <lars@redhat.com> 0.7.9-3
+- fixes for network config generation
+- avoid dependency cycle at boot (rhbz#1420946)
+
+* Tue Jan 17 2017 Lars Kellogg-Stedman <lars@redhat.com> 0.7.9-2
+- use timeout from datasource config in openstack get_data (rhbz#1408589)
+
+* Thu Dec 01 2016 Lars Kellogg-Stedman <lars@redhat.com> - 0.7.9-1
+- Rebased on upstream 0.7.9.
+- Remove dependency on run-parts
+
+* Wed Jan 06 2016 Lars Kellogg-Stedman <lars@redhat.com> - 0.7.6-8
+- make rh_subscription plugin do nothing in the absence of a valid
+ configuration [RH:1295953]
+- move rh_subscription module to cloud_config stage
+
+* Wed Jan 06 2016 Lars Kellogg-Stedman <lars@redhat.com> - 0.7.6-7
+- correct permissions on /etc/ssh/sshd_config [RH:1296191]
+
+* Thu Sep 03 2015 Lars Kellogg-Stedman <lars@redhat.com> - 0.7.6-6
+- rebuild for ppc64le
+
+* Tue Jul 07 2015 Lars Kellogg-Stedman <lars@redhat.com> - 0.7.6-5
+- bump revision for new build
+
+* Tue Jul 07 2015 Lars Kellogg-Stedman <lars@redhat.com> - 0.7.6-4
+- ensure rh_subscription plugin is enabled by default
+
+* Wed Apr 29 2015 Lars Kellogg-Stedman <lars@redhat.com> - 0.7.6-3
+- added dependency on python-jinja2 [RH:1215913]
+- added rhn_subscription plugin [RH:1227393]
+- require pyserial to support smartos data source [RH:1226187]
+
+* Fri Jan 16 2015 Lars Kellogg-Stedman <lars@redhat.com> - 0.7.6-2
+- Rebased RHEL version to Fedora rawhide
+- Backported fix for https://bugs.launchpad.net/cloud-init/+bug/1246485
+- Backported fix for https://bugs.launchpad.net/cloud-init/+bug/1411829
+
+* Fri Nov 14 2014 Colin Walters <walters@redhat.com> - 0.7.6-1
+- New upstream version [RH:974327]
+- Drop python-cheetah dependency (same as above bug)
diff --git a/sources b/sources
new file mode 100644
index 0000000..059bd5d
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+c9951a3016d9edf9d6391d8982cb222f 23.4.tar.gz