From f005d55e31c986980a95166dd20e85af04180698 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Mon, 21 Dec 2009 21:55:48 +0100 Subject: [PATCH] [molecule.specs] add error_script .spec file directive support --- molecule/specs/plugins/builtin.py | 82 ++++++++++++++++++++++++++++++ molecule/specs/plugins/remaster.py | 25 +++++++++ molecule/specs/plugins/tar.py | 21 ++++++++ 3 files changed, 128 insertions(+) diff --git a/molecule/specs/plugins/builtin.py b/molecule/specs/plugins/builtin.py index 167522a..29c1120 100644 --- a/molecule/specs/plugins/builtin.py +++ b/molecule/specs/plugins/builtin.py @@ -55,7 +55,26 @@ class MirrorHandler(GenericExecutionStep): ) return 0 + def _run_error_script(self): + error_script = self.metadata.get('error_script') + if error_script: + os.environ['SOURCE_CHROOT_DIR'] = self.source_dir + os.environ['CHROOT_DIR'] = self.dest_dir + self.Output.updateProgress("[%s|%s] %s: %s" % ( + blue("MirrorHandler"),darkred(self.spec_name), + _("spawning"), [error_script], + ) + ) + molecule.utils.exec_cmd([error_script]) + for env_key in ("SOURCE_CHROOT_DIR", "CHROOT_DIR", "CDROOT_DIR",): + try: + del os.environ[env_key] + except KeyError: + continue + def kill(self, success = True): + if not success: + self._run_error_script() self.Output.updateProgress("[%s|%s] %s" % ( blue("MirrorHandler"),darkred(self.spec_name), _("executing kill"), @@ -232,7 +251,26 @@ class ChrootHandler(GenericExecutionStep): return 0 + def _run_error_script(self): + error_script = self.metadata.get('error_script') + if error_script: + os.environ['SOURCE_CHROOT_DIR'] = self.source_dir + os.environ['CHROOT_DIR'] = self.dest_dir + self.Output.updateProgress("[%s|%s] %s: %s" % ( + blue("MirrorHandler"),darkred(self.spec_name), + _("spawning"), [error_script], + ) + ) + molecule.utils.exec_cmd([error_script]) + for env_key in ("SOURCE_CHROOT_DIR", "CHROOT_DIR", "CDROOT_DIR",): + try: + del os.environ[env_key] + except KeyError: + continue + def kill(self, success = True): + if not success: + self._run_error_script() self.Output.updateProgress("[%s|%s] %s" % ( blue("ChrootHandler"), darkred(self.spec_name),_("executing kill"), @@ -334,7 +372,27 @@ class CdrootHandler(GenericExecutionStep): ) return 0 + def _run_error_script(self): + error_script = self.metadata.get('error_script') + if error_script: + os.environ['SOURCE_CHROOT_DIR'] = self.metadata['source_chroot'] + os.environ['CHROOT_DIR'] = self.source_chroot + os.environ['CDROOT_DIR'] = self.dest_root + self.Output.updateProgress("[%s|%s] %s: %s" % ( + blue("CdrootHandler"),darkred(self.spec_name), + _("spawning"), [error_script], + ) + ) + molecule.utils.exec_cmd([error_script]) + for env_key in ("SOURCE_CHROOT_DIR", "CHROOT_DIR", "CDROOT_DIR",): + try: + del os.environ[env_key] + except KeyError: + continue + def kill(self, success = True): + if not success: + self._run_error_script() self.Output.updateProgress("[%s|%s] %s" % ( blue("CdrootHandler"),darkred(self.spec_name), _("executing kill"), @@ -457,7 +515,27 @@ class IsoHandler(GenericExecutionStep): ) return 0 + def _run_error_script(self): + error_script = self.metadata.get('error_script') + if error_script: + os.environ['SOURCE_CHROOT_DIR'] = self.source_chroot + os.environ['CHROOT_DIR'] = self.chroot_dir + os.environ['CDROOT_DIR'] = self.source_path + self.Output.updateProgress("[%s|%s] %s: %s" % ( + blue("IsoHandler"),darkred(self.spec_name), + _("spawning"), [error_script], + ) + ) + molecule.utils.exec_cmd([error_script]) + for env_key in ("SOURCE_CHROOT_DIR", "CHROOT_DIR", "CDROOT_DIR",): + try: + del os.environ[env_key] + except KeyError: + continue + def kill(self, success = True): + if not success: + self._run_error_script() self.Output.updateProgress("[%s|%s] %s" % ( blue("IsoHandler"),darkred(self.spec_name), _("executing kill"), @@ -583,6 +661,10 @@ class LivecdSpec(GenericSpec): 'cb': self.valid_dir, 've': self.ve_string_stripper, }, + 'error_script': { + 'cb': self.valid_exec, + 've': self.ve_string_stripper, + }, 'outer_chroot_script': { 'cb': self.valid_exec, 've': self.ve_string_stripper, diff --git a/molecule/specs/plugins/remaster.py b/molecule/specs/plugins/remaster.py index e1dce84..f73d235 100644 --- a/molecule/specs/plugins/remaster.py +++ b/molecule/specs/plugins/remaster.py @@ -49,6 +49,7 @@ class IsoUnpackHandler(GenericExecutionStep): # setup upcoming new chroot path self.dest_root = os.path.join(unpack_prefix, "cdroot") + self.chroot_dir = self.metadata['chroot_unpack_path'] self.metadata['cdroot_path'] = self.dest_root def pre_run(self): @@ -143,6 +144,23 @@ class IsoUnpackHandler(GenericExecutionStep): ) return 0 + def _run_error_script(self): + error_script = self.metadata.get('error_script') + if error_script: + os.environ['CHROOT_DIR'] = self.chroot_dir + os.environ['CDROOT_DIR'] = self.dest_root + self.Output.updateProgress("[%s|%s] %s: %s" % ( + blue("IsoUnpackHandler"),darkred(self.spec_name), + _("spawning"), [error_script], + ) + ) + molecule.utils.exec_cmd([error_script]) + for env_key in ("SOURCE_CHROOT_DIR", "CHROOT_DIR", "CDROOT_DIR",): + try: + del os.environ[env_key] + except KeyError: + continue + def kill(self, success = True): self.Output.updateProgress("[%s|%s] %s" % ( blue("IsoUnpackHandler"),darkred(self.spec_name), @@ -150,6 +168,9 @@ class IsoUnpackHandler(GenericExecutionStep): ) ) + if not success: + self._run_error_script() + rc = 0 if self.squash_mounted: umounter = self.metadata.get('squash_umounter', @@ -324,6 +345,10 @@ class RemasterSpec(GenericSpec): 'cb': self.ne_string, 've': self.ve_string_stripper, }, + 'error_script': { + 'cb': self.valid_exec, + 've': self.ve_string_stripper, + }, 'outer_chroot_script': { 'cb': self.valid_exec, 've': self.ve_string_stripper, diff --git a/molecule/specs/plugins/tar.py b/molecule/specs/plugins/tar.py index 79cbeda..9f1ff75 100644 --- a/molecule/specs/plugins/tar.py +++ b/molecule/specs/plugins/tar.py @@ -96,8 +96,25 @@ class TarHandler(GenericExecutionStep): ) ) + def _run_error_script(self): + error_script = self.metadata.get('error_script') + if error_script: + os.environ['CHROOT_DIR'] = self.chroot_path + self.Output.updateProgress("[%s|%s] %s: %s" % ( + blue("TarHandler"),darkred(self.spec_name), + _("spawning"), [error_script], + ) + ) + molecule.utils.exec_cmd([error_script]) + for env_key in ("SOURCE_CHROOT_DIR", "CHROOT_DIR", "CDROOT_DIR",): + try: + del os.environ[env_key] + except KeyError: + continue + def kill(self, success = True): if not success: + self._run_error_script() try: shutil.rmtree(self.metadata['chroot_tmp_dir'], True) except (shutil.Error, OSError,): @@ -137,6 +154,10 @@ class IsoToTarSpec(GenericSpec): 'cb': self.supported_compression_method, 've': self.ve_string_stripper, }, + 'error_script': { + 'cb': self.valid_exec, + 've': self.ve_string_stripper, + }, 'outer_chroot_script': { 'cb': self.valid_exec, 've': self.ve_string_stripper,