core: prefer providers in the Vagrantfile [GH-3812]
This commit is contained in:
parent
b656bf4ae5
commit
ad758bf69a
|
@ -1,5 +1,10 @@
|
||||||
## 1.7.0 (unreleased)
|
## 1.7.0 (unreleased)
|
||||||
|
|
||||||
|
FEATURES:
|
||||||
|
|
||||||
|
- Default provider logic improved: Providers in `config.vm.provider` blocks
|
||||||
|
in your Vagrantfile now have higher priority than plugins. [GH-3812]
|
||||||
|
|
||||||
IMPROVEMENTS:
|
IMPROVEMENTS:
|
||||||
|
|
||||||
- core: `has_plugin?` function now takes a second argument which is a
|
- core: `has_plugin?` function now takes a second argument which is a
|
||||||
|
|
|
@ -308,6 +308,13 @@ module Vagrant
|
||||||
# that (the default behavior)
|
# that (the default behavior)
|
||||||
return default if default && opts[:force_default]
|
return default if default && opts[:force_default]
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
config = {}
|
||||||
|
vagrantfile.config.vm.__providers.each_with_index do |key, idx|
|
||||||
|
config[key] = idx
|
||||||
|
end
|
||||||
|
|
||||||
ordered = []
|
ordered = []
|
||||||
Vagrant.plugin("2").manager.providers.each do |key, data|
|
Vagrant.plugin("2").manager.providers.each do |key, data|
|
||||||
impl = data[0]
|
impl = data[0]
|
||||||
|
@ -319,7 +326,17 @@ module Vagrant
|
||||||
# Skip providers that can't be defaulted
|
# Skip providers that can't be defaulted
|
||||||
next if popts.has_key?(:defaultable) && !popts[:defaultable]
|
next if popts.has_key?(:defaultable) && !popts[:defaultable]
|
||||||
|
|
||||||
ordered << [popts[:priority], key, impl, popts]
|
# The priority is higher if it is in our config. Otherwise, it is
|
||||||
|
# the priority it set PLUS the length of the config to make sure it
|
||||||
|
# is never higher than the configuration keys.
|
||||||
|
priority = config[key]
|
||||||
|
priority ||= popts[:priority] + config.length
|
||||||
|
|
||||||
|
# If we have config, we multiply by -1 so that the ordering is
|
||||||
|
# such that the smallest numbers win.
|
||||||
|
priority *= -1 if !config.empty?
|
||||||
|
|
||||||
|
ordered << [priority, key, impl, popts]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Order the providers by priority. Higher values are tried first.
|
# Order the providers by priority. Higher values are tried first.
|
||||||
|
|
|
@ -63,6 +63,7 @@ module VagrantPlugins
|
||||||
@__finalized = false
|
@__finalized = false
|
||||||
@__networks = {}
|
@__networks = {}
|
||||||
@__providers = {}
|
@__providers = {}
|
||||||
|
@__provider_order = []
|
||||||
@__provider_overrides = {}
|
@__provider_overrides = {}
|
||||||
@__synced_folders = {}
|
@__synced_folders = {}
|
||||||
end
|
end
|
||||||
|
@ -112,6 +113,12 @@ module VagrantPlugins
|
||||||
new_providers[key] += blocks
|
new_providers[key] += blocks
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Merge the provider ordering. Anything defined in our CURRENT
|
||||||
|
# scope is before anything else.
|
||||||
|
other_order = other.instance_variable_get(:@__provider_order)
|
||||||
|
new_order = @__provider_order.dup
|
||||||
|
new_order = (new_order + other_order).uniq
|
||||||
|
|
||||||
# Merge the provider overrides by appending them...
|
# Merge the provider overrides by appending them...
|
||||||
other_overrides = other.instance_variable_get(:@__provider_overrides)
|
other_overrides = other.instance_variable_get(:@__provider_overrides)
|
||||||
new_overrides = @__provider_overrides.dup
|
new_overrides = @__provider_overrides.dup
|
||||||
|
@ -162,6 +169,7 @@ module VagrantPlugins
|
||||||
result.instance_variable_set(:@__defined_vm_keys, new_defined_vm_keys)
|
result.instance_variable_set(:@__defined_vm_keys, new_defined_vm_keys)
|
||||||
result.instance_variable_set(:@__defined_vms, new_defined_vms)
|
result.instance_variable_set(:@__defined_vms, new_defined_vms)
|
||||||
result.instance_variable_set(:@__providers, new_providers)
|
result.instance_variable_set(:@__providers, new_providers)
|
||||||
|
result.instance_variable_set(:@__provider_order, new_order)
|
||||||
result.instance_variable_set(:@__provider_overrides, new_overrides)
|
result.instance_variable_set(:@__provider_overrides, new_overrides)
|
||||||
result.instance_variable_set(:@__synced_folders, new_folders)
|
result.instance_variable_set(:@__synced_folders, new_folders)
|
||||||
end
|
end
|
||||||
|
@ -255,6 +263,9 @@ module VagrantPlugins
|
||||||
@__providers[name] ||= []
|
@__providers[name] ||= []
|
||||||
@__provider_overrides[name] ||= []
|
@__provider_overrides[name] ||= []
|
||||||
|
|
||||||
|
# Add the provider to the ordering list
|
||||||
|
@__provider_order << name
|
||||||
|
|
||||||
if block_given?
|
if block_given?
|
||||||
@__providers[name] << block if block_given?
|
@__providers[name] << block if block_given?
|
||||||
|
|
||||||
|
@ -676,6 +687,10 @@ module VagrantPlugins
|
||||||
|
|
||||||
errors
|
errors
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def __providers
|
||||||
|
@__provider_order
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -262,6 +262,41 @@ describe VagrantPlugins::Kernel_V2::VMConfig do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#provider and #__providers" do
|
||||||
|
it "returns the providers in order" do
|
||||||
|
subject.provider "foo"
|
||||||
|
subject.provider "bar"
|
||||||
|
subject.finalize!
|
||||||
|
|
||||||
|
expect(subject.__providers).to eq([:foo, :bar])
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "merging" do
|
||||||
|
it "prioritizes new orders in later configs" do
|
||||||
|
subject.provider "foo"
|
||||||
|
|
||||||
|
other = described_class.new
|
||||||
|
other.provider "bar"
|
||||||
|
|
||||||
|
merged = subject.merge(other)
|
||||||
|
|
||||||
|
expect(merged.__providers).to eq([:foo, :bar])
|
||||||
|
end
|
||||||
|
|
||||||
|
it "prioritizes duplicates in new orders in later configs" do
|
||||||
|
subject.provider "foo"
|
||||||
|
|
||||||
|
other = described_class.new
|
||||||
|
other.provider "bar"
|
||||||
|
other.provider "foo"
|
||||||
|
|
||||||
|
merged = subject.merge(other)
|
||||||
|
|
||||||
|
expect(merged.__providers).to eq([:foo, :bar])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "#provider and #get_provider_config" do
|
describe "#provider and #get_provider_config" do
|
||||||
it "compiles the configurations for a provider" do
|
it "compiles the configurations for a provider" do
|
||||||
subject.provider "virtualbox" do |vb|
|
subject.provider "virtualbox" do |vb|
|
||||||
|
|
|
@ -807,6 +807,34 @@ VF
|
||||||
expect(subject.default_provider).to eq(:virtualbox)
|
expect(subject.default_provider).to eq(:virtualbox)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "is the provider in the Vagrantfile that is usable" do
|
||||||
|
subject.vagrantfile.config.vm.provider "foo"
|
||||||
|
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).to eq(:foo)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "is the provider in the Vagrantfile that is usable" do
|
||||||
|
subject.vagrantfile.config.vm.provider "foo"
|
||||||
|
subject.vagrantfile.config.vm.finalize!
|
||||||
|
|
||||||
|
plugin_providers[:foo] = [provider_usable_class(false), { 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).to eq(:bar)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "local data path" do
|
describe "local data path" do
|
||||||
|
|
Loading…
Reference in New Issue