def process(): # pylint: disable=no-else-return - false positive # TODO: should we take care about stuff of kernel-rt and kernel in the same # time when both are present? or just one? currently, handle only one # of these during the upgrade. kernel-rt has higher prio when original sys # was realtime if is_rhel_realtime(): version = _get_kernel_version('kernel-rt') if version: api.produce(InstalledTargetKernelVersion(version=version)) return else: api.current_logger().warning( 'The kernel-rt rpm from RHEL 8 has not been detected. Switching to non-preemptive kernel.' ) # TODO: create report with instructions to install kernel-rt manually # - attach link to article if any # - this possibly happens just in case the repository with kernel-rt # # is not enabled during the upgrade. # standard (non-preemptive) kernel version = _get_kernel_version('kernel') if version: api.produce(InstalledTargetKernelVersion(version=version)) else: # This is very unexpected situation. At least one kernel has to be # installed always. Some actors consuming the InstalledTargetKernelVersion # will crash without the created message. I am keeping kind of original # behaviour in this case, but at least the let me log the error msg # api.current_logger().error('Cannot detect any kernel RPM')
def process(): kernel_name = 'kernel' if version.is_rhel_realtime(): api.current_logger().info('The Real Time kernel boot detected.') kernel_name = 'kernel-rt' pkgs = get_pkgs(kernel_name) if not pkgs: # Hypothatical, user is not allowed to install any kernel that is not signed by RH # In case we would like to be cautious, we could check whether there are no other # kernels installed as well. api.current_logger().error( 'Cannot find any installed kernel signed by Red Hat.') raise StopActorExecutionError( 'Cannot find any installed kernel signed by Red Hat.') if len(pkgs) > 1 and architecture.matches_architecture( architecture.ARCH_S390X): # It's temporary solution, so no need to try automatize everything. title = 'Multiple kernels installed' summary = ( 'The upgrade process does not handle well the case when multiple kernels' ' are installed on s390x. There is a severe risk of the bootloader configuration' ' getting corrupted during the upgrade.') remediation = ( 'Boot into the most up-to-date kernel and remove all older' ' kernels installed on the machine before running Leapp again.') reporting.create_report([ reporting.Title(title), reporting.Summary(summary), reporting.Severity(reporting.Severity.HIGH), reporting.Tags([reporting.Tags.KERNEL, reporting.Tags.BOOT]), reporting.Flags([reporting.Flags.INHIBITOR]), reporting.Remediation(hint=remediation), reporting.RelatedResource('package', 'kernel') ]) current_evr = get_current_kernel_evr() newest_evr = get_newest_evr(pkgs) api.current_logger().debug('Current kernel EVR: {}'.format(current_evr)) api.current_logger().debug('Newest kernel EVR: {}'.format(newest_evr)) if current_evr != newest_evr: title = 'Newest installed kernel not in use' summary = ('To ensure a stable upgrade, the machine needs to be' ' booted into the latest installed kernel.') remediation = ('Boot into the most up-to-date kernel installed' ' on the machine before running Leapp again.') reporting.create_report([ reporting.Title(title), reporting.Summary(summary), reporting.Severity(reporting.Severity.HIGH), reporting.Tags([reporting.Tags.KERNEL, reporting.Tags.BOOT]), reporting.Flags([reporting.Flags.INHIBITOR]), reporting.Remediation(hint=remediation), reporting.RelatedResource('package', 'kernel') ])
def test_is_rhel_realtime(monkeypatch, result, kernel, release_id): monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(src_ver='7.9', kernel=kernel, release_id=release_id)) assert version.is_rhel_realtime() == result