[molecule.specs] always make sure to kill processes running inside chroots if failing
This commit is contained in:
@@ -73,11 +73,19 @@ class BuiltinHandlerMixin:
|
||||
if not dest_exec.startswith("/"):
|
||||
dest_exec = "/%s" % (dest_exec,)
|
||||
|
||||
rc = molecule.utils.exec_chroot_cmd([dest_exec] + exec_script[1:],
|
||||
dest_chroot, pre_chroot = self.metadata.get('prechroot', []))
|
||||
os.remove(tmp_exec)
|
||||
rc = 0
|
||||
try:
|
||||
rc = molecule.utils.exec_chroot_cmd([dest_exec] + exec_script[1:],
|
||||
dest_chroot, pre_chroot = self.metadata.get('prechroot', []))
|
||||
except:
|
||||
# kill all the pids inside chroot, no matter what just happened
|
||||
molecule.utils.kill_chroot_pids(dest_chroot, sleep = True)
|
||||
raise
|
||||
finally:
|
||||
os.remove(tmp_exec)
|
||||
|
||||
if rc != 0:
|
||||
molecule.utils.kill_chroot_pids(dest_chroot, sleep = True)
|
||||
self._output.output("[%s|%s] %s: %s" % (
|
||||
blue("BuiltinHandler"), darkred(self.spec_name),
|
||||
_("inner chroot hook failed"), rc,
|
||||
|
||||
@@ -323,9 +323,10 @@ class ImageHandler(GenericExecutionStep, BuiltinHandlerMixin):
|
||||
self._tmp_loop_device_fd = None
|
||||
|
||||
if not success:
|
||||
env = os.environ.copy()
|
||||
env["LOOP_DEVICE"] = self.loop_device
|
||||
self._run_error_script(None, None, None, env = env)
|
||||
self._kill_loop_device()
|
||||
self._run_error_script(None, None, None)
|
||||
|
||||
|
||||
return 0
|
||||
|
||||
@@ -396,7 +397,7 @@ class ImageIsoUnpackHandler(RemasterIsoUnpackHandler):
|
||||
return 0
|
||||
|
||||
|
||||
class ChrootHandler(RemasterChrootHandler):
|
||||
class ImageChrootHandler(RemasterChrootHandler):
|
||||
|
||||
def setup(self):
|
||||
# to make superclass working
|
||||
@@ -405,10 +406,19 @@ class ChrootHandler(RemasterChrootHandler):
|
||||
return 0
|
||||
|
||||
def kill(self, success = True):
|
||||
# ImageHandler sets this
|
||||
self._output.output("[%s|%s] %s" % (
|
||||
blue("ImageChrootHandler"),
|
||||
darkred(self.spec_name), _("executing kill"),
|
||||
)
|
||||
)
|
||||
if not success:
|
||||
env = os.environ.copy()
|
||||
loop_device = self.metadata.get('ImageHandler_loop_device')
|
||||
if loop_device is not None:
|
||||
env["LOOP_DEVICE"] = loop_device
|
||||
self._run_error_script(self.source_dir, self.dest_dir, None,
|
||||
env = env)
|
||||
self.metadata['ImageHandler_kill_loop_device']()
|
||||
RemasterChrootHandler.kill(self, success = success)
|
||||
return 0
|
||||
|
||||
|
||||
@@ -669,5 +679,5 @@ class IsoToImageSpec(GenericSpec):
|
||||
}
|
||||
|
||||
def get_execution_steps(self):
|
||||
return [ImageHandler, ImageIsoUnpackHandler, ChrootHandler,
|
||||
return [ImageHandler, ImageIsoUnpackHandler, ImageChrootHandler,
|
||||
FinalImageHandler]
|
||||
|
||||
@@ -245,10 +245,17 @@ class ChrootHandler(BuiltinChrootHandler):
|
||||
if do_update == 'yes':
|
||||
update_cmd = self.metadata.get('repositories_update_cmd',
|
||||
self._config['pkgs_updater'])
|
||||
rc = molecule.utils.exec_chroot_cmd(update_cmd,
|
||||
self.source_dir,
|
||||
pre_chroot = self.metadata.get('prechroot', []))
|
||||
try:
|
||||
rc = molecule.utils.exec_chroot_cmd(update_cmd,
|
||||
self.source_dir,
|
||||
pre_chroot = self.metadata.get('prechroot', []))
|
||||
except:
|
||||
molecule.utils.kill_chroot_pids(self.source_dir,
|
||||
sleep = True)
|
||||
raise
|
||||
if rc != 0:
|
||||
molecule.utils.kill_chroot_pids(self.source_dir,
|
||||
sleep = True)
|
||||
return rc
|
||||
|
||||
rc = BuiltinChrootHandler.run(self)
|
||||
@@ -267,10 +274,17 @@ class ChrootHandler(BuiltinChrootHandler):
|
||||
add_cmd = self.metadata.get('custom_packages_add_cmd',
|
||||
self._config['pkgs_adder'])
|
||||
args = add_cmd + packages_to_add
|
||||
rc = molecule.utils.exec_chroot_cmd(args,
|
||||
self.source_dir,
|
||||
pre_chroot = self.metadata.get('prechroot', []))
|
||||
try:
|
||||
rc = molecule.utils.exec_chroot_cmd(args,
|
||||
self.source_dir,
|
||||
pre_chroot = self.metadata.get('prechroot', []))
|
||||
except:
|
||||
molecule.utils.kill_chroot_pids(self.source_dir,
|
||||
sleep = True)
|
||||
raise
|
||||
if rc != 0:
|
||||
molecule.utils.kill_chroot_pids(self.source_dir,
|
||||
sleep = True)
|
||||
return rc
|
||||
|
||||
packages_to_remove = self.metadata.get('packages_to_remove', [])
|
||||
@@ -278,10 +292,17 @@ class ChrootHandler(BuiltinChrootHandler):
|
||||
rm_cmd = self.metadata.get('custom_packages_remove_cmd',
|
||||
self._config['pkgs_remover'])
|
||||
args = rm_cmd + packages_to_remove
|
||||
rc = molecule.utils.exec_chroot_cmd(args,
|
||||
self.source_dir,
|
||||
pre_chroot = self.metadata.get('prechroot', []))
|
||||
try:
|
||||
rc = molecule.utils.exec_chroot_cmd(args,
|
||||
self.source_dir,
|
||||
pre_chroot = self.metadata.get('prechroot', []))
|
||||
except:
|
||||
molecule.utils.kill_chroot_pids(self.source_dir,
|
||||
sleep = True)
|
||||
raise
|
||||
if rc != 0:
|
||||
molecule.utils.kill_chroot_pids(self.source_dir,
|
||||
sleep = True)
|
||||
return rc
|
||||
|
||||
# run inner chroot script after pkgs handling
|
||||
|
||||
Reference in New Issue
Block a user