# -*- coding: utf-8 -*- import os import sys from lxcmgr import lxcmgr from .imagebuilder import ImageBuilder, ImageExistsError, ImageNotFoundError from .imagepacker import ImagePacker from .packer import PackageExistsError class Image: def __init__(self): self.name = None self.conf = {} self.lxcfile = None self.build_dir = None self.force_build = False self.scratch_build = False def build_and_pack(self, lxcfile): self.lxcfile = lxcfile self.build_dir = os.path.dirname(lxcfile) self.conf['build'] = True try: builder = ImageBuilder(self) builder.build() # In case of successful build, packaging needs to happen in all cases to prevent outdated packages self.force_build = True except ImageExistsError as e: print('Image {} already exists, skipping build tasks'.format(e)) except ImageNotFoundError as e: print('Image {} not found, can\'t build {}'.format(e, self.name)) builder.clean() sys.exit(1) except: if not self.scratch_build: builder.clean() raise del self.conf['build'] # If we're doing a scratch build, regenerate the final LXC container configuration including ephemeral layer if self.scratch_build: lxcmgr.create_container(self.name, self.conf) else: try: packer = ImagePacker(self) packer.pack() except PackageExistsError as e: print('Package {} already exists, skipping packaging tasks'.format(e)) def remove(self): builder = ImageBuilder(self) builder.clean() packer = ImagePacker(self) packer.remove()