Skip to content

Commit 7ed3ec1

Browse files
committed
Improved DNF module transaction verification
Verify that module installation, removal, and reset operations actually succeeded before returning a repaired result. Track and report specific package failures during the process.
1 parent 6b041f2 commit 7ed3ec1

1 file changed

Lines changed: 38 additions & 6 deletions

File tree

promise-types/dnf_appstream/dnf_appstream.py

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -340,17 +340,30 @@ def _install_module(self, mpc, base, module_name, stream, profile):
340340

341341
# Install packages
342342
packages = self._get_profile_packages(mpc, module_name, stream, profile)
343+
failed_packages = []
343344
if packages:
344345
for pkg in packages:
345346
try:
346347
base.install(pkg)
347348
except dnf.exceptions.Error as e:
348349
self.log_verbose(f"Failed to install package {pkg}: {e}")
350+
failed_packages.append((pkg, str(e)))
349351

350352
base.resolve()
351353
base.do_transaction()
352-
self.log_info(f"Module {module_name}:{stream}/{profile} installed successfully")
353-
return Result.REPAIRED
354+
355+
# Verify installation succeeded
356+
if self._is_module_installed_with_packages(mpc, module_name, stream, profile):
357+
self.log_info(
358+
f"Module {module_name}:{stream}/{profile} installed successfully"
359+
)
360+
return Result.REPAIRED
361+
else:
362+
self.log_error(f"Failed to install module {module_name}:{stream}/{profile}")
363+
if failed_packages:
364+
for pkg, error in failed_packages:
365+
self.log_error(f" Package {pkg} failed: {error}")
366+
return Result.NOT_KEPT
354367

355368
def _remove_module(self, mpc, base, module_name, stream, profile):
356369
"""Remove a module using DNF Python API"""
@@ -366,6 +379,7 @@ def _remove_module(self, mpc, base, module_name, stream, profile):
366379
self.log_verbose(f"No active stream for {module_name}, nothing to remove")
367380
return Result.KEPT
368381

382+
failed_packages = []
369383
if profile:
370384
mpc.uninstall(module_name, target_stream, profile)
371385
pkgs = self._get_profile_packages(mpc, module_name, target_stream, profile)
@@ -374,6 +388,7 @@ def _remove_module(self, mpc, base, module_name, stream, profile):
374388
base.remove(pkg)
375389
except dnf.exceptions.Error as e:
376390
self.log_verbose(f"Failed to remove package {pkg}: {e}")
391+
failed_packages.append((pkg, str(e)))
377392
else:
378393
profiles = mpc.getInstalledProfiles(module_name)
379394
for p in profiles:
@@ -384,12 +399,23 @@ def _remove_module(self, mpc, base, module_name, stream, profile):
384399
base.remove(pkg)
385400
except dnf.exceptions.Error as e:
386401
self.log_verbose(f"Failed to remove package {pkg}: {e}")
402+
failed_packages.append((pkg, str(e)))
387403

388404
mpc.save()
389405
base.resolve(allow_erasing=True)
390406
base.do_transaction()
391-
self.log_info(f"Module {module_name} removed successfully")
392-
return Result.REPAIRED
407+
408+
# Verify removal succeeded
409+
current_state = self._get_module_state(mpc, module_name)
410+
if current_state in ["removed", "disabled"]:
411+
self.log_info(f"Module {module_name} removed successfully")
412+
return Result.REPAIRED
413+
else:
414+
self.log_error(f"Failed to remove module {module_name}")
415+
if failed_packages:
416+
for pkg, error in failed_packages:
417+
self.log_error(f" Package {pkg} failed: {error}")
418+
return Result.NOT_KEPT
393419

394420
def _reset_module(self, mpc, base, module_name):
395421
"""Reset a module using DNF Python API"""
@@ -403,8 +429,14 @@ def _reset_module(self, mpc, base, module_name):
403429
mpc.save()
404430
base.resolve()
405431
base.do_transaction()
406-
self.log_info(f"Module {module_name} reset successfully")
407-
return Result.REPAIRED
432+
433+
# Verify reset succeeded
434+
if mpc.getModuleState(module_name) == mpc.ModuleState_DEFAULT:
435+
self.log_info(f"Module {module_name} reset successfully")
436+
return Result.REPAIRED
437+
else:
438+
self.log_error(f"Failed to reset module {module_name}")
439+
return Result.NOT_KEPT
408440

409441

410442
if __name__ == "__main__":

0 commit comments

Comments
 (0)