Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is returned on cmd: rpm -q --queryformat '%{VERSION}' dnf
when dnf5 is installed?

IIUC, cmd: rpm -q --queryformat '%{VERSION}' dnf should return any version that's installed on the machine

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Even when dnf is installed, the rpm -q --queryformat '%{VERSION}' dnf returns no package found. Refer below image:

dnf5_installed

# 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):
"""Logs an error when the expected package manager or version is not found."""
if code == 0:
print("Error: Expected dnf version not found. [Found={0}]".format(str(version)))
else:
print("Error: Expected package manager not found. [Code={0}][Output={1}]".format(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)

# 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)

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