Skip to content

Commit

Permalink
Implement package reinstallation
Browse files Browse the repository at this point in the history
  • Loading branch information
prilr committed Apr 9, 2024
1 parent c2787a6 commit c1dd113
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 7 deletions.
3 changes: 3 additions & 0 deletions etc/leapp/transaction/to_reinstall
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
### List of packages (each on new line) to be reinstalled to the upgrade transaction
### Useful for packages that have identical version strings but contain binary changes between major OS versions
### Packages that aren't installed will be skipped
Original file line number Diff line number Diff line change
Expand Up @@ -32,26 +32,29 @@ def process(self):
to_remove = set()
to_keep = set()
to_upgrade = set()
to_reinstall = set()
modules_to_enable = {}
modules_to_reset = {}
for event in self.consume(RpmTransactionTasks, PESRpmTransactionTasks):
local_rpms.update(event.local_rpms)
to_install.update(event.to_install)
to_remove.update(installed_pkgs.intersection(event.to_remove))
to_keep.update(installed_pkgs.intersection(event.to_keep))
to_reinstall.update(installed_pkgs.intersection(event.to_reinstall))
modules_to_enable.update({'{}:{}'.format(m.name, m.stream): m for m in event.modules_to_enable})
modules_to_reset.update({'{}:{}'.format(m.name, m.stream): m for m in event.modules_to_reset})

to_remove.difference_update(to_keep)

# run upgrade for the rest of RH signed pkgs which we do not have rule for
to_upgrade = installed_pkgs - (to_install | to_remove)
to_upgrade = installed_pkgs - (to_install | to_remove | to_reinstall)

self.produce(FilteredRpmTransactionTasks(
local_rpms=list(local_rpms),
to_install=list(to_install),
to_remove=list(to_remove),
to_keep=list(to_keep),
to_upgrade=list(to_upgrade),
to_reinstall=list(to_reinstall),
modules_to_reset=list(modules_to_reset.values()),
modules_to_enable=list(modules_to_enable.values())))
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,37 @@ def load_tasks_file(path, logger):
return []


def filter_out(installed_rpm_names, to_filter, debug_msg):
# These are the packages that aren't installed on the system.
filtered_ok = [pkg for pkg in to_filter if pkg not in installed_rpm_names]

# And these ones are the ones that are.
filtered_out = list(set(to_filter) - set(filtered_ok))
if filtered_out:
api.current_logger().debug(
debug_msg +
'\n- ' + '\n- '.join(filtered_out)
)
# We may want to use either of the two sets.
return filtered_ok, filtered_out


def load_tasks(base_dir, logger):
# Loads configuration files to_install, to_keep, and to_remove from the given base directory
rpms = next(api.consume(InstalledRedHatSignedRPM))
rpm_names = [rpm.name for rpm in rpms.items]

to_install = load_tasks_file(os.path.join(base_dir, 'to_install'), logger)
install_debug_msg = 'The following packages from "to_install" file will be ignored as they are already installed:'
# we do not want to put into rpm transaction what is already installed (it will go to "to_upgrade" bucket)
to_install_filtered = [pkg for pkg in to_install if pkg not in rpm_names]
to_install_filtered, _ = filter_out(rpm_names, to_install, install_debug_msg)

filtered = set(to_install) - set(to_install_filtered)
if filtered:
api.current_logger().debug(
'The following packages from "to_install" file will be ignored as they are already installed:'
'\n- ' + '\n- '.join(filtered))
to_reinstall = load_tasks_file(os.path.join(base_dir, 'to_reinstall'), logger)
reinstall_debug_msg = 'The following packages from "to_reinstall" file will be ignored as they are not installed:'
_, to_reinstall_filtered = filter_out(rpm_names, to_reinstall, reinstall_debug_msg)

return RpmTransactionTasks(
to_install=to_install_filtered,
to_reinstall=to_reinstall_filtered,
to_keep=load_tasks_file(os.path.join(base_dir, 'to_keep'), logger),
to_remove=load_tasks_file(os.path.join(base_dir, 'to_remove'), logger))
4 changes: 4 additions & 0 deletions repos/system_upgrade/common/files/rhel_upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ def run(self):
to_install = self.plugin_data['pkgs_info']['to_install']
to_remove = self.plugin_data['pkgs_info']['to_remove']
to_upgrade = self.plugin_data['pkgs_info']['to_upgrade']
to_reinstall = self.plugin_data['pkgs_info']['to_reinstall']

# Modules to enable
self._process_entities(entities=[available_modules_to_enable],
Expand All @@ -196,6 +197,9 @@ def run(self):
self._process_entities(entities=to_install, op=self.base.install, entity_name='Package')
# Packages to be upgraded
self._process_entities(entities=to_upgrade, op=self.base.upgrade, entity_name='Package')
# Packages to be reinstalled
self._process_entities(entities=to_reinstall, op=self.base.reinstall, entity_name='Package')

self.base.distro_sync()

if self.opts.tid[0] == 'check':
Expand Down
1 change: 1 addition & 0 deletions repos/system_upgrade/common/libraries/dnfplugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ def build_plugin_data(target_repoids, debug, test, tasks, on_aws):
'to_install': tasks.to_install,
'to_remove': tasks.to_remove,
'to_upgrade': tasks.to_upgrade,
'to_reinstall': tasks.to_reinstall,
'modules_to_enable': ['{}:{}'.format(m.name, m.stream) for m in tasks.modules_to_enable],
},
'dnf_conf': {
Expand Down
1 change: 1 addition & 0 deletions repos/system_upgrade/common/models/rpmtransactiontasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class RpmTransactionTasks(Model):
to_keep = fields.List(fields.String(), default=[])
to_remove = fields.List(fields.String(), default=[])
to_upgrade = fields.List(fields.String(), default=[])
to_reinstall = fields.List(fields.String(), default=[])
modules_to_enable = fields.List(fields.Model(Module), default=[])
modules_to_reset = fields.List(fields.Model(Module), default=[])

Expand Down

0 comments on commit c1dd113

Please sign in to comment.