#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import argparse import kobo.conf import os import sys import tempfile import contextlib import shutil here = sys.path[0] if here != '/usr/bin': # Git checkout sys.path[0] = os.path.dirname(here) import pungi.compose import pungi.phases import pungi.paths class ValidationCompose(pungi.compose.Compose): def __init__(self, conf, has_old, topdir): self.topdir = topdir self.conf = conf self._logger = None self.just_phases = [] self.skip_phases = [] self.has_old_composes = has_old self.paths = pungi.paths.Paths(self) @property def old_composes(self): return '/dummy' if self.has_old_composes else None @property def compose_id(self): return 'Dummy-1.0-20160811.t.0' @property def compose_type(self): return 'test' @property def compose_date(self): return '20160811' @property def compose_respin(self): return '0' @contextlib.contextmanager def in_temp_dir(): tempdir = tempfile.mkdtemp() yield tempdir shutil.rmtree(tempdir) def run(config, topdir, has_old): conf = kobo.conf.PyConfigParser() conf.load_from_file(config) compose = ValidationCompose(conf, has_old, topdir) pkgset_phase = pungi.phases.PkgsetPhase(compose) phases = [ pungi.phases.InitPhase(compose), pungi.phases.BuildinstallPhase(compose), pkgset_phase, pungi.phases.GatherPhase(compose, pkgset_phase), pungi.phases.ExtraFilesPhase(compose, pkgset_phase), pungi.phases.CreaterepoPhase(compose), pungi.phases.OstreeInstallerPhase(compose), pungi.phases.OSTreePhase(compose), pungi.phases.ProductimgPhase(compose, pkgset_phase), pungi.phases.CreateisoPhase(compose), pungi.phases.LiveImagesPhase(compose), pungi.phases.LiveMediaPhase(compose), pungi.phases.ImageBuildPhase(compose), pungi.phases.ImageChecksumPhase(compose), pungi.phases.TestPhase(compose), ] errors = [] for phase in phases: if phase.skip(): continue try: phase.validate() except ValueError as ex: for i in str(ex).splitlines(): errors.append("%s: %s" % (phase.name.upper(), i)) return errors def main(args=None): parser = argparse.ArgumentParser() parser.add_argument('config', metavar='CONFIG', help='configuration file to validate') parser.add_argument('--old-composes', action='store_true', help='indicate if pungi-koji will be run with --old-composes option') opts = parser.parse_args(args) with in_temp_dir() as topdir: errors = run(opts.config, topdir, opts.old_composes) for msg in errors: print(msg) return bool(errors) if __name__ == '__main__': if main(): sys.exit(1)