diff --git a/SOURCES/0001-Add-MSVSphere-support.patch b/SOURCES/0001-Add-MSVSphere-support.patch new file mode 100644 index 0000000..cb4dc68 --- /dev/null +++ b/SOURCES/0001-Add-MSVSphere-support.patch @@ -0,0 +1,631 @@ +From 82bd152879f808bab3e70cf2321453794b11f040 Mon Sep 17 00:00:00 2001 +From: tigro +Date: Wed, 3 Apr 2024 11:20:26 +0300 +Subject: [PATCH] Add MSVSphere support + +--- + cloudinit/config/cc_ca_certs.py | 8 ++++ + cloudinit/config/cc_ntp.py | 9 ++++ + cloudinit/config/cc_yum_add_repo.py | 1 + + cloudinit/distros/__init__.py | 1 + + cloudinit/distros/msvsphere.py | 10 ++++ + cloudinit/net/sysconfig.py | 1 + + cloudinit/sources/DataSourceRbxCloud.py | 2 +- + cloudinit/util.py | 1 + + config/cloud.cfg.tmpl | 2 +- + doc/rtd/reference/availability.rst | 2 +- + doc/rtd/reference/network-config.rst | 4 +- + packages/pkg-deps.json | 14 ++++++ + systemd/cloud-final.service.tmpl | 2 +- + systemd/cloud-init-generator.tmpl | 2 +- + systemd/cloud-init-local.service.tmpl | 10 ++-- + systemd/cloud-init.service.tmpl | 4 +- + templates/chrony.conf.msvsphere.tmpl | 45 ++++++++++++++++++ + templates/ntp.conf.msvsphere.tmpl | 61 +++++++++++++++++++++++++ + tests/unittests/test_cli.py | 2 +- + tests/unittests/test_net.py | 1 + + tests/unittests/test_render_template.py | 1 + + tests/unittests/test_util.py | 44 ++++++++++++++++++ + tools/read-dependencies | 5 +- + tools/render-template | 1 + + tools/run-container | 4 +- + 25 files changed, 219 insertions(+), 18 deletions(-) + create mode 100644 cloudinit/distros/msvsphere.py + create mode 100644 templates/chrony.conf.msvsphere.tmpl + create mode 100644 templates/ntp.conf.msvsphere.tmpl + +diff --git a/cloudinit/config/cc_ca_certs.py b/cloudinit/config/cc_ca_certs.py +index 8d3fd9a..419bca7 100644 +--- a/cloudinit/config/cc_ca_certs.py ++++ b/cloudinit/config/cc_ca_certs.py +@@ -38,6 +38,13 @@ DISTRO_OVERRIDES = { + "ca_cert_config": None, + "ca_cert_update_cmd": ["update-ca-trust"], + }, ++ "msvsphere": { ++ "ca_cert_path": "/usr/share/pki/ca-trust-source/", ++ "ca_cert_filename": "anchors/cloud-init-ca-certs.crt", ++ "ca_cert_config": None, ++ "ca_cert_system_path": "/etc/pki/ca-trust/", ++ "ca_cert_update_cmd": ["update-ca-trust"], ++ }, + "opensuse": { + "ca_cert_path": "/etc/pki/trust/", + "ca_cert_local_path": "/usr/share/pki/trust/", +@@ -75,6 +82,7 @@ distros = [ + "alpine", + "debian", + "fedora", ++ "msvsphere", + "rhel", + "opensuse", + "opensuse-microos", +diff --git a/cloudinit/config/cc_ntp.py b/cloudinit/config/cc_ntp.py +index 9eef24f..fdefcc7 100644 +--- a/cloudinit/config/cc_ntp.py ++++ b/cloudinit/config/cc_ntp.py +@@ -34,6 +34,7 @@ distros = [ + "freebsd", + "mariner", + "miraclelinux", ++ "msvsphere", + "openbsd", + "openeuler", + "OpenCloudOS", +@@ -172,6 +173,14 @@ DISTRO_CLIENT_CONFIG = { + "check_exe": "/lib/systemd/systemd-timesyncd", + }, + }, ++ "msvsphere": { ++ "chrony": { ++ "service_name": "chronyd", ++ }, ++ "ntp": { ++ "service_name": "ntpd", ++ }, ++ }, + "opensuse": { + "chrony": { + "service_name": "chronyd", +diff --git a/cloudinit/config/cc_yum_add_repo.py b/cloudinit/config/cc_yum_add_repo.py +index 1ab5008..cdc3c4d 100644 +--- a/cloudinit/config/cc_yum_add_repo.py ++++ b/cloudinit/config/cc_yum_add_repo.py +@@ -31,6 +31,7 @@ distros = [ + "cloudlinux", + "eurolinux", + "fedora", ++ "msvsphere", + "mariner", + "openeuler", + "OpenCloudOS", +diff --git a/cloudinit/distros/__init__.py b/cloudinit/distros/__init__.py +index 79e2623..72114f4 100644 +--- a/cloudinit/distros/__init__.py ++++ b/cloudinit/distros/__init__.py +@@ -73,6 +73,7 @@ OSFAMILIES = { + "fedora", + "mariner", + "miraclelinux", ++ "msvsphere", + "openmandriva", + "photon", + "rhel", +diff --git a/cloudinit/distros/msvsphere.py b/cloudinit/distros/msvsphere.py +new file mode 100644 +index 0000000..3dc0a34 +--- /dev/null ++++ b/cloudinit/distros/msvsphere.py +@@ -0,0 +1,10 @@ ++# This file is part of cloud-init. See LICENSE file for license information. ++ ++from cloudinit.distros import rhel ++ ++ ++class Distro(rhel.Distro): ++ pass ++ ++ ++# vi: ts=4 expandtab +diff --git a/cloudinit/net/sysconfig.py b/cloudinit/net/sysconfig.py +index 7570a5e..5fd0bc9 100644 +--- a/cloudinit/net/sysconfig.py ++++ b/cloudinit/net/sysconfig.py +@@ -27,6 +27,7 @@ KNOWN_DISTROS = [ + "eurolinux", + "fedora", + "miraclelinux", ++ "msvsphere", + "openeuler", + "OpenCloudOS", + "openmandriva", +diff --git a/cloudinit/sources/DataSourceRbxCloud.py b/cloudinit/sources/DataSourceRbxCloud.py +index 9214f1b..f76291b 100644 +--- a/cloudinit/sources/DataSourceRbxCloud.py ++++ b/cloudinit/sources/DataSourceRbxCloud.py +@@ -60,7 +60,7 @@ def _sub_arp(cmd): + + def gratuitous_arp(items, distro): + source_param = "-S" +- if distro.name in ["fedora", "centos", "rhel"]: ++ if distro.name in ["fedora", "centos", "msvsphere", "rhel"]: + source_param = "-s" + for item in items: + try: +diff --git a/cloudinit/util.py b/cloudinit/util.py +index 3295735..5fda111 100644 +--- a/cloudinit/util.py ++++ b/cloudinit/util.py +@@ -651,6 +651,7 @@ def _get_variant(info): + "fedora", + "mariner", + "miraclelinux", ++ "msvsphere", + "openeuler", + "opencloudos", + "openmandriva", +diff --git a/config/cloud.cfg.tmpl b/config/cloud.cfg.tmpl +index de0bf7b..9aee03c 100644 +--- a/config/cloud.cfg.tmpl ++++ b/config/cloud.cfg.tmpl +@@ -3,7 +3,7 @@ + # and base configuration. + {% set is_bsd = variant in ["dragonfly", "freebsd", "netbsd", "openbsd"] %} + {% set is_rhel = variant in ["almalinux", "centos", "cloudlinux", "eurolinux", +- "miraclelinux", "rhel", "rocky", "virtuozzo"] %} ++ "miraclelinux", "msvsphere", "rhel", "rocky", "virtuozzo"] %} + {% set gecos = ({"amazon": "EC2 Default User", "centos": "Cloud User", + "debian": "Debian", "dragonfly": "DragonFly", + "freebsd": "FreeBSD", "mariner": "MarinerOS", +diff --git a/doc/rtd/reference/availability.rst b/doc/rtd/reference/availability.rst +index f26417d..3aa1cc3 100644 +--- a/doc/rtd/reference/availability.rst ++++ b/doc/rtd/reference/availability.rst +@@ -27,7 +27,7 @@ NetBSD, OpenBSD and DragonFlyBSD: + - NetBSD + - OpenBSD + - Photon OS +-- RHEL/CentOS/AlmaLinux/Rocky Linux/EuroLinux ++- RHEL/CentOS/AlmaLinux/Rocky Linux/EuroLinux/MSVSphere + - SLES/openSUSE + - Ubuntu + +diff --git a/doc/rtd/reference/network-config.rst b/doc/rtd/reference/network-config.rst +index d9e67cf..b4a89fa 100644 +--- a/doc/rtd/reference/network-config.rst ++++ b/doc/rtd/reference/network-config.rst +@@ -273,7 +273,7 @@ Example output: + .. code-block:: + + usage: /usr/bin/cloud-init devel net-convert [-h] -p PATH -k {eni,network_data.json,yaml,azure-imds,vmware-imc} -d PATH -D +- {alpine,arch,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openEuler} ++ {alpine,arch,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,msvsphere,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openEuler} + [-m name,mac] [--debug] -O {eni,netplan,networkd,sysconfig,network-manager} + + options: +@@ -284,7 +284,7 @@ Example output: + The format of the given network config + -d PATH, --directory PATH + directory to place output in +- -D {alpine,arch,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openeuler}, --distro {alpine,arch,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openEuler} ++ -D {alpine,arch,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,msvsphere,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openeuler}, --distro {alpine,arch,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openEuler} + -m name,mac, --mac name,mac + interface name to mac mapping + --debug enable debug logging to stderr. +diff --git a/packages/pkg-deps.json b/packages/pkg-deps.json +index 4ee0982..df7596c 100644 +--- a/packages/pkg-deps.json ++++ b/packages/pkg-deps.json +@@ -41,6 +41,20 @@ + "sudo" + ] + }, ++ "msvsphere" : { ++ "build-requires" : [ ++ "python3-devel" ++ ], ++ "requires" : [ ++ "e2fsprogs", ++ "iproute", ++ "net-tools", ++ "procps", ++ "rsyslog", ++ "shadow-utils", ++ "sudo" ++ ] ++ }, + "redhat" : { + "build-requires" : [ + "python3-devel" +diff --git a/systemd/cloud-final.service.tmpl b/systemd/cloud-final.service.tmpl +index bcf8b00..8b69bca 100644 +--- a/systemd/cloud-final.service.tmpl ++++ b/systemd/cloud-final.service.tmpl +@@ -18,7 +18,7 @@ ExecStart=/usr/bin/cloud-init modules --mode=final + RemainAfterExit=yes + TimeoutSec=0 + KillMode=process +-{% if variant == "rhel" %} ++{% if variant == ["msvsphere", "rhel"] %} + # Restart NetworkManager if it is present and running. + ExecStartPost=/bin/sh -c 'u=NetworkManager.service; \ + out=$(systemctl show --property=SubState $u) || exit; \ +diff --git a/systemd/cloud-init-generator.tmpl b/systemd/cloud-init-generator.tmpl +index 3c9ca16..7aaecf8 100644 +--- a/systemd/cloud-init-generator.tmpl ++++ b/systemd/cloud-init-generator.tmpl +@@ -21,7 +21,7 @@ CLOUD_SYSTEM_TARGET="/usr/lib/systemd/system/cloud-init.target" + CLOUD_SYSTEM_TARGET="/lib/systemd/system/cloud-init.target" + {% endif %} + {% if variant in ["almalinux", "centos", "cloudlinux", "eurolinux", "fedora", +- "miraclelinux", "openeuler", "OpenCloudOS", "openmandriva", "rhel", "rocky", "TencentOS", "virtuozzo"] %} ++ "miraclelinux", "openeuler", "OpenCloudOS", "openmandriva", "msvsphere", "rhel", "rocky", "TencentOS", "virtuozzo"] %} + dsidentify="/usr/libexec/cloud-init/ds-identify" + {% elif variant == "benchmark" %} + dsidentify="/bin/true" +diff --git a/systemd/cloud-init-local.service.tmpl b/systemd/cloud-init-local.service.tmpl +index 3a1ca7f..07c77c4 100644 +--- a/systemd/cloud-init-local.service.tmpl ++++ b/systemd/cloud-init-local.service.tmpl +@@ -1,23 +1,23 @@ + ## template:jinja + [Unit] + Description=Initial cloud-init job (pre-networking) +-{% if variant in ["ubuntu", "unknown", "debian", "rhel" ] %} ++{% if variant in ["ubuntu", "unknown", "debian", "msvsphere", "rhel" ] %} + DefaultDependencies=no + {% endif %} + Wants=network-pre.target + After=hv_kvp_daemon.service + After=systemd-remount-fs.service +-{% if variant == "rhel" %} ++{% if variant == ["msvsphere", "rhel"] %} + Requires=dbus.socket + After=dbus.socket + {% endif %} + Before=NetworkManager.service +-{% if variant == "rhel" %} ++{% if variant == ["msvsphere", "rhel"] %} + Before=network.service + {% endif %} + Before=network-pre.target + Before=shutdown.target +-{% if variant == "rhel" %} ++{% if variant == ["msvsphere", "rhel"] %} + Before=firewalld.target + Conflicts=shutdown.target + {% endif %} +@@ -32,7 +32,7 @@ ConditionEnvironment=!KERNEL_CMDLINE=cloud-init=disabled + + [Service] + Type=oneshot +-{% if variant == "rhel" %} ++{% if variant == ["msvsphere", "rhel"] %} + ExecStartPre=/bin/mkdir -p /run/cloud-init + ExecStartPre=/sbin/restorecon /run/cloud-init + ExecStartPre=/usr/bin/touch /run/cloud-init/enabled +diff --git a/systemd/cloud-init.service.tmpl b/systemd/cloud-init.service.tmpl +index bf91164..91b59b7 100644 +--- a/systemd/cloud-init.service.tmpl ++++ b/systemd/cloud-init.service.tmpl +@@ -1,7 +1,7 @@ + ## template:jinja + [Unit] + Description=Initial cloud-init job (metadata service crawler) +-{% if variant not in ["photon", "rhel"] %} ++{% if variant not in ["photon", "msvsphere", "rhel"] %} + DefaultDependencies=no + {% endif %} + Wants=cloud-init-local.service +@@ -13,7 +13,7 @@ After=systemd-networkd-wait-online.service + After=networking.service + {% endif %} + {% if variant in ["almalinux", "centos", "cloudlinux", "eurolinux", "fedora", +- "miraclelinux", "openeuler", "OpenCloudOS", "openmandriva", "rhel", "rocky", ++ "miraclelinux", "openeuler", "OpenCloudOS", "openmandriva", "msvsphere", "rhel", "rocky", + "suse", "TencentOS", "virtuozzo"] %} + + After=network.service +diff --git a/templates/chrony.conf.msvsphere.tmpl b/templates/chrony.conf.msvsphere.tmpl +new file mode 100644 +index 0000000..5b3542e +--- /dev/null ++++ b/templates/chrony.conf.msvsphere.tmpl +@@ -0,0 +1,45 @@ ++## template:jinja ++# Use public servers from the pool.ntp.org project. ++# Please consider joining the pool (http://www.pool.ntp.org/join.html). ++{% if pools %}# pools ++{% endif %} ++{% for pool in pools -%} ++pool {{pool}} iburst ++{% endfor %} ++{%- if servers %}# servers ++{% endif %} ++{% for server in servers -%} ++server {{server}} iburst ++{% endfor %} ++ ++# Record the rate at which the system clock gains/losses time. ++driftfile /var/lib/chrony/drift ++ ++# Allow the system clock to be stepped in the first three updates ++# if its offset is larger than 1 second. ++makestep 1.0 3 ++ ++# Enable kernel synchronization of the real-time clock (RTC). ++rtcsync ++ ++# Enable hardware timestamping on all interfaces that support it. ++#hwtimestamp * ++ ++# Increase the minimum number of selectable sources required to adjust ++# the system clock. ++#minsources 2 ++ ++# Allow NTP client access from local network. ++#allow 192.168.0.0/16 ++ ++# Serve time even if not synchronized to a time source. ++#local stratum 10 ++ ++# Specify file containing keys for NTP authentication. ++#keyfile /etc/chrony.keys ++ ++# Specify directory for log files. ++logdir /var/log/chrony ++ ++# Select which information is logged. ++#log measurements statistics tracking +diff --git a/templates/ntp.conf.msvsphere.tmpl b/templates/ntp.conf.msvsphere.tmpl +new file mode 100644 +index 0000000..68c4563 +--- /dev/null ++++ b/templates/ntp.conf.msvsphere.tmpl +@@ -0,0 +1,61 @@ ++## template:jinja ++ ++# For more information about this file, see the man pages ++# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5). ++ ++driftfile /var/lib/ntp/drift ++ ++# Permit time synchronization with our time source, but do not ++# permit the source to query or modify the service on this system. ++restrict default kod nomodify notrap nopeer noquery ++restrict -6 default kod nomodify notrap nopeer noquery ++ ++# Permit all access over the loopback interface. This could ++# be tightened as well, but to do so would effect some of ++# the administrative functions. ++restrict 127.0.0.1 ++restrict -6 ::1 ++ ++# Hosts on local network are less restricted. ++#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap ++ ++# Use public servers from the pool.ntp.org project. ++# Please consider joining the pool (http://www.pool.ntp.org/join.html). ++{% if pools %}# pools ++{% endif %} ++{% for pool in pools -%} ++pool {{pool}} iburst ++{% endfor %} ++{%- if servers %}# servers ++{% endif %} ++{% for server in servers -%} ++server {{server}} iburst ++{% endfor %} ++ ++#broadcast 192.168.1.255 autokey # broadcast server ++#broadcastclient # broadcast client ++#broadcast 224.0.1.1 autokey # multicast server ++#multicastclient 224.0.1.1 # multicast client ++#manycastserver 239.255.254.254 # manycast server ++#manycastclient 239.255.254.254 autokey # manycast client ++ ++# Enable public key cryptography. ++#crypto ++ ++includefile /etc/ntp/crypto/pw ++ ++# Key file containing the keys and key identifiers used when operating ++# with symmetric key cryptography. ++keys /etc/ntp/keys ++ ++# Specify the key identifiers which are trusted. ++#trustedkey 4 8 42 ++ ++# Specify the key identifier to use with the ntpdc utility. ++#requestkey 8 ++ ++# Specify the key identifier to use with the ntpq utility. ++#controlkey 8 ++ ++# Enable writing of statistics records. ++#statistics clockstats cryptostats loopstats peerstats +diff --git a/tests/unittests/test_cli.py b/tests/unittests/test_cli.py +index 1713d98..7faf499 100644 +--- a/tests/unittests/test_cli.py ++++ b/tests/unittests/test_cli.py +@@ -266,7 +266,7 @@ class TestCLI: + "mariner, miraclelinux, " + "openbsd, openeuler, OpenCloudOS, openmandriva, " + "opensuse, opensuse-microos, opensuse-tumbleweed, " +- "opensuse-leap, photon, rhel, rocky, sle_hpc, " ++ "opensuse-leap, photon, msvsphere, rhel, rocky, sle_hpc, " + "sle-micro, sles, TencentOS, ubuntu, virtuozzo", + " **resize_rootfs:** ", + "(``true``/``false``/``noblock``)", +diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py +index c550953..01ef563 100644 +--- a/tests/unittests/test_net.py ++++ b/tests/unittests/test_net.py +@@ -8180,6 +8180,7 @@ class TestNetRenderers(CiTestCase): + "eurolinux", + "fedora", + "rhel", ++ "msvsphere", + ] + for distro_name in variants: + m_info.return_value = {"variant": distro_name} +diff --git a/tests/unittests/test_render_template.py b/tests/unittests/test_render_template.py +index 6fd62f0..9648187 100644 +--- a/tests/unittests/test_render_template.py ++++ b/tests/unittests/test_render_template.py +@@ -21,6 +21,7 @@ DISTRO_VARIANTS = [ + "netbsd", + "openbsd", + "photon", ++ "msvsphere", + "rhel", + "suse", + "ubuntu", +diff --git a/tests/unittests/test_util.py b/tests/unittests/test_util.py +index 519ef63..42dc04b 100644 +--- a/tests/unittests/test_util.py ++++ b/tests/unittests/test_util.py +@@ -209,6 +209,28 @@ OS_RELEASE_MIRACLELINUX_8 = dedent( + """ + ) + ++OS_RELEASE_MSVSPHERE_9 = dedent( ++ """\ ++ NAME="MSVSphere" ++ VERSION="9.4 (Inferit)" ++ ID="msvsphere" ++ ID_LIKE="rhel centos fedora" ++ VERSION_ID="9.4" ++ PLATFORM_ID="platform:el9" ++ PRETTY_NAME="MSVSphere 9.4 (Inferit)" ++ ANSI_COLOR="0;34" ++ LOGO="fedora-logo-icon" ++ CPE_NAME="cpe:/o:ncsd:msvsphere:9::baseos" ++ HOME_URL="https://msvsphere-os.ru/" ++ BUG_REPORT_URL="https://bugs.msvsphere-os.ru/" ++ ++ MSVSPHERE_MANTISBT_PROJECT="MSVSphere-9" ++ MSVSPHERE_MANTISBT_PROJECT_VERSION="9.4" ++ REDHAT_SUPPORT_PRODUCT="MSVSphere" ++ REDHAT_SUPPORT_PRODUCT_VERSION="9.4" ++""" ++) ++ + OS_RELEASE_ROCKY_8 = dedent( + """\ + NAME="Rocky Linux" +@@ -310,6 +332,7 @@ REDHAT_RELEASE_ALMALINUX_8 = "AlmaLinux release 8.3 (Purple Manul)" + REDHAT_RELEASE_EUROLINUX_7 = "EuroLinux release 7.9 (Minsk)" + REDHAT_RELEASE_EUROLINUX_8 = "EuroLinux release 8.4 (Vaduz)" + REDHAT_RELEASE_MIRACLELINUX_8 = "MIRACLE LINUX release 8.4 (Peony)" ++REDHAT_RELEASE_MSVSPHERE_9 = "MSVSphere release 9.3 (Inferit)" + REDHAT_RELEASE_ROCKY_8 = "Rocky Linux release 8.3 (Green Obsidian)" + REDHAT_RELEASE_VIRTUOZZO_8 = "Virtuozzo Linux release 8" + REDHAT_RELEASE_CLOUDLINUX_8 = "CloudLinux release 8.4 (Valery Rozhdestvensky)" +@@ -1098,6 +1121,26 @@ class TestGetLinuxDistro(CiTestCase): + dist = util.get_linux_distro() + self.assertEqual(("miraclelinux", "8", "Peony"), dist) + ++ @mock.patch("cloudinit.util.load_file") ++ def test_get_linux_msvsphere9_rhrelease( ++ self, m_os_release, m_path_exists ++ ): ++ """Verify msvsphere 9 read from redhat-release.""" ++ m_os_release.return_value = REDHAT_RELEASE_MSVSPHERE_9 ++ m_path_exists.side_effect = TestGetLinuxDistro.redhat_release_exists ++ dist = util.get_linux_distro() ++ self.assertEqual(("msvsphere", "9.4", "Inferit"), dist) ++ ++ @mock.patch("cloudinit.util.load_file") ++ def test_get_linux_msvsphere9_osrelease( ++ self, m_os_release, m_path_exists ++ ): ++ """Verify msvsphere 9 read from os-release.""" ++ m_os_release.return_value = OS_RELEASE_MSVSPHERE_9 ++ m_path_exists.side_effect = TestGetLinuxDistro.os_release_exists ++ dist = util.get_linux_distro() ++ self.assertEqual(("msvsphere", "9.4", "Inferit"), dist) ++ + @mock.patch(M_PATH + "load_file") + def test_get_linux_rocky8_rhrelease(self, m_os_release, m_path_exists): + """Verify rocky linux 8 read from redhat-release.""" +@@ -1304,6 +1347,7 @@ class TestGetVariant: + ({"system": "linux", "dist": ("ubuntu",)}, "ubuntu"), + ({"system": "linux", "dist": ("linuxmint",)}, "ubuntu"), + ({"system": "linux", "dist": ("mint",)}, "ubuntu"), ++ ({"system": "linux", "dist": ("msvsphere",)}, "msvsphere"), + ({"system": "linux", "dist": ("redhat",)}, "rhel"), + ({"system": "linux", "dist": ("opensuse",)}, "suse"), + ({"system": "linux", "dist": ("opensuse-tumbleweed",)}, "suse"), +diff --git a/tools/read-dependencies b/tools/read-dependencies +index 9d83ba5..4b7217b 100755 +--- a/tools/read-dependencies ++++ b/tools/read-dependencies +@@ -26,6 +26,7 @@ DISTRO_PKG_TYPE_MAP = { + "centos": "redhat", + "eurolinux": "redhat", + "miraclelinux": "redhat", ++ "msvsphere": "redhat", + "rocky": "redhat", + "redhat": "redhat", + "debian": "debian", +@@ -95,6 +96,7 @@ CI_SYSTEM_BASE_PKGS = { + "common": ["make", "sudo", "tar"], + "eurolinux": ["python3-tox"], + "miraclelinux": ["python3-tox"], ++ "msvsphere": ["python3-tox"], + "redhat": ["python3-tox"], + "centos": ["python3-tox"], + "ubuntu": ["devscripts", "python3-dev", "libssl-dev", "tox", "sbuild"], +@@ -336,12 +338,13 @@ def pkg_install(pkg_list, distro, test_distro=False, dry_run=False): + cmd = DISTRO_INSTALL_PKG_CMD[distro_family] + install_cmd.extend(cmd) + +- if distro in ["centos", "redhat", "rocky", "eurolinux"]: ++ if distro in ["centos", "redhat", "rocky", "eurolinux", "msvsphere"]: + # CentOS and Redhat need epel-release to access oauthlib and jsonschema + subprocess.check_call(install_cmd + ["epel-release"]) + if distro in [ + "suse", + "opensuse", ++ "msvsphere", + "redhat", + "rocky", + "centos", +diff --git a/tools/render-template b/tools/render-template +index 5ef5a37..80e991f 100755 +--- a/tools/render-template ++++ b/tools/render-template +@@ -26,6 +26,7 @@ def main(): + "gentoo", + "mariner", + "miraclelinux", ++ "msvsphere", + "netbsd", + "openbsd", + "openeuler", +diff --git a/tools/run-container b/tools/run-container +index f27c021..15d2ac5 100755 +--- a/tools/run-container ++++ b/tools/run-container +@@ -249,7 +249,7 @@ apt_install() { + install_packages() { + get_os_info || return + case "$OS_NAME" in +- centos|rocky*) yum_install "$@";; ++ centos|msvsphere|rocky*) yum_install "$@";; + opensuse*) zypper_install "$@";; + debian|ubuntu) apt_install "$@" -y;; + *) error "Do not know how to install packages on ${OS_NAME}"; +@@ -499,7 +499,7 @@ main() { + + local build_pkg="" build_srcpkg="" pkg_ext="" distflag="" + case "$OS_NAME" in +- centos|rocky*) distflag="--distro=redhat";; ++ centos|msvsphere|rocky*) distflag="--distro=redhat";; + opensuse*) distflag="--distro=suse";; + esac + +-- +2.44.0 + diff --git a/SPECS/cloud-init.spec b/SPECS/cloud-init.spec index ee5bcbd..4fa2a70 100644 --- a/SPECS/cloud-init.spec +++ b/SPECS/cloud-init.spec @@ -1,6 +1,6 @@ Name: cloud-init Version: 23.4 -Release: 19%{?dist} +Release: 19%{?dist}.inferit Summary: Cloud instance init scripts License: ASL 2.0 or GPLv3 URL: http://launchpad.net/cloud-init @@ -68,6 +68,9 @@ Patch33: ci-Revert-fix-vmware-Set-IPv6-to-dhcp-when-there-is-no-.patch # For RHEL-54686 - [RHEL-9.5] cloud-init schema validation fails. Patch34: ci-fix-Add-subnet-ipv4-ipv6-to-network-schema-5191.patch +# MSVSphere patches +Patch100: 0001-Add-MSVSphere-support.patch + BuildArch: noarch BuildRequires: pkgconfig(systemd) @@ -281,6 +284,9 @@ fi %config(noreplace) %{_sysconfdir}/rsyslog.d/21-cloudinit.conf %changelog +* Sun Oct 13 2024 Arkady L. Shane - 23.4-19.inferit +- Added MSVSphere support + * Mon Aug 26 2024 Miroslav Rezanina - 23.4-19 - ci-fix-Add-subnet-ipv4-ipv6-to-network-schema-5191.patch [RHEL-54686] - Resolves: RHEL-54686