`vagrant box add` works completely
This commit is contained in:
parent
28b48929df
commit
f502587931
|
@ -4,6 +4,7 @@ module Vagrant
|
||||||
class Add < Base
|
class Add < Base
|
||||||
def prepare
|
def prepare
|
||||||
@runner.add_action(Download)
|
@runner.add_action(Download)
|
||||||
|
@runner.add_action(Unpackage)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,6 +10,7 @@ module Vagrant
|
||||||
def execute!
|
def execute!
|
||||||
with_tempfile do |tempfile|
|
with_tempfile do |tempfile|
|
||||||
copy_uri_to(tempfile)
|
copy_uri_to(tempfile)
|
||||||
|
@runner.temp_path = tempfile.path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -20,6 +21,8 @@ module Vagrant
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# TODO: Need a way to report progress. Downloading/copying a 350 MB
|
||||||
|
# box without any progress is not acceptable.
|
||||||
def copy_uri_to(f)
|
def copy_uri_to(f)
|
||||||
logger.info "Copying box to temporary location..."
|
logger.info "Copying box to temporary location..."
|
||||||
open(@runner.uri) do |remote_file|
|
open(@runner.uri) do |remote_file|
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
module Vagrant
|
||||||
|
module Actions
|
||||||
|
module Box
|
||||||
|
class Unpackage < Base
|
||||||
|
TAR_OPTIONS = [File::RDONLY, 0644, Tar::GNU]
|
||||||
|
|
||||||
|
def execute!
|
||||||
|
setup_box_dir
|
||||||
|
decompress
|
||||||
|
end
|
||||||
|
|
||||||
|
def setup_box_dir
|
||||||
|
if File.directory?(box_dir)
|
||||||
|
error_and_exit(<<-msg)
|
||||||
|
This box appears to already exist! Please call `vagrant box remove #{@runner.name}`
|
||||||
|
and then try to add it again.
|
||||||
|
msg
|
||||||
|
end
|
||||||
|
|
||||||
|
FileUtils.mkdir_p(box_dir)
|
||||||
|
end
|
||||||
|
|
||||||
|
def box_dir
|
||||||
|
File.join(Env.boxes_path, @runner.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def decompress
|
||||||
|
Dir.chdir(box_dir) do
|
||||||
|
logger.info "Extracting box to #{box_dir}..."
|
||||||
|
Tar.open(@runner.temp_path, *TAR_OPTIONS) do |tar|
|
||||||
|
tar.extract_all
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -15,6 +15,7 @@ module Vagrant
|
||||||
def dotfile_path; File.join(root_path, Vagrant.config.dotfile_name); end
|
def dotfile_path; File.join(root_path, Vagrant.config.dotfile_name); end
|
||||||
def home_path; File.expand_path(Vagrant.config.vagrant.home); end
|
def home_path; File.expand_path(Vagrant.config.vagrant.home); end
|
||||||
def tmp_path; File.join(home_path, "tmp"); end
|
def tmp_path; File.join(home_path, "tmp"); end
|
||||||
|
def boxes_path; File.join(home_path, "boxes"); end
|
||||||
|
|
||||||
def load!
|
def load!
|
||||||
load_root_path!
|
load_root_path!
|
||||||
|
|
|
@ -2,9 +2,25 @@ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
|
||||||
|
|
||||||
class AddBoxActionTest < Test::Unit::TestCase
|
class AddBoxActionTest < Test::Unit::TestCase
|
||||||
setup do
|
setup do
|
||||||
@wrapper_vm, @vm, @action = mock_action(Vagrant::Actions::Box::Add)
|
@runner, @vm, @action = mock_action(Vagrant::Actions::Box::Add)
|
||||||
mock_config
|
mock_config
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: Everything, once add does anything.
|
context "sub-actions" do
|
||||||
|
setup do
|
||||||
|
@default_order = [Vagrant::Actions::Box::Download, Vagrant::Actions::Box::Unpackage]
|
||||||
|
end
|
||||||
|
|
||||||
|
def setup_action_expectations
|
||||||
|
default_seq = sequence("default_seq")
|
||||||
|
@default_order.each do |action|
|
||||||
|
@runner.expects(:add_action).with(action).once.in_sequence(default_seq)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
should "do the proper actions by default" do
|
||||||
|
setup_action_expectations
|
||||||
|
@action.prepare
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,7 @@ class DownloadBoxActionTest < Test::Unit::TestCase
|
||||||
@uri = "foo.com"
|
@uri = "foo.com"
|
||||||
@runner, @vm, @action = mock_action(Vagrant::Actions::Box::Download)
|
@runner, @vm, @action = mock_action(Vagrant::Actions::Box::Download)
|
||||||
@runner.stubs(:uri).returns(@uri)
|
@runner.stubs(:uri).returns(@uri)
|
||||||
|
@runner.stubs(:temp_path=)
|
||||||
mock_config
|
mock_config
|
||||||
|
|
||||||
Vagrant::Env.stubs(:tmp_path).returns("foo")
|
Vagrant::Env.stubs(:tmp_path).returns("foo")
|
||||||
|
@ -12,7 +13,13 @@ class DownloadBoxActionTest < Test::Unit::TestCase
|
||||||
|
|
||||||
context "executing" do
|
context "executing" do
|
||||||
setup do
|
setup do
|
||||||
|
@path = "foo"
|
||||||
|
|
||||||
@tempfile = mock("tempfile")
|
@tempfile = mock("tempfile")
|
||||||
|
@tempfile.stubs(:path).returns(@path)
|
||||||
|
|
||||||
|
@action.stubs(:with_tempfile).yields(@tempfile)
|
||||||
|
@action.stubs(:copy_uri_to)
|
||||||
end
|
end
|
||||||
|
|
||||||
should "make a tempfile and copy the URI contents to it" do
|
should "make a tempfile and copy the URI contents to it" do
|
||||||
|
@ -20,6 +27,11 @@ class DownloadBoxActionTest < Test::Unit::TestCase
|
||||||
@action.expects(:copy_uri_to).with(@tempfile)
|
@action.expects(:copy_uri_to).with(@tempfile)
|
||||||
@action.execute!
|
@action.execute!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "save the tempfile path" do
|
||||||
|
@runner.expects(:temp_path=).with(@path).once
|
||||||
|
@action.execute!
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "tempfile" do
|
context "tempfile" do
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
|
||||||
|
|
||||||
|
class UnpackageBoxActionTest < Test::Unit::TestCase
|
||||||
|
setup do
|
||||||
|
@runner, @vm, @action = mock_action(Vagrant::Actions::Box::Unpackage)
|
||||||
|
@runner.stubs(:name).returns("foo")
|
||||||
|
@runner.stubs(:temp_path).returns("bar")
|
||||||
|
mock_config
|
||||||
|
|
||||||
|
Vagrant::Env.stubs(:boxes_path).returns("bar")
|
||||||
|
end
|
||||||
|
|
||||||
|
context "executing" do
|
||||||
|
should "execute the proper actions in the proper order" do
|
||||||
|
exec_seq = sequence("exec_seq")
|
||||||
|
@action.expects(:setup_box_dir).in_sequence(exec_seq)
|
||||||
|
@action.expects(:decompress).in_sequence(exec_seq)
|
||||||
|
@action.execute!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "box directory" do
|
||||||
|
setup do
|
||||||
|
@box_dir = File.join(Vagrant::Env.boxes_path, @runner.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return the boxes_path joined with the name" do
|
||||||
|
assert_equal @box_dir, @action.box_dir
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "setting up the box directory" do
|
||||||
|
setup do
|
||||||
|
File.stubs(:directory?).returns(false)
|
||||||
|
FileUtils.stubs(:mkdir_p)
|
||||||
|
|
||||||
|
@box_dir = "foo"
|
||||||
|
@action.stubs(:box_dir).returns(@box_dir)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "error and exit if the directory exists" do
|
||||||
|
File.expects(:directory?).returns(true)
|
||||||
|
@action.expects(:error_and_exit).once
|
||||||
|
@action.setup_box_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
should "create the directory" do
|
||||||
|
FileUtils.expects(:mkdir_p).with(@box_dir).once
|
||||||
|
@action.setup_box_dir
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "decompressing" do
|
||||||
|
setup do
|
||||||
|
@box_dir = "foo"
|
||||||
|
|
||||||
|
@action.stubs(:box_dir).returns(@box_dir)
|
||||||
|
Dir.stubs(:chdir).yields
|
||||||
|
end
|
||||||
|
|
||||||
|
should "change to the box directory" do
|
||||||
|
Dir.expects(:chdir).with(@box_dir)
|
||||||
|
@action.decompress
|
||||||
|
end
|
||||||
|
|
||||||
|
should "open the tar file within the new directory, and extract it all" do
|
||||||
|
@tar = mock("tar")
|
||||||
|
@tar.expects(:extract_all).once
|
||||||
|
Tar.expects(:open).with(@runner.temp_path, anything, anything, anything).yields(@tar)
|
||||||
|
@action.decompress
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -191,5 +191,11 @@ class EnvTest < Test::Unit::TestCase
|
||||||
Vagrant::Env.stubs(:home_path).returns(@home_path)
|
Vagrant::Env.stubs(:home_path).returns(@home_path)
|
||||||
assert_equal File.join(@home_path, "tmp"), Vagrant::Env.tmp_path
|
assert_equal File.join(@home_path, "tmp"), Vagrant::Env.tmp_path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "return the boxes path" do
|
||||||
|
@home_path = "foo"
|
||||||
|
Vagrant::Env.stubs(:home_path).returns(@home_path)
|
||||||
|
assert_equal File.join(@home_path, "boxes"), Vagrant::Env.boxes_path
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue