core: Environment#default_provider can look into machines

This commit is contained in:
Mitchell Hashimoto 2014-10-23 15:52:42 -07:00
parent 4d85e0e145
commit 768d453739
4 changed files with 66 additions and 19 deletions

View File

@ -308,10 +308,19 @@ module Vagrant
# that (the default behavior) # that (the default behavior)
return default if default && opts[:force_default] return default if default && opts[:force_default]
# Determine the config to use to look for provider definitions. By
# default it is the global but if we're targeting a specific machine,
# then look there.
root_config = vagrantfile.config
if opts[:machine]
machine_info = vagrantfile.machine_config(opts[:machine], nil, nil)
root_config = machine_info[:config]
end
# Get the list of providers within our configuration and assign # Get the list of providers within our configuration and assign
# a priority to each in the order they exist so that we try these first. # a priority to each in the order they exist so that we try these first.
config = {} config = {}
vagrantfile.config.vm.__providers.each_with_index do |key, idx| root_config.vm.__providers.each_with_index do |key, idx|
config[key] = idx config[key] = idx
end end

View File

@ -114,6 +114,11 @@ module Vagrant
name: name, provider: provider name: name, provider: provider
end end
provider_plugin = nil
provider_cls = nil
provider_options = {}
box_formats = nil
if provider != nil
provider_plugin = Vagrant.plugin("2").manager.providers[provider] provider_plugin = Vagrant.plugin("2").manager.providers[provider]
if !provider_plugin if !provider_plugin
raise Errors::ProviderNotFound, raise Errors::ProviderNotFound,
@ -133,6 +138,7 @@ module Vagrant
provider: provider.to_s, provider: provider.to_s,
message: e.to_s message: e.to_s
end end
end
# Add the sub-machine configuration to the loader and keys # Add the sub-machine configuration to the loader and keys
vm_config_key = "#{object_id}_machine_#{name}" vm_config_key = "#{object_id}_machine_#{name}"
@ -153,7 +159,7 @@ module Vagrant
local_keys = keys.dup local_keys = keys.dup
# Load the box Vagrantfile, if there is one # Load the box Vagrantfile, if there is one
if config.vm.box if config.vm.box && boxes
box = boxes.find(config.vm.box, box_formats, config.vm.box_version) box = boxes.find(config.vm.box, box_formats, config.vm.box_version)
if box if box
box_vagrantfile = find_vagrantfile(box.directory) box_vagrantfile = find_vagrantfile(box.directory)

View File

@ -822,7 +822,7 @@ VF
end end
end end
it "is the provider in the Vagrantfile that is usable" do it "is the highest usable provider outside the Vagrantfile" do
subject.vagrantfile.config.vm.provider "foo" subject.vagrantfile.config.vm.provider "foo"
subject.vagrantfile.config.vm.finalize! subject.vagrantfile.config.vm.finalize!
@ -835,6 +835,23 @@ VF
expect(subject.default_provider).to eq(:bar) expect(subject.default_provider).to eq(:bar)
end end
end end
it "is the provider in the Vagrantfile that is usable for a machine" do
subject.vagrantfile.config.vm.provider "foo"
subject.vagrantfile.config.vm.define "sub" do |v|
v.vm.provider "bar"
end
subject.vagrantfile.config.vm.finalize!
plugin_providers[:foo] = [provider_usable_class(true), { priority: 5 }]
plugin_providers[:bar] = [provider_usable_class(true), { priority: 7 }]
plugin_providers[:baz] = [provider_usable_class(true), { priority: 2 }]
plugin_providers[:boom] = [provider_usable_class(true), { priority: 3 }]
with_temp_env("VAGRANT_DEFAULT_PROVIDER" => nil) do
expect(subject.default_provider(machine: :sub)).to eq(:bar)
end
end
end end
describe "local data path" do describe "local data path" do

View File

@ -149,6 +149,21 @@ describe Vagrant::Vagrantfile do
expect(results[:provider_cls]).to equal(provider_cls) expect(results[:provider_cls]).to equal(provider_cls)
end end
it "configures without a provider or boxes" do
register_provider("foo")
configure do |config|
config.vm.box = "foo"
end
results = subject.machine_config(:default, nil, nil)
box = results[:box]
config = results[:config]
expect(config.vm.box).to eq("foo")
expect(box).to be_nil
expect(results[:provider_cls]).to be_nil
end
it "configures with sub-machine config" do it "configures with sub-machine config" do
register_provider("foo") register_provider("foo")