Example #1
0
    def load_config_files(self, section):
        config_data = {}
        for config_file in self.config_files:
            if os.path.isfile(config_file):
                with open(config_file) as cf:
                    data = yaml.load(cf.read()).get(section)
                    if not data:
                        return None
                    self.logger.debug('%s JSON: %s' % (section, str(data)))
                for item in data:
                    image_name = item.get('imagename')
                    if image_name is None:
                        msg = 'imagename is required'
                        self.logger.error(msg)
                        raise ImageSpecificationException(msg)

                    existing_image = config_data.get(image_name)
                    if not existing_image:
                        config_data[image_name] = item
                        continue

                    for attr in self.APPEND_ATTRIBUTES:
                        self._extend_or_set_attribute(existing_image, item,
                                                      attr)

                    # If a new key is introduced, add it.
                    for key, value in six.iteritems(item):
                        if key not in existing_image:
                            existing_image[key] = item[key]

                    config_data[image_name] = existing_image
            else:
                self.logger.error('No config file exists at: %s' % config_file)
                raise IOError('No config file exists at: %s' % config_file)
        return [x for x in config_data.values()]
Example #2
0
    def build(self):
        """Start the build process"""

        self.logger.info('Using config files: %s' % self.config_files)

        disk_images = self.load_config_files(self.CONFIG_SECTIONS[0])

        for image in disk_images:
            arch = image.get('arch', 'amd64')
            image_type = image.get('type', 'qcow2')
            image_name = image.get('imagename')
            builder = image.get('builder', 'dib')
            skip_base = strutils.bool_from_string(image.get(
                'skip_base', False))
            docker_target = image.get('docker_target')
            node_dist = image.get('distro')
            if node_dist is None:
                raise ImageSpecificationException('distro is required')
            self.logger.info('imagename: %s' % image_name)
            image_extension = image.get('imageext', image_type)
            image_path = '%s/%s.%s' % (self.output_directory, image_name,
                                       image_extension)
            if self.skip:
                self.logger.info('looking for image at path: %s' % image_path)
                if os.path.exists(image_path):
                    self.logger.info('Image file exists for image name: %s' %
                                     image_name)
                    self.logger.info('Skipping image build')
                    continue
            elements = image.get('elements', [])
            options = image.get('options', [])
            packages = image.get('packages', [])
            environment = image.get('environment', {})

            extra_options = {
                'skip_base': skip_base,
                'docker_target': docker_target,
                'environment': environment
            }

            builder = ImageBuilder.get_builder(builder)
            builder.build_image(image_path, image_type, node_dist, arch,
                                elements, options, packages, extra_options)