@@ -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
410442if __name__ == "__main__" :
0 commit comments