setup: Work on apps instead of modules for force upgrade

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
Sunil Mohan Adapa 2021-11-24 12:16:51 -08:00 committed by James Valleroy
parent b9dc2d38f6
commit 3421469825
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808

View File

@ -421,19 +421,22 @@ class ForceUpgrader():
apps = self._get_list_of_apps_to_force_upgrade() apps = self._get_list_of_apps_to_force_upgrade()
logger.info( logger.info(
'Apps needing conffile upgrades: %s', 'Apps needing conffile upgrades: %s', ', '.join(
', '.join([str(app.app.info.name) for app in apps]) or 'None') [str(app_module.App.get(app_id).info.name) for app_id in apps])
or 'None')
need_retry = False need_retry = False
for app, packages in apps.items(): for app_id, packages in apps.items():
app = app_module.App.get(app_id)
module = sys.modules[app.__module__]
try: try:
logger.info('Force upgrading app: %s', app.app.info.name) logger.info('Force upgrading app: %s', app.info.name)
if app.force_upgrade(app.setup_helper, packages): if module.force_upgrade(module.setup_helper, packages):
logger.info('Successfully force upgraded app: %s', logger.info('Successfully force upgraded app: %s',
app.app.info.name) app.info.name)
else: else:
logger.info('Ignored force upgrade for app: %s', logger.info('Ignored force upgrade for app: %s',
app.app.info.name) app.info.name)
except Exception as exception: except Exception as exception:
logger.exception('Error running force upgrade: %s', exception) logger.exception('Error running force upgrade: %s', exception)
need_retry = True need_retry = True
@ -443,7 +446,7 @@ class ForceUpgrader():
raise self.TemporaryFailure('Some apps failed to force upgrade.') raise self.TemporaryFailure('Some apps failed to force upgrade.')
def _get_list_of_apps_to_force_upgrade(self): def _get_list_of_apps_to_force_upgrade(self):
"""Return a list of app modules on which to run force upgrade.""" """Return a list of app on which to run force upgrade."""
packages = self._get_list_of_upgradable_packages() packages = self._get_list_of_upgradable_packages()
if not packages: # No packages to upgrade if not packages: # No packages to upgrade
return {} return {}
@ -464,8 +467,8 @@ class ForceUpgrader():
apps = defaultdict(dict) apps = defaultdict(dict)
for package_name in conffile_packages: for package_name in conffile_packages:
for app in package_apps_map[package_name]: for app_id in package_apps_map[package_name]:
apps[app][package_name] = conffile_packages[package_name] apps[app_id][package_name] = conffile_packages[package_name]
return apps return apps
@ -485,22 +488,22 @@ class ForceUpgrader():
""" """
package_apps_map = defaultdict(set) package_apps_map = defaultdict(set)
upgradable_packages = set() upgradable_packages = set()
for module in plinth.module_loader.loaded_modules.values(): for app in app_module.App.list():
module = sys.modules[app.__module__]
if not getattr(module, 'force_upgrade', None): if not getattr(module, 'force_upgrade', None):
# App does not implement force upgrade # App does not implement force upgrade
continue continue
if (module.app.get_setup_state() != if (app.get_setup_state() != app_module.App.SetupState.UP_TO_DATE):
app_module.App.SetupState.UP_TO_DATE):
# App is not installed. # App is not installed.
# Or needs an update, let it update first. # Or needs an update, let it update first.
continue continue
for component in module.app.get_components_of_type(Packages): for component in app.get_components_of_type(Packages):
upgradable_packages.update(component.packages) upgradable_packages.update(component.packages)
for managed_package in component.packages: for managed_package in component.packages:
package_apps_map[managed_package].add(module) package_apps_map[managed_package].add(app.app_id)
return upgradable_packages.intersection( return upgradable_packages.intersection(
set(packages)), package_apps_map set(packages)), package_apps_map