From b23ad41c401b415e439744aa292448e52b220a72 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 24 Jan 2014 11:17:23 -0800 Subject: [PATCH] core: HandleBox reloads the box --- lib/vagrant/action/builtin/handle_box.rb | 95 ++----------------- .../vagrant/action/builtin/handle_box_test.rb | 45 +++++++-- 2 files changed, 43 insertions(+), 97 deletions(-) diff --git a/lib/vagrant/action/builtin/handle_box.rb b/lib/vagrant/action/builtin/handle_box.rb index eab2ed410..6aea7d9ea 100644 --- a/lib/vagrant/action/builtin/handle_box.rb +++ b/lib/vagrant/action/builtin/handle_box.rb @@ -33,20 +33,17 @@ module Vagrant end lock.synchronize do - if !machine.config.vm.box_url - handle_metadata_box(env) - else - handle_direct_box(env) - end + handle_box(env) end + # Reload the environment and set the VM to be the new loaded VM. + env[:machine] = env[:machine].env.machine( + env[:machine].name, env[:machine].provider_name, true) + @app.call(env) end - def handle_direct_box(env) - end - - def handle_metadata_box(env) + def handle_box(env) machine = env[:machine] if machine.box @@ -68,7 +65,8 @@ module Vagrant begin env[:action_runner].run(Vagrant::Action.action_box_add, env.merge({ - box_url: machine.config.vm.box, + box_name: machine.config.vm.box, + box_url: machine.config.vm.box_url || machine.config.vm.box, box_provider: box_formats, box_version: machine.config.vm.box_version, box_client_cert: box_download_client_cert, @@ -80,83 +78,6 @@ module Vagrant # This can happen in a multi-threaded environment. end end - -=begin - def call(env) - if !env[:machine].config.vm.box || !env[:machine].config.vm.box_url - @logger.info("Skipping HandleBoxUrl because box or box_url not set.") - @app.call(env) - return - end - - if env[:machine].box - @logger.info("Skipping HandleBoxUrl because box is already available") - @app.call(env) - return - end - - # Get a "big lock" to make sure that our more fine grained - # lock access is thread safe. - lock = nil - @@big_lock.synchronize do - lock = @@handle_box_url_locks[env[:machine].config.vm.box] - end - - box_name = env[:machine].config.vm.box - box_url = env[:machine].config.vm.box_url - box_download_ca_cert = env[:machine].config.vm.box_download_ca_cert - box_download_checksum = env[:machine].config.vm.box_download_checksum - box_download_checksum_type = env[:machine].config.vm.box_download_checksum_type - box_download_client_cert = env[:machine].config.vm.box_download_client_cert - box_download_insecure = env[:machine].config.vm.box_download_insecure - - # Expand the CA cert file relative to the Vagrantfile path, if - # there is one. - if box_download_ca_cert - box_download_ca_cert = File.expand_path( - box_download_ca_cert, env[:machine].env.root_path) - end - - lock.synchronize do - # Check that we don't already have the box, which can happen - # if we're slow to acquire the lock because of another thread - box_formats = env[:machine].provider_options[:box_format] || - env[:machine].provider_name - if env[:box_collection].find(box_name, box_formats) - break - end - - # Add the box then reload the box collection so that it becomes - # aware of it. - env[:ui].info I18n.t( - "vagrant.actions.vm.check_box.not_found", - :name => box_name, - :provider => env[:machine].provider_name) - - begin - env[:action_runner].run(Vagrant::Action.action_box_add, { - :box_checksum => box_download_checksum, - :box_checksum_type => box_download_checksum_type, - :box_client_cert => box_download_client_cert, - :box_download_ca_cert => box_download_ca_cert, - :box_download_insecure => box_download_insecure, - :box_name => box_name, - :box_provider => box_formats, - :box_url => box_url, - }) - rescue Errors::BoxAlreadyExists - # Just ignore this, since it means the next part will succeed! - # This can happen in a multi-threaded environment. - end - end - - # Reload the environment and set the VM to be the new loaded VM. - env[:machine] = env[:machine].env.machine( - env[:machine].name, env[:machine].provider_name, true) - - @app.call(env) - end -=end end end end diff --git a/test/unit/vagrant/action/builtin/handle_box_test.rb b/test/unit/vagrant/action/builtin/handle_box_test.rb index b2a53800a..5ddbf7b7f 100644 --- a/test/unit/vagrant/action/builtin/handle_box_test.rb +++ b/test/unit/vagrant/action/builtin/handle_box_test.rb @@ -37,24 +37,25 @@ describe Vagrant::Action::Builtin::HandleBox do subject.call(env) end - context "without a box_url" do + it "doesn't do anything if a box exists" do + machine.stub(box: box) + + action_runner.should_receive(:run).never + app.should_receive(:call).with(env) + + subject.call(env) + end + + context "with a box set and no box_url" do before do machine.stub(box: nil) machine.config.vm.box = "foo" end - it "doesn't do anything if a box exists" do - machine.stub(box: box) - - action_runner.should_receive(:run).never - app.should_receive(:call).with(env) - - subject.call(env) - end - it "adds a box that doesn't exist" do action_runner.should_receive(:run).with do |action, opts| + expect(opts[:box_name]).to eq(machine.config.vm.box) expect(opts[:box_url]).to eq(machine.config.vm.box) expect(opts[:box_provider]).to eq(:dummy) expect(opts[:box_version]).to eq(machine.config.vm.box_version) @@ -70,6 +71,7 @@ describe Vagrant::Action::Builtin::HandleBox do machine.provider_options[:box_format] = [:foo, :bar] action_runner.should_receive(:run).with do |action, opts| + expect(opts[:box_name]).to eq(machine.config.vm.box) expect(opts[:box_url]).to eq(machine.config.vm.box) expect(opts[:box_provider]).to eq([:foo, :bar]) expect(opts[:box_version]).to eq(machine.config.vm.box_version) @@ -81,4 +83,27 @@ describe Vagrant::Action::Builtin::HandleBox do subject.call(env) end end + + context "with a box and box_url set" do + before do + machine.stub(box: nil) + + machine.config.vm.box = "foo" + machine.config.vm.box_url = "bar" + end + + it "adds a box that doesn't exist" do + action_runner.should_receive(:run).with do |action, opts| + expect(opts[:box_name]).to eq(machine.config.vm.box) + expect(opts[:box_url]).to eq(machine.config.vm.box_url) + expect(opts[:box_provider]).to eq(:dummy) + expect(opts[:box_version]).to eq(machine.config.vm.box_version) + true + end + + app.should_receive(:call).with(env) + + subject.call(env) + end + end end