vagrant-lxc-ng/tasks/boxes.rake
2013-09-18 22:19:01 -03:00

180 lines
4.7 KiB
Ruby

require 'time'
require 'pathname'
require 'rake/tasklib'
class BuildGenericBoxTask < ::Rake::TaskLib
include ::Rake::DSL
attr_reader :name
def initialize(name, distrib, release, arch, cfg_engines)
@name = name
@distrib = distrib
@release = release.to_s
@arch = arch.to_s
@cfg_engines = cfg_engines
@file = "lxc-#{@release}-#{@arch}-#{Date.today}.box"
@scripts_path = Pathname(Dir.pwd).join('boxes')
task name do
RakeFileUtils.send(:verbose, true) do
build
end
end
end
def run(script_name, *args)
script = @scripts_path.join('common', script_name)
if script.readable?
sh "sudo #{script} #{args.join(' ')}"
else
STDERR.puts "cannot execute #{script_name} (not found?)"
exit 1
end
end
def build
check_if_box_has_been_built!
FileUtils.mkdir_p 'boxes/temp' unless File.exist? 'base/temp'
check_for_partially_built_box!
import_template do |template|
create_base_container(template) do |rootfs|
install_cfg_engines(rootfs)
cleanup(rootfs)
prepare_package_contents(rootfs)
compress_box(rootfs)
end
end
end
def check_if_box_has_been_built!
return unless File.exists?("./boxes/output/#{@file}")
puts 'Box has been built already!'
exit 1
end
def check_for_partially_built_box!
return unless Dir.entries('boxes/temp').size > 2
puts 'There is a partially built box under ' +
File.expand_path('./boxes/temp') +
', please remove it before building a new box'
exit 1
end
def create_base_container(template)
container_name = 'vagrant-base-box-tmp'
sh "sudo lxc-create -n #{container_name} -t vagrant-base-box-template -- --arch #{@arch} --release #{@release}"
yield "/var/lib/lxc/#{container_name}/rootfs"
ensure
sh "sudo lxc-destroy -n #{container_name}"
end
def install_cfg_engines(rootfs)
puts "TODO: Install cfg engines under #{rootfs}"
end
def prepare_package_contents(rootfs)
puts "TODO: Prepare pkg contents under #{rootfs}"
end
def compress_box(rootfs)
puts "TODO: Compress base box under #{rootfs}"
end
def cleanup(rootfs)
puts "TODO: Cleanup under #{rootfs}"
end
def import_template
template_name = "vagrant-base-box-template"
tmp_template_path = templates_path.join("lxc-#{template_name}")
src = "./boxes/templates/#{@distrib}"
sh "sudo cp #{src} #{tmp_template_path}"
yield template_name
ensure
sh "sudo rm #{tmp_template_path}" if tmp_template_path.file?
end
TEMPLATES_PATH_LOOKUP = %w(
/usr/share/lxc/templates
/usr/lib/lxc/templates
/usr/lib64/lxc/templates
/usr/local/lib/lxc/templates
)
def templates_path
return @templates_path if @templates_path
path = TEMPLATES_PATH_LOOKUP.find { |candidate| File.directory?(candidate) }
raise 'Unable to identify lxc templates path!' unless path
@templates_path = Pathname(path)
end
end
class BuildDebianBoxTask < BuildGenericBoxTask
def initialize(name, release, arch, opts = {})
super(name, 'debian', release, arch, opts)
end
end
class BuildUbuntuBoxTask < BuildGenericBoxTask
def initialize(name, release, arch, opts = {})
super(name, 'ubuntu', release, arch, opts)
end
end
cfg_engines = {
puppet: ENV['PUPPET'] == '1',
babushka: ENV['BABUSHKA'] == '1',
salt: ENV['SALT'] == '1',
chef: ENV['CHEF'] == '1'
}
namespace :boxes do
namespace :ubuntu do
namespace :build do
desc 'Build an Ubuntu Precise 64 bits box'
BuildUbuntuBoxTask.new(:precise64, :precise, 'amd64', cfg_engines)
desc 'Build an Ubuntu Quantal 64 bits box'
BuildUbuntuBoxTask.new(:quantal64, :quantal, 'amd64', cfg_engines)
desc 'Build an Ubuntu Raring 64 bits box'
BuildUbuntuBoxTask.new(:raring64, :raring, 'amd64', cfg_engines)
desc 'Build an Ubuntu Saucy 64 bits box'
BuildUbuntuBoxTask.new(:saucy64, :saucy, 'amd64', cfg_engines)
desc 'Build all Ubuntu boxes'
task :all => %w( precise64 quantal64 raring64 saucy64 )
end
end
namespace :debian do
%w( chef salt).each { |cfg| cfg_engines.delete(cfg.to_sym) }
namespace :build do
desc 'Build an Debian Squeeze 64 bits box'
BuildDebianBoxTask.new(:squeeze64, :squeeze, 'amd64', cfg_engines)
desc 'Build an Debian Wheezy 64 bits box'
BuildDebianBoxTask.new(:wheezy64, :wheezy, 'amd64', cfg_engines)
desc 'Build an Debian Sid/unstable 64 bits box'
BuildDebianBoxTask.new(:sid64, :sid, 'amd64', cfg_engines)
desc 'Build all Debian boxes'
task :all => %w( squeeze64 wheezy64 sid64 )
end
end
desc 'Build all base boxes for release'
task :build_all => %w( ubuntu:build:all debian:build:all )
end