module Vagrant module LXC module Action # Prepare arguments to be used for lxc-create class HandleBoxMetadata SUPPORTED_VERSIONS = ['1.0.0', '2', '3'] def initialize(app, env) @app = app @logger = Log4r::Logger.new("vagrant::lxc::action::handle_box_metadata") end def call(env) @env = env @box = @env[:machine].box @env[:ui].info I18n.t("vagrant.actions.vm.import.importing", :name => @env[:machine].box.name) @logger.info 'Validating box contents' validate_box @logger.info 'Setting box options on environment' @env[:lxc_template_src] = template_src @env[:lxc_template_opts] = template_opts # FIXME: Remove support for pre 1.0.0 boxes if box_version != '1.0.0' @env[:ui].warn "WARNING: You are using a base box that has a format that has been deprecated, please upgrade to a new one." @env[:lxc_template_opts].merge!( '--auth-key' => Vagrant.source_root.join('keys', 'vagrant.pub').expand_path.to_s ) end if template_config_file.exist? @env[:lxc_template_opts].merge!('--config' => template_config_file.to_s) elsif old_template_config_file.exist? @env[:lxc_template_config] = old_template_config_file.to_s end @app.call env end def template_src @template_src ||= if (box_template = @box.directory.join('lxc-template')).exist? box_template.to_s else Vagrant::LXC.source_root.join('scripts/lxc-template').to_s end end def template_config_file @template_config_file ||= @box.directory.join('lxc-config') end # TODO: Remove this once we remove compatibility for < 1.0.0 boxes def old_template_config_file @old_template_config_file ||= @box.directory.join('lxc.conf') end def template_opts @template_opts ||= @box.metadata.fetch('template-opts', {}).dup.merge!( '--tarball' => rootfs_tarball ) end def rootfs_tarball @rootfs_tarball ||= @box.directory.join('rootfs.tar.gz').to_s end def validate_box unless SUPPORTED_VERSIONS.include? box_version raise Errors::IncompatibleBox.new name: @box.name, found: box_version, supported: SUPPORTED_VERSIONS.join(', ') end unless File.exists?(template_src) raise Errors::TemplateFileMissing.new name: @box.name end unless File.exists?(rootfs_tarball) raise Errors::RootFSTarballMissing.new name: @box.name end end def box_version @box.metadata.fetch('version') end end end end end