core: Vagrant::Environment uses new host settings
This commit is contained in:
parent
21a610b59b
commit
93e365bb33
|
@ -487,22 +487,33 @@ module Vagrant
|
||||||
def host
|
def host
|
||||||
return @host if defined?(@host)
|
return @host if defined?(@host)
|
||||||
|
|
||||||
# Attempt to figure out the host class. Note that the order
|
# Determine the host class to use. ":detect" is an old Vagrant config
|
||||||
# matters here, so please don't touch. Specifically: The symbol
|
# that shouldn't be valid anymore, but we respect it here by assuming
|
||||||
# check is done after the detect check because the symbol check
|
# its old behavior. No need to deprecate this because I thin it is
|
||||||
# will return nil, and we don't want to trigger a detect load.
|
# fairly harmless.
|
||||||
host_klass = config_global.vagrant.host
|
host_klass = config_global.vagrant.host
|
||||||
if host_klass.nil? || host_klass == :detect
|
host_klass = nil if host_klass == :detect
|
||||||
hosts = Vagrant.plugin("2").manager.hosts.to_hash
|
|
||||||
|
|
||||||
# Get the flattened list of available hosts
|
begin
|
||||||
host_klass = Hosts.detect(hosts)
|
@host = Host.new(
|
||||||
|
host_klass,
|
||||||
|
Vagrant.plugin("2").manager.hosts,
|
||||||
|
Vagrant.plugin("2").manager.host_capabilities)
|
||||||
|
rescue Errors::CapabilityHostNotDetected
|
||||||
|
# If the auto-detect failed, then we create a brand new host
|
||||||
|
# with no capabilities and use that. This should almost never happen
|
||||||
|
# since Vagrant works on most host OS's now, so this is a "slow path"
|
||||||
|
klass = Class.new(Vagrant.plugin("2", :host)) do
|
||||||
|
def detect?; true; end
|
||||||
|
end
|
||||||
|
|
||||||
|
hosts = { generic: [klass, nil] }
|
||||||
|
host_caps = {}
|
||||||
|
|
||||||
|
@host = Host.new(:generic, hosts, host_caps)
|
||||||
|
rescue Errors::CapabilityHostExplicitNotDetected => e
|
||||||
|
raise Errors::HostExplicitNotDetected, e.extra_data
|
||||||
end
|
end
|
||||||
|
|
||||||
# If no host class is detected, we use the base class.
|
|
||||||
host_klass ||= Vagrant.plugin("2", :host)
|
|
||||||
|
|
||||||
@host ||= host_klass.new(@ui)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Action runner for executing actions in the context of this environment.
|
# Action runner for executing actions in the context of this environment.
|
||||||
|
|
|
@ -333,6 +333,10 @@ module Vagrant
|
||||||
error_key(:guest_not_detected)
|
error_key(:guest_not_detected)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class HostExplicitNotDetected < VagrantError
|
||||||
|
error_key(:host_explicit_not_detected)
|
||||||
|
end
|
||||||
|
|
||||||
class LinuxMountFailed < VagrantError
|
class LinuxMountFailed < VagrantError
|
||||||
error_key(:linux_mount_failed)
|
error_key(:linux_mount_failed)
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,16 +14,6 @@ module Vagrant
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
# Initializes a new host class.
|
|
||||||
#
|
|
||||||
# The only required parameter is a UI object so that the host
|
|
||||||
# objects have some way to communicate with the outside world.
|
|
||||||
#
|
|
||||||
# @param [UI] ui UI for the hosts to output to.
|
|
||||||
def initialize(ui)
|
|
||||||
@ui = ui
|
|
||||||
end
|
|
||||||
|
|
||||||
# Returns true of false denoting whether or not this host supports
|
# Returns true of false denoting whether or not this host supports
|
||||||
# NFS shared folder setup. This method ideally should verify that
|
# NFS shared folder setup. This method ideally should verify that
|
||||||
# NFS is installed.
|
# NFS is installed.
|
||||||
|
|
|
@ -5,6 +5,15 @@ module VagrantPlugins
|
||||||
class VagrantConfig < Vagrant.plugin("2", :config)
|
class VagrantConfig < Vagrant.plugin("2", :config)
|
||||||
attr_accessor :host
|
attr_accessor :host
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@host = UNSET_VALUE
|
||||||
|
end
|
||||||
|
|
||||||
|
def finalize!
|
||||||
|
@host = nil if @host == UNSET_VALUE
|
||||||
|
@host = @host.to_sym if @host
|
||||||
|
end
|
||||||
|
|
||||||
def to_s
|
def to_s
|
||||||
"Vagrant"
|
"Vagrant"
|
||||||
end
|
end
|
||||||
|
|
|
@ -412,6 +412,11 @@ en:
|
||||||
directory that Vagrant uses must be both readable and writable.
|
directory that Vagrant uses must be both readable and writable.
|
||||||
|
|
||||||
You specified: %{home_path}
|
You specified: %{home_path}
|
||||||
|
host_explicit_not_detected: |-
|
||||||
|
The host implementation explicitly specified in your Vagrantfile
|
||||||
|
("%{value}") could not be found. Please verify that the plugin is
|
||||||
|
installed which implements this host and that the value you used
|
||||||
|
for `config.vagrant.host` is correct.
|
||||||
interrupted: |-
|
interrupted: |-
|
||||||
Vagrant exited after cleanup due to external interrupt.
|
Vagrant exited after cleanup due to external interrupt.
|
||||||
local_data_dir_not_accessible: |-
|
local_data_dir_not_accessible: |-
|
||||||
|
|
|
@ -8,6 +8,7 @@ require "vagrant/util/file_mode"
|
||||||
|
|
||||||
describe Vagrant::Environment do
|
describe Vagrant::Environment do
|
||||||
include_context "unit"
|
include_context "unit"
|
||||||
|
include_context "capability_helpers"
|
||||||
|
|
||||||
let(:env) do
|
let(:env) do
|
||||||
isolated_environment.tap do |e|
|
isolated_environment.tap do |e|
|
||||||
|
@ -21,9 +22,83 @@ describe Vagrant::Environment do
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:instance) { env.create_vagrant_env }
|
let(:instance) { env.create_vagrant_env }
|
||||||
|
|
||||||
subject { instance }
|
subject { instance }
|
||||||
|
|
||||||
|
describe "#host" do
|
||||||
|
let(:plugin_hosts) { {} }
|
||||||
|
let(:plugin_host_caps) { {} }
|
||||||
|
|
||||||
|
before do
|
||||||
|
m = Vagrant.plugin("2").manager
|
||||||
|
m.stub(hosts: plugin_hosts)
|
||||||
|
m.stub(host_capabilities: plugin_host_caps)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should default to some host even if there are none" do
|
||||||
|
env.vagrantfile <<-VF
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vagrant.host = nil
|
||||||
|
end
|
||||||
|
VF
|
||||||
|
|
||||||
|
expect(subject.host).to be
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should attempt to detect a host if no host is set" do
|
||||||
|
env.vagrantfile <<-VF
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vagrant.host = nil
|
||||||
|
end
|
||||||
|
VF
|
||||||
|
|
||||||
|
plugin_hosts[:foo] = [detect_class(true), nil]
|
||||||
|
plugin_host_caps[:foo] = { bar: Class }
|
||||||
|
|
||||||
|
result = subject.host
|
||||||
|
expect(result.capability?(:bar)).to be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should attempt to detect a host if host is :detect" do
|
||||||
|
env.vagrantfile <<-VF
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vagrant.host = :detect
|
||||||
|
end
|
||||||
|
VF
|
||||||
|
|
||||||
|
plugin_hosts[:foo] = [detect_class(true), nil]
|
||||||
|
plugin_host_caps[:foo] = { bar: Class }
|
||||||
|
|
||||||
|
result = subject.host
|
||||||
|
expect(result.capability?(:bar)).to be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should use an exact host if specified" do
|
||||||
|
env.vagrantfile <<-VF
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vagrant.host = "foo"
|
||||||
|
end
|
||||||
|
VF
|
||||||
|
|
||||||
|
plugin_hosts[:foo] = [detect_class(false), nil]
|
||||||
|
plugin_hosts[:bar] = [detect_class(true), nil]
|
||||||
|
plugin_host_caps[:foo] = { bar: Class }
|
||||||
|
|
||||||
|
result = subject.host
|
||||||
|
expect(result.capability?(:bar)).to be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should raise an error if an exact match was specified but not found" do
|
||||||
|
env.vagrantfile <<-VF
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vagrant.host = "bar"
|
||||||
|
end
|
||||||
|
VF
|
||||||
|
|
||||||
|
expect { subject.host }.
|
||||||
|
to raise_error(Vagrant::Errors::HostExplicitNotDetected)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "active machines" do
|
describe "active machines" do
|
||||||
it "should be empty if the machines folder doesn't exist" do
|
it "should be empty if the machines folder doesn't exist" do
|
||||||
folder = instance.local_data_path.join("machines")
|
folder = instance.local_data_path.join("machines")
|
||||||
|
|
Loading…
Reference in New Issue