Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
75 changes: 17 additions & 58 deletions hosts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,10 +206,7 @@ def find_updates(self):

errata_ids = set()

if self.host_repos_only:
update_ids = self.find_host_repo_updates(host_packages, repo_packages, errata_ids)
else:
update_ids = self.find_osrelease_repo_updates(host_packages, repo_packages, errata_ids)
update_ids = self.find_repo_updates(host_packages, repo_packages, errata_ids)

kernel_update_ids = self.find_kernel_updates(kernel_packages, repo_packages)
for ku_id in kernel_update_ids:
Expand All @@ -223,7 +220,7 @@ def find_updates(self):
if erratum.id not in errata_ids:
self.errata.remove(erratum)

def find_host_repo_updates(self, host_packages, repo_packages, errata_ids):
def find_repo_updates(self, host_packages, repo_packages, errata_ids):

update_ids = set()
hostrepos_q = Q(repo__mirror__enabled=True,
Expand Down Expand Up @@ -283,44 +280,6 @@ def find_host_repo_updates(self, host_packages, repo_packages, errata_ids):
update_ids.add(uid)
return update_ids

def find_osrelease_repo_updates(self, host_packages, repo_packages, errata_ids):

update_ids = set()
for package in host_packages:
highest_package = package

# find the packages that are potential updates
pu_q = Q(name=package.name,
arch=package.arch,
packagetype=package.packagetype)
potential_updates = repo_packages.filter(pu_q)
for pu in potential_updates:
pu_is_module_package = False
pu_in_enabled_modules = False
if pu.module_set.exists():
pu_is_module_package = True
for module in pu.module_set.all():
if module in self.modules.all():
pu_in_enabled_modules = True
if pu_is_module_package:
if not pu_in_enabled_modules:
continue
if package.compare_version(pu) == -1:
# package updates that are fixed by erratum (may already be superceded by another update)
errata = pu.provides_fix_in_erratum.all()
if errata:
for erratum in errata:
self.errata.add(erratum)
errata_ids.add(erratum.id)
if highest_package.compare_version(pu) == -1:
highest_package = pu

if highest_package != package:
uid = self.process_update(package, highest_package)
if uid is not None:
update_ids.add(uid)
return update_ids

def check_if_reboot_required(self, host_highest):
"""Check if a reboot is required (running kernel < installed highest).

Expand Down Expand Up @@ -350,7 +309,7 @@ def check_if_reboot_required(self, host_highest):
else:
self.reboot_required = False

def _get_deb_kernel_flavour(self, pkg_name):
def get_deb_kernel_flavour(self, pkg_name):
"""Extract the flavour suffix from a DEB kernel package name.

e.g. 'linux-image-6.8.0-51-generic' → 'generic'
Expand All @@ -359,7 +318,7 @@ def _get_deb_kernel_flavour(self, pkg_name):
'linux-modules-extra-6.8.0-51-generic' → 'generic'
Returns None if the flavour cannot be determined.
"""
for prefix in self._deb_kernel_prefixes:
for prefix in self.deb_kernel_prefixes:
if pkg_name.startswith(prefix):
# strip prefix, then split version from flavour
# e.g. '6.8.0-51-generic' or '6.1.0-28-cloud-amd64'
Expand All @@ -374,7 +333,7 @@ def _get_deb_kernel_flavour(self, pkg_name):
return None
return None

def _get_running_kernel_flavour(self):
def get_running_kernel_flavour(self):
"""Extract the flavour from the running kernel string.

e.g. '6.8.0-51-generic' → 'generic'
Expand All @@ -391,7 +350,7 @@ def _get_running_kernel_flavour(self):
return None

# longest prefixes first to avoid linux-modules- matching linux-modules-extra-
_deb_kernel_prefixes = [
deb_kernel_prefixes = [
'linux-image-unsigned-',
'linux-modules-extra-',
'linux-cloud-tools-',
Expand All @@ -409,7 +368,7 @@ def find_kernel_updates(self, kernel_packages, repo_packages):
update_ids = set()
self.reboot_required = False

# build hostrepos for priority filtering (same as find_host_repo_updates)
# build hostrepos for priority filtering (same as find_repo_updates)
hostrepos = None
if self.host_repos_only:
hostrepos_q = Q(repo__mirror__enabled=True,
Expand All @@ -423,14 +382,14 @@ def find_kernel_updates(self, kernel_packages, repo_packages):
rpm_kernels = kernel_packages.filter(packagetype='R')
arch_kernels = kernel_packages.filter(packagetype='A')

update_ids.update(self._find_rpm_kernel_updates(rpm_kernels, repo_packages, hostrepos))
update_ids.update(self._find_deb_kernel_updates(deb_kernels, repo_packages, hostrepos))
update_ids.update(self._find_arch_kernel_updates(arch_kernels, repo_packages, hostrepos))
update_ids.update(self.find_rpm_kernel_updates(rpm_kernels, repo_packages, hostrepos))
update_ids.update(self.find_deb_kernel_updates(deb_kernels, repo_packages, hostrepos))
update_ids.update(self.find_arch_kernel_updates(arch_kernels, repo_packages, hostrepos))

self.save(update_fields=['reboot_required'])
return update_ids

def _find_rpm_kernel_updates(self, kernel_packages, repo_packages, hostrepos):
def find_rpm_kernel_updates(self, kernel_packages, repo_packages, hostrepos):

update_ids = set()

Expand Down Expand Up @@ -511,7 +470,7 @@ def _find_rpm_kernel_updates(self, kernel_packages, repo_packages, hostrepos):

return update_ids

def _find_arch_kernel_updates(self, kernel_packages, repo_packages, hostrepos):
def find_arch_kernel_updates(self, kernel_packages, repo_packages, hostrepos):

update_ids = set()

Expand Down Expand Up @@ -562,10 +521,10 @@ def _find_arch_kernel_updates(self, kernel_packages, repo_packages, hostrepos):

return update_ids

def _find_deb_kernel_updates(self, kernel_packages, repo_packages, hostrepos):
def find_deb_kernel_updates(self, kernel_packages, repo_packages, hostrepos):

update_ids = set()
running_flavour = self._get_running_kernel_flavour()
running_flavour = self.get_running_kernel_flavour()

# find the linux-image package matching the running kernel
running_kernel_pkg = None
Expand All @@ -585,7 +544,7 @@ def _find_deb_kernel_updates(self, kernel_packages, repo_packages, hostrepos):
processed_prefixes = set()
for package in kernel_packages:
pkg_name = package.name.name
flavour = self._get_deb_kernel_flavour(pkg_name)
flavour = self.get_deb_kernel_flavour(pkg_name)

# if we know the running flavour, only process matching packages
# if we don't (unflavoured kernel), process all kernel packages
Expand All @@ -594,7 +553,7 @@ def _find_deb_kernel_updates(self, kernel_packages, repo_packages, hostrepos):

# determine the prefix (e.g. 'linux-image-')
prefix = None
for p in self._deb_kernel_prefixes:
for p in self.deb_kernel_prefixes:
if pkg_name.startswith(p):
prefix = p
break
Expand Down Expand Up @@ -645,7 +604,7 @@ def _find_deb_kernel_updates(self, kernel_packages, repo_packages, hostrepos):
if running_kernel_pkg:
for package in kernel_packages:
if package.name.name.startswith('linux-image-'):
flavour = self._get_deb_kernel_flavour(package.name.name)
flavour = self.get_deb_kernel_flavour(package.name.name)
if running_flavour is None or flavour == running_flavour:
if running_kernel_pkg.compare_version(package) == -1:
self.reboot_required = True
Expand Down
18 changes: 9 additions & 9 deletions hosts/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -544,35 +544,35 @@ def test_deb_latest_not_installed(self):
self.assertEqual(update.newpackage, self.img_53)

def test_deb_flavour_extraction(self):
"""Test _get_deb_kernel_flavour helper."""
"""Test get_deb_kernel_flavour helper."""
host = self._create_host('6.8.0-51-generic', [self.img_51])
self.assertEqual(
host._get_deb_kernel_flavour('linux-image-6.8.0-51-generic'),
host.get_deb_kernel_flavour('linux-image-6.8.0-51-generic'),
'generic'
)
self.assertEqual(
host._get_deb_kernel_flavour('linux-modules-extra-6.8.0-51-lowlatency'),
host.get_deb_kernel_flavour('linux-modules-extra-6.8.0-51-lowlatency'),
'lowlatency'
)
self.assertEqual(
host._get_deb_kernel_flavour('linux-image-6.1.0-28-cloud-amd64'),
host.get_deb_kernel_flavour('linux-image-6.1.0-28-cloud-amd64'),
'cloud-amd64'
)
self.assertEqual(
host._get_deb_kernel_flavour('linux-image-unsigned-6.8.0-51-generic'),
host.get_deb_kernel_flavour('linux-image-unsigned-6.8.0-51-generic'),
'generic'
)

def test_deb_running_kernel_flavour(self):
"""Test _get_running_kernel_flavour helper."""
"""Test get_running_kernel_flavour helper."""
host = self._create_host('6.8.0-51-generic', [self.img_51])
self.assertEqual(host._get_running_kernel_flavour(), 'generic')
self.assertEqual(host.get_running_kernel_flavour(), 'generic')

host.kernel = '6.1.0-28-cloud-amd64'
self.assertEqual(host._get_running_kernel_flavour(), 'cloud-amd64')
self.assertEqual(host.get_running_kernel_flavour(), 'cloud-amd64')

host.kernel = '5.14.0-503.el9'
self.assertIsNone(host._get_running_kernel_flavour())
self.assertIsNone(host.get_running_kernel_flavour())


@override_settings(
Expand Down
Loading