require 'rubygems' require 'bundler' require 'bundler/setup' require 'veewee' Bundler::GemHelper.install_tasks desc 'Default: run tests' task :default => :test require 'rake/testtask' Bundler::GemHelper.install_tasks desc 'Tests not requiring an real box' Rake::TestTask.new do |t| t.libs << "test" t.pattern = 'test/**/*_test.rb' end desc 'Tests requiring an real box' Rake::TestTask.new do |t| t.name="realtest" t.libs << "test" t.libs << "." t.pattern = 'test/**/*_realtest.rb' end desc 'Verify ISO' task :iso, [:template_name] do |t, args| require 'net/http' #if args.to_hash.size!=1 #puts "needs one arguments: rake iso [\"yourname\"]" #exit #end Dir.glob("templates/*").each do |name| definition_name = File.basename(name) puts name definition = Veewee::Environment.new(:cwd => ".", :definition_dir => "templates").definitions[definition_name] next if definition.nil? || definition.iso_src.nil? || definition.iso_src == "" begin url = definition.iso_src found = false response = nil while found == false uri = URI.parse(url) if uri.is_a?(URI::HTTP) Net::HTTP.start(uri.host, uri.port) { |http| response = http.head(uri.path) } unless response['location'].nil? #puts "Redirecting to "+response['location'] url = response['location'] else length = response['content-length'] found = true end elsif uri.is_a?(URI::FTP) require 'net/ftp' ftp = Net::FTP.new(uri.host) ftp.login begin length = ftp.size(uri.path) found = true rescue Net::FTPReplyError => e reply = e.message err_code = reply[0, 3].to_i unless err_code == 500 || err_code == 502 # other problem, raise raise "Got ftp site but doesn't support size subcommand" end # fallback solution end end end if length.to_i < 10000 puts definition.iso_src puts "Incorrect length #{length.to_i}" puts uri.host, uri.port, uri.path, response.code end rescue Exception => ex puts "Error" + ex.to_s + definition.iso_src end end end desc 'Autobuilds all templates and runs validation.' task :autotest, [:pattern] do |t, args| # We overrule all timeouts for tcp and ssh #ENV['VEEWEE_TIMEOUT']='600' ve = Veewee::Environment.new ve.templates.each do |name, template| # If pattern was given, only take the ones that match the pattern unless args[:pattern].nil? next unless name.match(args[:pattern]) end begin ve.definitions.define("auto", name, { 'force' => true }) vd = ve.definitions["auto"] box = ve.providers["virtualbox"].get_box("auto") puts "AUTO: Building #{name}" box.build({ "auto" => true, "force" => true, 'nogui' => true }) puts "AUTO: Validating #{name}" box.validate_vagrant puts "AUTO: Success #{name}" box.destroy rescue Exception => ex puts "AUTO: Template #{name} failed - #{ex}" if box.running? begin screenshot = "screenshot-auto-#{name}.png" puts "AUTO: Taking snapshot #{screenshot}" box.screenshot(screenshot) rescue Veewee::Error => ex puts "AUTO: Error taking screenshot" end end end end end