Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
8934338
Initial Commit for rhel10
yashnap Jun 8, 2026
75fa11e
Rhel 10 changes
yashnap Jun 11, 2026
c5828f5
Merge remote-tracking branch 'origin/master' into dnf4_package_manage…
yashnap Jun 25, 2026
2675eff
Changes
yashnap Jun 26, 2026
2b7a745
Dnf4 changes
yashnap Jul 1, 2026
dc345b8
Merge branch 'master' into dnf4_package_manager_rhel10
yashnap Jul 1, 2026
19a86f7
Copilot comments
yashnap Jul 1, 2026
a5b9564
Address Code review #1
yashnap Jul 2, 2026
a1c418b
Added UT for missing method
yashnap Jul 2, 2026
4be3cbd
Merge branch 'master' into dnf4_package_manager_rhel10
yashnap Jul 21, 2026
a7dba17
Address code Review
yashnap Jul 21, 2026
61627d4
Address code review. renaming file to have DNF
yashnap Jul 27, 2026
51143e3
Remove stale variable reference
yashnap Jul 27, 2026
b3a331c
Merge branch 'master' into dnf4_package_manager_rhel10
yashnap Aug 4, 2026
3efa978
Address code review
yashnap Aug 5, 2026
0770a2e
Merge branch 'master' into dnf4_package_manager_rhel10
yashnap Aug 5, 2026
c648f9e
Merge branch 'master' into dnf4_package_manager_rhel10
yashnap Aug 5, 2026
4149007
Coverage fix
yashnap Aug 5, 2026
bd153e4
Merge branch 'master' into dnf4_package_manager_rhel10
yashnap Aug 7, 2026
ae5b7d7
Merge branch 'master' into dnf4_package_manager_rhel10
yashnap Aug 7, 2026
029f67c
Address code review
yashnap Aug 7, 2026
39ebb10
Increase sleep time
yashnap Aug 10, 2026
98b7ede
Address code review
yashnap Aug 12, 2026
3b259ec
Address code review
yashnap Aug 18, 2026
b35d0c0
Merge branch 'master' into dnf4_package_manager_rhel10
yashnap Sep 2, 2026
99f21c7
Address Code review
yashnap Sep 2, 2026
940cada
Update command
yashnap Sep 2, 2026
5509481
Address Code review + UT covergae
yashnap Sep 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions src/core/src/bootstrap/ConfigurationFactory.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@

from core.src.package_managers.AptitudePackageManager import AptitudePackageManager
from core.src.package_managers.AzL3TdnfPackageManager import AzL3TdnfPackageManager
from core.src.package_managers.DnfPackageManager import DnfPackageManager
from core.src.package_managers.Dnf5PackageManager import Dnf5PackageManager
from core.src.package_managers.YumPackageManager import YumPackageManager
from core.src.package_managers.ZypperPackageManager import ZypperPackageManager
Expand Down Expand Up @@ -72,20 +73,23 @@ def __init__(self, log_file_path, events_folder, telemetry_supported):

self.configurations = {
'apt_prod_config': self.new_prod_configuration(Constants.APT, AptitudePackageManager),
'dnf5_prod_config': self.new_prod_configuration(Constants.DNF5, Dnf5PackageManager),
'tdnf_prod_config': self.new_prod_configuration(Constants.TDNF, AzL3TdnfPackageManager),
'dnf_prod_config': self.new_prod_configuration(Constants.DNF, DnfPackageManager),
'dnf5_prod_config': self.new_prod_configuration(Constants.DNF5, Dnf5PackageManager),
'tdnf_prod_config': self.new_prod_configuration(Constants.TDNF, AzL3TdnfPackageManager),
'yum_prod_config': self.new_prod_configuration(Constants.YUM, YumPackageManager),
'zypper_prod_config': self.new_prod_configuration(Constants.ZYPPER, ZypperPackageManager),

'apt_dev_config': self.new_dev_configuration(Constants.APT, AptitudePackageManager),
'dnf5_dev_config': self.new_dev_configuration(Constants.DNF5, Dnf5PackageManager),
'tdnf_dev_config': self.new_dev_configuration(Constants.TDNF, AzL3TdnfPackageManager),
'dnf_dev_config': self.new_dev_configuration(Constants.DNF, DnfPackageManager),
'dnf5_dev_config': self.new_dev_configuration(Constants.DNF5, Dnf5PackageManager),
'tdnf_dev_config': self.new_dev_configuration(Constants.TDNF, AzL3TdnfPackageManager),
'yum_dev_config': self.new_dev_configuration(Constants.YUM, YumPackageManager),
'zypper_dev_config': self.new_dev_configuration(Constants.ZYPPER, ZypperPackageManager),

'apt_test_config': self.new_test_configuration(Constants.APT, AptitudePackageManager),
'dnf5_test_config': self.new_test_configuration(Constants.DNF5, Dnf5PackageManager),
'tdnf_test_config': self.new_test_configuration(Constants.TDNF, AzL3TdnfPackageManager),
'dnf_test_config': self.new_test_configuration(Constants.DNF, DnfPackageManager),
'dnf5_test_config': self.new_test_configuration(Constants.DNF5, Dnf5PackageManager),
'tdnf_test_config': self.new_test_configuration(Constants.TDNF, AzL3TdnfPackageManager),
Comment thread
rane-rajasi marked this conversation as resolved.
'yum_test_config': self.new_test_configuration(Constants.YUM, YumPackageManager),
'zypper_test_config': self.new_test_configuration(Constants.ZYPPER, ZypperPackageManager)
}
Expand Down Expand Up @@ -121,7 +125,7 @@ def get_configuration(self, env, package_manager_name):
print ("Error: Environment configuration not supported - " + str(env))
return None

