refactored package into actions: export, package

This commit is contained in:
John Bender 2010-02-15 22:03:55 -08:00
parent cf0615ac9b
commit 1c045bd447
13 changed files with 103 additions and 55 deletions

View File

@ -18,6 +18,7 @@ Vagrant::Config.run do |config|
config.vm.disk_image_format = 'VMDK' config.vm.disk_image_format = 'VMDK'
config.package.name = 'vagrant' config.package.name = 'vagrant'
config.package.extension = '.box'
config.package.delimiter = 'VAGRANT' config.package.delimiter = 'VAGRANT'
config.package.delimiter_regex = /(.*)#{config.package.delimiter}(.+)#{config.package.delimiter}(.*[\n\r])/ config.package.delimiter_regex = /(.*)#{config.package.delimiter}(.+)#{config.package.delimiter}(.*[\n\r])/

View File

@ -0,0 +1,15 @@
module Vagrant
module Actions
class Export < Base
def execute!(name=Vagrant.config.package.name, to=FileUtils.pwd)
folder = FileUtils.mkpath(File.join(to, name))
logger.info "Creating export directory: #{folder} ..."
ovf_path = File.join(folder, "#{name}.ovf")
logger.info "Exporting required VM files to directory: #{folder} ..."
@vm.export(ovf_path)
end
end
end
end

View File

@ -0,0 +1,29 @@
module Vagrant
module Actions
class Package < Base
def execute!(name=Vagrant.config.package.name, to=FileUtils.pwd)
folder = FileUtils.mkpath(File.join(to, name))
tar_path = "#{folder}#{Vagrant.config.package.extension}"
logger.info "Packaging VM into #{tar_path} ..."
compress(Dir["#{folder}/*.*"], tar_path)
logger.info "Removing working directory ..."
FileUtils.rm_r(folder)
tar_path
end
def compress(files_to_compress, compressed_file_name)
delimiter = Vagrant.config.package.delimiter
Zlib::GzipWriter.open(compressed_file_name) do |gz|
files_to_compress.each do |file|
# Delimit the files, and guarantee new line for next file if not the first
gz.write "#{delimiter}#{file}#{delimiter}"
File.open(file).each { |line| gz.write(line) }
end
end
end
end
end
end

View File

@ -107,7 +107,11 @@ error
error_and_exit(<<-error) unless Env.persisted_vm.powered_off? error_and_exit(<<-error) unless Env.persisted_vm.powered_off?
The vagrant virtual environment you are trying to package must be powered off The vagrant virtual environment you are trying to package must be powered off
error error
Env.persisted_vm.package(name || Vagrant.config[:package][:name], FileUtils.pwd) # TODO allow directory specification
act_on_vm do |vm|
vm.add_action(Actions::Export)
vm.add_action(Actions::Package)# (name || Vagrant.config[:package][:name], FileUtils.pwd)
end
end end
def unpackage(name) def unpackage(name)
@ -117,6 +121,14 @@ Please specify a target package to unpack and import
error error
VM.up(VM.unpackage(name)) VM.up(VM.unpackage(name))
end end
private
def act_on_vm(&block)
yield Env.persisted_vm
Env.persisted_vm.execute!
end
end end
end end
end end

View File

@ -78,6 +78,7 @@ module Vagrant
class PackageConfig < Base class PackageConfig < Base
attr_accessor :name attr_accessor :name
attr_accessor :extension
attr_accessor :delimiter attr_accessor :delimiter
attr_accessor :delimiter_regex attr_accessor :delimiter_regex
end end

View File

@ -136,34 +136,6 @@ error
@vm.save_state(true) @vm.save_state(true)
end end
# TODO the longest method, needs to be split up
def package(name, to)
delimiter = Vagrant.config[:package][:delimiter]
folder = FileUtils.mkpath(File.join(to, name))
logger.info "Creating working directory: #{folder} ..."
ovf_path = File.join(folder, "#{name}.ovf")
tar_path = "#{folder}.box"
logger.info "Exporting required VM files to working directory ..."
@vm.export(ovf_path)
logger.info "Packaging VM into #{tar_path} ..."
Zlib::GzipWriter.open(tar_path) do |gz|
Dir.new(folder).each do |file|
next if File.directory?(file)
# Delimit the files, and guarantee new line for next file if not the first
gz.write "#{delimiter}#{file}#{delimiter}"
File.open(File.join(folder, file)).each { |line| gz.write(line) }
end
end
logger.info "Removing working directory ..."
FileUtils.rm_r(folder)
tar_path
end
def powered_off?; @vm.powered_off? end def powered_off?; @vm.powered_off? end
def export(filename); @vm.export(filename, {}, true) end def export(filename); @vm.export(filename, {}, true) end

