New HandleBoxUrl built-in middleware to handlet the "box_url" config

This commit is contained in:
Mitchell Hashimoto 2013-02-01 11:28:51 -08:00
parent 3b75652256
commit 165dd63f78
6 changed files with 53 additions and 41 deletions

View File

@ -15,6 +15,7 @@ module Vagrant
autoload :ConfigValidate, "vagrant/action/builtin/config_validate"
autoload :EnvSet, "vagrant/action/builtin/env_set"
autoload :GracefulHalt, "vagrant/action/builtin/graceful_halt"
autoload :HandleBoxUrl, "vagrant/action/builtin/handle_box_url"
autoload :Lock, "vagrant/action/builtin/lock"
autoload :Provision, "vagrant/action/builtin/provision"
autoload :SSHExec, "vagrant/action/builtin/ssh_exec"

View File

@ -0,0 +1,43 @@
module Vagrant
module Action
module Builtin
# This built-in middleware handles the `box_url` setting, downloading
# the box if necessary. You should place this early in your middleware
# sequence for a provider after configuration validation but before
# you attempt to use any box.
class HandleBoxUrl
def initialize(app, env)
@app = app
end
def call(env)
if !env[:machine].box
# We can assume a box URL is set because the Vagrantfile
# validation should do this for us. If not, though, we do
# raise a terrible runtime error.
box_name = env[:machine].config.vm.box
box_url = env[:machine].config.vm.box_url
# 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)
env[:action_runner].run(Vagrant::Action.action_box_add, {
:box_name => box_name,
:box_provider => env[:machine].provider_name,
:box_url => box_url
})
# 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)
end
@app.call(env)
end
end
end
end
end

View File

@ -119,7 +119,7 @@ module Vagrant
next if data.empty?
io_name = r == stdout ? :stdout : :stderr
@logger.debug("#{io_name}: #{data}")
@logger.debug("#{io_name}: #{data.chomp}")
io_data[io_name] += data
yield io_name, data if block_given? && notify_table[io_name]
@ -161,7 +161,7 @@ module Vagrant
# Log it out and accumulate
io_name = io == stdout ? :stdout : :stderr
io_data[io_name] += extra_data
@logger.debug("#{io_name}: #{extra_data}")
@logger.debug("#{io_name}: #{extra_data.chomp}")
# Yield to any listeners any remaining data
yield io_name, extra_data if block_given?

View File

@ -5,7 +5,6 @@ module VagrantPlugins
module Action
autoload :Boot, File.expand_path("../action/boot", __FILE__)
autoload :CheckAccessible, File.expand_path("../action/check_accessible", __FILE__)
autoload :CheckBox, File.expand_path("../action/check_box", __FILE__)
autoload :CheckCreated, File.expand_path("../action/check_created", __FILE__)
autoload :CheckGuestAdditions, File.expand_path("../action/check_guest_additions", __FILE__)
autoload :CheckPortCollisions, File.expand_path("../action/check_port_collisions", __FILE__)
@ -293,7 +292,7 @@ module VagrantPlugins
# If the VM is NOT created yet, then do the setup steps
if !env[:result]
b2.use CheckAccessible
b2.use CheckBox
b2.use HandleBoxUrl
b2.use Import
b2.use CheckGuestAdditions
b2.use MatchMACAddress

View File

@ -1,36 +0,0 @@
module VagrantPlugins
module ProviderVirtualBox
module Action
class CheckBox
def initialize(app, env)
@app = app
end
def call(env)
box_name = env[:machine].config.vm.box
raise Vagrant::Errors::BoxNotSpecified if !box_name
if !env[:box_collection].find(box_name, :virtualbox)
box_url = env[:machine].config.vm.box_url
raise Vagrant::Errors::BoxSpecifiedDoesntExist, :name => box_name if !box_url
# 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)
env[:action_runner].run(Vagrant::Action.action_box_add, {
:box_name => box_name,
:box_provider => env[:machine].provider_name,
:box_url => box_url
})
# 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)
end
@app.call(env)
end
end
end
end
end

View File

@ -500,7 +500,12 @@ en:
Specific bridge '%{bridge}' not found. You may be asked to specify
which network to bridge to.
check_box:
not_found: Box %{name} was not found. Fetching box from specified URL...
not_found: |-
Box '%{name}' was not found. Fetching box from specified URL for
the provider '%{provider}'. Note that if the URL does not have
a box for this provider, you should interrupt Vagrant now and add
the box yourself. Otherwise Vagrant will attempt to download the
full box prior to discovering this error.
not_specified: |-
No base box was specified! A base box is required as a staring point
for every vagrant virtual machine. Please specify one in your Vagrantfile