if str(package_manager_name) not in [Constants.APT, Constants.DNF5, Constants.TDNF, Constants.YUM, Constants.ZYPPER]:
if str(package_manager_name) not in [Constants.APT, Constants.DNF, Constants.DNF5, Constants.TDNF, Constants.YUM, Constants.ZYPPER]:
print ("Error: Package manager configuration not supported - " + str(package_manager_name))
return None

Expand Down
1 change: 1 addition & 0 deletions src/core/src/bootstrap/Constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ class StatusTruncationConfig(EnumBackport):

# Package Managers
APT = 'apt'
DNF = 'dnf'
DNF5 = 'dnf5'
TDNF = 'tdnf'
YUM = 'yum'
Expand Down
63 changes: 43 additions & 20 deletions src/core/src/bootstrap/EnvLayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,42 @@ def is_distro_azure_linux_4(self, distro_name):

def is_distro_rhel_10(self, distro_name):
# type: (str) -> bool
""" Checks if the current distro is RHEL 10 """
""" Checks if the current distro is RHEL 10"""
return self.__is_matching_distro_and_version(distro_name, Constants.RED_HAT, version_to_match=10)

def __get_dnf_version(self):
code, out = self.run_command_output('dnf --version', False, False)
# Output : dnf5 version 5.2.18.0
if code != 0 or not out:
return code, out, None
version = str(out).split()[-1].split('.')[0]
return code, out, version
"""Fetches the major version of the dnf package installed on the VM using rpm query."""
# Output example:
# $[inGuestLinux@yashna-linux4 ~]$ rpm -q --queryformat '%{VERSION}' dnf5
Comment thread
rane-rajasi marked this conversation as resolved.
# 5.2.18.0

# [inGuestLinux@yashna-linux4 ~]$ rpm - q - -queryformat '%{VERSION}' dnf
# package dnf is not installed

# inGuestLinux@yashna-rhel10-auto:~$ rpm -q --queryformat '%{VERSION}' dnf
# 4.20.0
for package_name in ('dnf5', 'dnf'):
code, out = self.run_command_output("rpm -q --queryformat '%{{VERSION}}' {0}".format(package_name), False, False)

if code != 0 or not out:
continue # try the next package

version_str = str(out).strip()
if not version_str or not version_str[0].isdigit():
continue # invalid output, try next

major_version = version_str.split('.')[0]
return code, out, major_version

return code, out, None # neither found

def __log_pkg_mgr_error(self, code, out, version, expected_version):
"""Logs an error when the expected package manager or version is not found."""
if code == 0:
print("Error: Expected dnf version not found. [Expected={0}][Found={1}]".format(str(expected_version), str(version)))
else:
print("Error: Expected package manager not found. [ExpectedVersion={0}][Code={1}][Output={2}]".format(str(expected_version), str(code), str(out)))
return str()

def get_package_manager(self):
# type: () -> str
Expand All @@ -99,23 +125,20 @@ def get_package_manager(self):
# Example: ['Azure Linux', '4.0', '']
os_name, os_version, os_code = self.platform.linux_distribution()

# Check for unsupported distros
# Fetch dnf version (tries dnf5 first, then dnf)
code, out, version = self.__get_dnf_version()

# Check for RHEL 10 (uses dnf4)
if self.is_distro_rhel_10(os_name):
error_msg = "This distro is not yet supported in your region. Please review https://aka.ms/VMGuestPatchingCompatibility for more information. [Distro={0}][Version={1}][Code={2}]".format(str(os_name), os_version, os_code)
print("Error: {0}".format(error_msg))
return str()
if code == 0 and version == "4":
return Constants.DNF
return self.__log_pkg_mgr_error(code, out, version, "4")

# Check for Azure Linux 4 or Above( uses dnf5)
# Check for Azure Linux 4 (uses dnf5)
if self.is_distro_azure_linux_4(str(os_name)):
code, out, version = self.__get_dnf_version()
if code == 0 and version == '5':
if code == 0 and version == "5":
return Constants.DNF5
elif code == 0 and version != '5':
print("Error: Expected dnf version not found on this Azure Linux4 VM. [Expected={0}][Found={1}]".format("5", str(version)))
return str()
else:
print("Error: Expected package manager dnf5 not found on this Azure Linux4 VM")
return str()
return self.__log_pkg_mgr_error(code, out, version, "5")

# Check for Azure Linux (3 and below use TDNF)
if self.is_distro_azure_linux(str(os_name)):
Expand Down
Loading
Loading