View File

@ -38,6 +38,8 @@ class Test::Unit::TestCase
config.vm.disk_image_format = 'VMDK' config.vm.disk_image_format = 'VMDK'
config.vm.forward_port("ssh", 22, 2222) config.vm.forward_port("ssh", 22, 2222)
config.package.name = 'vagrant'
config.package.extension = '.box'
config.package.delimiter = 'V' config.package.delimiter = 'V'
config.package.delimiter_regex = /'V(.+)V'/ config.package.delimiter_regex = /'V(.+)V'/

View File

@ -0,0 +1 @@
johnbender@john-benders-macbook-pro-2.local.460

View File

@ -0,0 +1 @@
johnbender@john-benders-macbook-pro-2.local.460

View File

@ -0,0 +1,21 @@
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
class ExportActionTest < Test::Unit::TestCase
setup do
@wrapper_vm, @vm, @action = mock_action(Vagrant::Actions::Export)
mock_config
end
should "setup and correct working directory and export to it" do
new_dir = File.join(FileUtils.pwd, Vagrant.config.package.name)
FileUtils.expects(:mkpath).with(new_dir).returns(new_dir)
@wrapper_vm.expects(:export).with(File.join(new_dir, "#{Vagrant.config.package.name}.ovf"))
@action.execute!
#FileUtils.expects(:rm_r).with(new_dir)
# assert_equal Vagrant::VM.new(@mock_vm).package(name, location), "#{new_dir}.box"
end
end

View File

@ -0,0 +1,17 @@
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
class PackageActionTest < Test::Unit::TestCase
setup do
@wrapper_vm, @vm, @action = mock_action(Vagrant::Actions::Package)
mock_config
end
should "setup and correct working directory and export to it" do
working_dir = File.join(FileUtils.pwd, Vagrant.config.package.name)
FileUtils.expects(:rm_r).with(working_dir)
@action.expects(:compress)
assert_equal @action.execute!, "#{working_dir}.box"
end
# TODO test compression once its finished
end

View File

@ -136,6 +136,8 @@ class CommandsTest < Test::Unit::TestCase
setup do setup do
@persisted_vm.stubs(:package) @persisted_vm.stubs(:package)
@persisted_vm.stubs(:powered_off?).returns(true) @persisted_vm.stubs(:powered_off?).returns(true)
@persisted_vm.expects(:add_action).twice
@persisted_vm.expects(:execute!)
end end
should "require a persisted vm" do should "require a persisted vm" do
@ -149,15 +151,5 @@ class CommandsTest < Test::Unit::TestCase
@persisted_vm.expects(:package).never @persisted_vm.expects(:package).never
Vagrant::Commands.package Vagrant::Commands.package
end end
should "package the vm with the default name and the current directory" do
@persisted_vm.expects(:package).with(Vagrant.config[:package][:name], FileUtils.pwd).once
Vagrant::Commands.package
end
should "package the vm with the specified name" do
@persisted_vm.expects(:package).with('foo', FileUtils.pwd).once
Vagrant::Commands.package('foo')
end
end end
end end

View File

@ -182,22 +182,6 @@ class VMTest < Test::Unit::TestCase
end end
end end
# TODO more comprehensive testing
context "packaging a vm" do
should "dump the three necessary files to a tar in the current working dir" do
location = FileUtils.pwd
name = 'vagrant'
new_dir = File.join(location, name)
@mock_vm.expects(:export).with(File.join(new_dir, "#{name}.ovf"))
FileUtils.expects(:mkpath).with(new_dir).returns(new_dir)
FileUtils.expects(:rm_r).with(new_dir)
Zlib::GzipWriter.expects(:open).with("#{location}/#{name}.box")
# TODO test whats passed to the open tar.append_tree
assert_equal Vagrant::VM.new(@mock_vm).package(name, location), "#{new_dir}.box"
end
end
context "unpackaging a vm" do context "unpackaging a vm" do
# TODO test actual decompression # TODO test actual decompression