[molecule.specs] always make sure to kill processes running inside chroots if failing

This commit is contained in:
Fabio Erculiani
2011-07-21 13:56:03 +02:00
parent e227c0a625
commit 91cbe7bd6f
3 changed files with 57 additions and 18 deletions
+11 -3
View File
@@ -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,
+16 -6
View File
@@ -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]
+30 -9
View File
@@ -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