vagrantup 0.6.9 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/CHANGELOG.md +37 -0
- data/Gemfile +0 -8
- data/README.md +5 -0
- data/config/default.rb +1 -3
- data/contrib/README.md +12 -0
- data/contrib/emacs/vagrant.el +8 -0
- data/contrib/vim/vagrantfile.vim +9 -0
- data/lib/vagrant/action/box/download.rb +0 -1
- data/lib/vagrant/action/box.rb +11 -0
- data/lib/vagrant/action/builtin.rb +1 -2
- data/lib/vagrant/action/env.rb +7 -0
- data/lib/vagrant/action/general.rb +8 -0
- data/lib/vagrant/action/vm/boot.rb +3 -2
- data/lib/vagrant/action/vm/check_box.rb +1 -0
- data/lib/vagrant/action/vm/clean_machine_folder.rb +1 -1
- data/lib/vagrant/action/vm/destroy.rb +1 -1
- data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +7 -12
- data/lib/vagrant/action/vm/network.rb +1 -1
- data/lib/vagrant/action/vm/nfs.rb +3 -1
- data/lib/vagrant/action/vm/provision.rb +14 -25
- data/lib/vagrant/action/vm/share_folders.rb +11 -4
- data/lib/vagrant/action/vm.rb +30 -0
- data/lib/vagrant/action.rb +12 -0
- data/lib/vagrant/command.rb +25 -0
- data/lib/vagrant/config/base.rb +17 -3
- data/lib/vagrant/config/ssh.rb +2 -2
- data/lib/vagrant/config/top.rb +61 -0
- data/lib/vagrant/config/vagrant.rb +1 -6
- data/lib/vagrant/config/vm/provisioner.rb +56 -0
- data/lib/vagrant/config/vm/sub_vm.rb +17 -0
- data/lib/vagrant/config/vm.rb +34 -20
- data/lib/vagrant/config.rb +78 -128
- data/lib/vagrant/downloaders/file.rb +1 -0
- data/lib/vagrant/downloaders/http.rb +9 -0
- data/lib/vagrant/downloaders.rb +7 -0
- data/lib/vagrant/environment.rb +26 -14
- data/lib/vagrant/errors.rb +5 -15
- data/lib/vagrant/hosts.rb +7 -0
- data/lib/vagrant/provisioners/base.rb +19 -1
- data/lib/vagrant/provisioners/chef.rb +31 -52
- data/lib/vagrant/provisioners/chef_server.rb +34 -10
- data/lib/vagrant/provisioners/chef_solo.rb +31 -9
- data/lib/vagrant/provisioners/puppet.rb +111 -60
- data/lib/vagrant/provisioners/puppet_server.rb +57 -0
- data/lib/vagrant/provisioners.rb +8 -0
- data/lib/vagrant/ssh/session.rb +81 -0
- data/lib/vagrant/ssh.rb +6 -76
- data/lib/vagrant/systems/base.rb +16 -1
- data/lib/vagrant/systems/debian.rb +26 -0
- data/lib/vagrant/systems/gentoo.rb +27 -0
- data/lib/vagrant/systems/linux/config.rb +21 -0
- data/lib/vagrant/systems/linux/error.rb +9 -0
- data/lib/vagrant/systems/linux.rb +14 -56
- data/lib/vagrant/systems/redhat.rb +31 -0
- data/lib/vagrant/systems.rb +9 -0
- data/lib/vagrant/test_helpers.rb +1 -1
- data/lib/vagrant/version.rb +1 -1
- data/lib/vagrant/vm.rb +25 -5
- data/lib/vagrant.rb +14 -18
- data/templates/chef_solo_solo.erb +11 -3
- data/templates/commands/init/Vagrantfile.erb +13 -11
- data/templates/locales/en.yml +76 -26
- data/templates/{network_entry.erb → network_entry_debian.erb} +0 -0
- data/templates/network_entry_gentoo.erb +7 -0
- data/templates/network_entry_redhat.erb +8 -0
- data/templates/ssh_config.erb +1 -1
- data/test/vagrant/action/vm/check_box_test.rb +1 -0
- data/test/vagrant/action/vm/clean_machine_folder_test.rb +6 -4
- data/test/vagrant/action/vm/destroy_test.rb +1 -1
- data/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +10 -7
- data/test/vagrant/action/vm/nfs_test.rb +7 -1
- data/test/vagrant/action/vm/provision_test.rb +24 -79
- data/test/vagrant/action/vm/share_folders_test.rb +6 -1
- data/test/vagrant/command/helpers_test.rb +2 -2
- data/test/vagrant/config/base_test.rb +0 -6
- data/test/vagrant/config/vagrant_test.rb +0 -8
- data/test/vagrant/config/vm/provisioner_test.rb +92 -0
- data/test/vagrant/config/vm_test.rb +8 -0
- data/test/vagrant/config_test.rb +49 -89
- data/test/vagrant/downloaders/file_test.rb +18 -4
- data/test/vagrant/environment_test.rb +36 -12
- data/test/vagrant/provisioners/base_test.rb +28 -1
- data/test/vagrant/provisioners/chef_server_test.rb +50 -41
- data/test/vagrant/provisioners/chef_solo_test.rb +39 -16
- data/test/vagrant/provisioners/chef_test.rb +11 -81
- data/test/vagrant/provisioners/puppet_server_test.rb +69 -0
- data/test/vagrant/provisioners/puppet_test.rb +116 -69
- data/test/vagrant/{ssh_session_test.rb → ssh/session_test.rb} +0 -0
- data/test/vagrant/ssh_test.rb +20 -7
- data/test/vagrant/systems/base_test.rb +18 -0
- data/test/vagrant/systems/linux_test.rb +2 -2
- data/test/vagrant/vm_test.rb +33 -5
- data/vagrant.gemspec +6 -5
- metadata +38 -14
- data/lib/vagrant/action/vm/disable_networks.rb +0 -34
- data/lib/vagrant/util/glob_loader.rb +0 -24
- data/test/vagrant/action/vm/disable_networks_test.rb +0 -48
@@ -0,0 +1,56 @@
|
|
1
|
+
module Vagrant
|
2
|
+
class Config
|
3
|
+
class VMConfig < Base
|
4
|
+
# Represents a single configured provisioner for a VM.
|
5
|
+
class Provisioner
|
6
|
+
attr_reader :top
|
7
|
+
attr_reader :shortcut
|
8
|
+
attr_reader :provisioner
|
9
|
+
attr_reader :config
|
10
|
+
|
11
|
+
def initialize(top, shortcut, options=nil, &block)
|
12
|
+
@top = top
|
13
|
+
@shortcut = shortcut
|
14
|
+
@provisioner = shortcut
|
15
|
+
@provisioner = Provisioners::Base.registered[shortcut] if shortcut.is_a?(Symbol)
|
16
|
+
@config = nil
|
17
|
+
|
18
|
+
configure(options, &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Configures the provisioner if it can (if it is valid).
|
22
|
+
def configure(options=nil, &block)
|
23
|
+
# We don't want ancestors to be searched. This is the default in 1.8,
|
24
|
+
# but not in 1.9, hence this hackery.
|
25
|
+
const_args = ["Config"]
|
26
|
+
const_args << false if RUBY_VERSION >= "1.9"
|
27
|
+
|
28
|
+
# We assume that every provisioner has a `Config` class beneath
|
29
|
+
# it for configuring.
|
30
|
+
return if !@provisioner || !@provisioner.const_defined?(*const_args)
|
31
|
+
|
32
|
+
# Instantiate the config class and configure it
|
33
|
+
@config = @provisioner.const_get(*const_args).new
|
34
|
+
@config.top = top
|
35
|
+
@config.set_options(options) if options
|
36
|
+
block.call(@config) if block
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate(errors)
|
40
|
+
if !provisioner
|
41
|
+
# If we don't have a provisioner then the whole thing is invalid.
|
42
|
+
errors.add(I18n.t("vagrant.config.vm.provisioner_not_found", :shortcut => shortcut))
|
43
|
+
return
|
44
|
+
end
|
45
|
+
|
46
|
+
if !(provisioner <= Provisioners::Base)
|
47
|
+
errors.add(I18n.t("vagrant.config.vm.provisioner_invalid_class", :shortcut => shortcut))
|
48
|
+
end
|
49
|
+
|
50
|
+
# Pass on validation to the provisioner config
|
51
|
+
config.validate(errors) if config
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Vagrant
|
2
|
+
class Config
|
3
|
+
class VMConfig < Base
|
4
|
+
# Represents a single sub-VM in a multi-VM environment.
|
5
|
+
class SubVM
|
6
|
+
include Util::StackedProcRunner
|
7
|
+
|
8
|
+
attr_reader :options
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@options = {}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
data/lib/vagrant/config/vm.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'vagrant/config/vm/sub_vm'
|
2
|
+
require 'vagrant/config/vm/provisioner'
|
3
|
+
|
1
4
|
module Vagrant
|
2
5
|
class Config
|
3
6
|
class VMConfig < Base
|
@@ -14,28 +17,17 @@ module Vagrant
|
|
14
17
|
attr_reader :forwarded_ports
|
15
18
|
attr_reader :shared_folders
|
16
19
|
attr_reader :network_options
|
17
|
-
attr_reader :
|
20
|
+
attr_reader :provisioners
|
18
21
|
attr_accessor :disk_image_format
|
19
|
-
attr_accessor :provisioner
|
20
22
|
attr_writer :shared_folder_uid
|
21
23
|
attr_writer :shared_folder_gid
|
22
24
|
attr_accessor :system
|
23
25
|
|
24
|
-
# Represents a SubVM. This class is only used here in the VMs
|
25
|
-
# hash.
|
26
|
-
class SubVM
|
27
|
-
include Util::StackedProcRunner
|
28
|
-
|
29
|
-
def options
|
30
|
-
@options ||= {}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
26
|
def initialize
|
35
27
|
@forwarded_ports = {}
|
36
28
|
@shared_folders = {}
|
37
|
-
@provisioner = nil
|
38
29
|
@network_options = []
|
30
|
+
@provisioners = []
|
39
31
|
end
|
40
32
|
|
41
33
|
def forward_port(name, guestport, hostport, options=nil)
|
@@ -68,6 +60,17 @@ module Vagrant
|
|
68
60
|
@network_options[options[:adapter]] = options
|
69
61
|
end
|
70
62
|
|
63
|
+
def provision(name, options=nil, &block)
|
64
|
+
@provisioners << Provisioner.new(top, name, options, &block)
|
65
|
+
end
|
66
|
+
|
67
|
+
# This shows an error message to smooth the transition for the
|
68
|
+
# backwards incompatible provisioner syntax change introduced
|
69
|
+
# in Vagrant 0.7.0.
|
70
|
+
def provisioner=(_value)
|
71
|
+
raise Errors::VagrantError, :_key => :provisioner_equals_not_supported
|
72
|
+
end
|
73
|
+
|
71
74
|
def shared_folder_uid
|
72
75
|
@shared_folder_uid || env.config.ssh.username
|
73
76
|
end
|
@@ -95,14 +98,25 @@ module Vagrant
|
|
95
98
|
end
|
96
99
|
|
97
100
|
def define(name, options=nil, &block)
|
101
|
+
name = name.to_sym
|
98
102
|
options ||= {}
|
103
|
+
|
104
|
+
# Add the name to the array of VM keys. This array is used to
|
105
|
+
# preserve the order in which VMs are defined.
|
99
106
|
defined_vm_keys << name
|
100
|
-
|
101
|
-
|
102
|
-
defined_vms[name
|
107
|
+
|
108
|
+
# Add the SubVM to the hash of defined VMs
|
109
|
+
defined_vms[name] ||= SubVM.new
|
110
|
+
defined_vms[name].options.merge!(options)
|
111
|
+
defined_vms[name].push_proc(&block)
|
103
112
|
end
|
104
113
|
|
105
114
|
def validate(errors)
|
115
|
+
errors.add(I18n.t("vagrant.config.vm.box_missing")) if !box
|
116
|
+
errors.add(I18n.t("vagrant.config.vm.box_not_found", :name => box)) if box && !box_url && !env.box
|
117
|
+
errors.add(I18n.t("vagrant.config.vm.boot_mode_invalid")) if ![:vrdp, :gui].include?(boot_mode.to_sym)
|
118
|
+
errors.add(I18n.t("vagrant.config.vm.base_mac_invalid")) if env.box && !base_mac
|
119
|
+
|
106
120
|
shared_folders.each do |name, options|
|
107
121
|
if !File.directory?(File.expand_path(options[:hostpath].to_s, env.root_path))
|
108
122
|
errors.add(I18n.t("vagrant.config.vm.shared_folder_hostpath_missing",
|
@@ -111,10 +125,10 @@ module Vagrant
|
|
111
125
|
end
|
112
126
|
end
|
113
127
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
128
|
+
# Each provisioner can validate itself
|
129
|
+
provisioners.each do |prov|
|
130
|
+
prov.validate(errors)
|
131
|
+
end
|
118
132
|
end
|
119
133
|
end
|
120
134
|
end
|
data/lib/vagrant/config.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
require 'vagrant/config/base'
|
2
2
|
require 'vagrant/config/error_recorder'
|
3
|
+
require 'vagrant/config/top'
|
4
|
+
|
5
|
+
# The built-in configuration classes
|
6
|
+
require 'vagrant/config/vagrant'
|
7
|
+
require 'vagrant/config/ssh'
|
8
|
+
require 'vagrant/config/nfs'
|
9
|
+
require 'vagrant/config/vm'
|
10
|
+
require 'vagrant/config/package'
|
3
11
|
|
4
12
|
module Vagrant
|
5
13
|
# The config class is responsible for loading Vagrant configurations, which
|
@@ -17,157 +25,99 @@ module Vagrant
|
|
17
25
|
# class you are looking for. Loading configuration is quite easy. The following
|
18
26
|
# example assumes `env` is already a loaded instance of {Environment}:
|
19
27
|
#
|
20
|
-
# config = Vagrant::Config.new
|
21
|
-
# config.
|
22
|
-
#
|
28
|
+
# config = Vagrant::Config.new
|
29
|
+
# config.set(:first, "/path/to/some/Vagrantfile")
|
30
|
+
# config.set(:second, "/path/to/another/Vagrantfile")
|
31
|
+
# config.load_order = [:first, :second]
|
32
|
+
# result = config.load(env)
|
23
33
|
#
|
24
34
|
# p "Your box is: #{result.vm.box}"
|
25
35
|
#
|
36
|
+
# The load order determines what order the config files specified are loaded.
|
37
|
+
# If a key is not mentioned (for example if above the load order was set to
|
38
|
+
# `[:first]`, therefore `:second` was not mentioned), then that config file
|
39
|
+
# won't be loaded.
|
26
40
|
class Config
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
attr_reader :queue
|
32
|
-
|
33
|
-
class << self
|
34
|
-
# Resets the current loaded config object to the specified environment.
|
35
|
-
# This clears the proc stack and initializes a new {Top} for loading.
|
36
|
-
# This method shouldn't be called directly, instead use an instance of this
|
37
|
-
# class for config loading.
|
38
|
-
#
|
39
|
-
# @param [Environment] env
|
40
|
-
def reset!(env=nil)
|
41
|
-
@@config = nil
|
42
|
-
proc_stack.clear
|
41
|
+
# An array of symbols specifying the load order for the procs.
|
42
|
+
attr_accessor :load_order
|
43
|
+
attr_reader :procs
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# Adds the given proc/block to the stack of config procs which are all
|
56
|
-
# run later on a single config object. This is the main way to configure
|
57
|
-
# Vagrant, and is how all Vagrantfiles are formatted:
|
58
|
-
#
|
59
|
-
# Vagrant::Config.run do |config|
|
60
|
-
# # ...
|
61
|
-
# end
|
62
|
-
#
|
63
|
-
def run(&block)
|
64
|
-
push_proc(&block)
|
65
|
-
end
|
66
|
-
|
67
|
-
# Executes all the config procs onto the currently loaded {Top} object,
|
68
|
-
# and returns the final configured object. This also validates the
|
69
|
-
# configuration by calling {Top#validate!} on every configuration
|
70
|
-
# class.
|
71
|
-
def execute!
|
72
|
-
config_object ||= config
|
73
|
-
run_procs!(config_object)
|
74
|
-
config_object
|
75
|
-
end
|
45
|
+
# This is the method which is called by all Vagrantfiles to configure Vagrant.
|
46
|
+
# This method expects a block which accepts a single argument representing
|
47
|
+
# an instance of the {Config::Top} class.
|
48
|
+
#
|
49
|
+
# Note that the block is not run immediately. Instead, it's proc is stored
|
50
|
+
# away for execution later.
|
51
|
+
def self.run(&block)
|
52
|
+
# Store it for later
|
53
|
+
@last_procs ||= []
|
54
|
+
@last_procs << block
|
76
55
|
end
|
77
56
|
|
78
|
-
#
|
57
|
+
# Returns the last proc which was activated for the class via {run}. This
|
58
|
+
# also sets the last proc to `nil` so that calling this method multiple times
|
59
|
+
# will not return duplicates.
|
79
60
|
#
|
80
|
-
# @
|
81
|
-
|
82
|
-
|
83
|
-
@
|
84
|
-
|
61
|
+
# @return [Proc]
|
62
|
+
def self.last_proc
|
63
|
+
value = @last_procs
|
64
|
+
@last_procs = nil
|
65
|
+
value
|
85
66
|
end
|
86
67
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
self.class.reset!(@env)
|
68
|
+
def initialize(parent=nil)
|
69
|
+
@procs = {}
|
70
|
+
@load_order = []
|
91
71
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
rescue SyntaxError => e
|
97
|
-
# Report syntax errors in a nice way for Vagrantfiles
|
98
|
-
raise Errors::VagrantfileSyntaxError, :file => e.message
|
99
|
-
end
|
100
|
-
elsif item.is_a?(Proc)
|
101
|
-
self.class.run(&item)
|
102
|
-
end
|
72
|
+
if parent
|
73
|
+
# Shallow copy the procs and load order from parent if given
|
74
|
+
@procs = parent.procs.dup
|
75
|
+
@load_order = parent.load_order.dup
|
103
76
|
end
|
77
|
+
end
|
104
78
|
|
105
|
-
|
79
|
+
# Adds a Vagrantfile to be loaded to the queue of config procs. Note
|
80
|
+
# that this causes the Vagrantfile file to be loaded at this point,
|
81
|
+
# and it will never be loaded again.
|
82
|
+
def set(key, path)
|
83
|
+
return if @procs.has_key?(key)
|
84
|
+
@procs[key] = [path].flatten.map(&method(:proc_for)).flatten
|
106
85
|
end
|
107
|
-
end
|
108
86
|
|
109
|
-
|
110
|
-
#
|
111
|
-
#
|
112
|
-
# classes. This is the object which is returned by {Environment#config}
|
113
|
-
# and has accessors to all other configuration classes.
|
87
|
+
# Loads the added procs using the set `load_order` attribute and returns
|
88
|
+
# the {Config::Top} object result. The configuration is loaded for the
|
89
|
+
# given {Environment} object.
|
114
90
|
#
|
115
|
-
#
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
# Registers a configuration class with the given key. This method shouldn't
|
127
|
-
# be called. Instead, inherit from {Base} and call {Base.configures}.
|
128
|
-
def configures(key, klass)
|
129
|
-
configures_list[key] = klass
|
130
|
-
attr_reader key.to_sym
|
91
|
+
# @param [Environment] env
|
92
|
+
def load(env)
|
93
|
+
config = Top.new(env)
|
94
|
+
|
95
|
+
# Only run the procs specified in the load order, in the order
|
96
|
+
# specified.
|
97
|
+
load_order.each do |key|
|
98
|
+
if @procs[key]
|
99
|
+
@procs[key].each do |proc|
|
100
|
+
proc.call(config) if proc
|
101
|
+
end
|
131
102
|
end
|
132
103
|
end
|
133
104
|
|
134
|
-
|
135
|
-
|
136
|
-
config = klass.new
|
137
|
-
config.env = env
|
138
|
-
config.top = self
|
139
|
-
instance_variable_set("@#{key}".to_sym, config)
|
140
|
-
end
|
105
|
+
config
|
106
|
+
end
|
141
107
|
|
142
|
-
|
143
|
-
end
|
108
|
+
protected
|
144
109
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
# the method that checks all the validation, not one which defines
|
149
|
-
# validation rules.
|
150
|
-
def validate!
|
151
|
-
# Validate each of the configured classes and store the results into
|
152
|
-
# a hash.
|
153
|
-
errors = self.class.configures_list.inject({}) do |container, data|
|
154
|
-
key, _ = data
|
155
|
-
recorder = ErrorRecorder.new
|
156
|
-
send(key.to_sym).validate(recorder)
|
157
|
-
container[key.to_sym] = recorder if !recorder.errors.empty?
|
158
|
-
container
|
159
|
-
end
|
110
|
+
def proc_for(path)
|
111
|
+
return nil if !path
|
112
|
+
return path if path.is_a?(Proc)
|
160
113
|
|
161
|
-
|
162
|
-
|
114
|
+
begin
|
115
|
+
Kernel.load path if File.exist?(path)
|
116
|
+
return self.class.last_proc
|
117
|
+
rescue SyntaxError => e
|
118
|
+
# Report syntax errors in a nice way for Vagrantfiles
|
119
|
+
raise Errors::VagrantfileSyntaxError, :file => e.message
|
163
120
|
end
|
164
121
|
end
|
165
122
|
end
|
166
123
|
end
|
167
|
-
|
168
|
-
# The built-in configuration classes
|
169
|
-
require 'vagrant/config/vagrant'
|
170
|
-
require 'vagrant/config/ssh'
|
171
|
-
require 'vagrant/config/nfs'
|
172
|
-
require 'vagrant/config/vm'
|
173
|
-
require 'vagrant/config/package'
|
@@ -25,7 +25,16 @@ module Vagrant
|
|
25
25
|
end
|
26
26
|
|
27
27
|
http.start do |h|
|
28
|
+
env.ui.info I18n.t("vagrant.downloaders.http.download", :url => source_url)
|
29
|
+
|
28
30
|
h.request_get(uri.request_uri) do |response|
|
31
|
+
if response.is_a?(Net::HTTPRedirection)
|
32
|
+
# Follow the HTTP redirect.
|
33
|
+
# TODO: Error on some redirect limit
|
34
|
+
download!(response["Location"], destination_file)
|
35
|
+
return
|
36
|
+
end
|
37
|
+
|
29
38
|
total = response.content_length
|
30
39
|
progress = 0
|
31
40
|
segment_count = 0
|
data/lib/vagrant/environment.rb
CHANGED
@@ -9,6 +9,7 @@ module Vagrant
|
|
9
9
|
ROOTFILE_NAME = "Vagrantfile"
|
10
10
|
HOME_SUBDIRS = ["tmp", "boxes", "logs"]
|
11
11
|
DEFAULT_VM = :default
|
12
|
+
DEFAULT_HOME = "~/.vagrant"
|
12
13
|
|
13
14
|
# Parent environment (in the case of multi-VMs)
|
14
15
|
attr_reader :parent
|
@@ -23,6 +24,9 @@ module Vagrant
|
|
23
24
|
# The {UI} object to communicate with the outside world.
|
24
25
|
attr_writer :ui
|
25
26
|
|
27
|
+
# The {Config} object representing the Vagrantfile loader
|
28
|
+
attr_reader :config_loader
|
29
|
+
|
26
30
|
#---------------------------------------------------------------
|
27
31
|
# Class Methods
|
28
32
|
#---------------------------------------------------------------
|
@@ -32,8 +36,7 @@ module Vagrant
|
|
32
36
|
def check_virtualbox!
|
33
37
|
version = VirtualBox.version
|
34
38
|
raise Errors::VirtualBoxNotDetected if version.nil?
|
35
|
-
raise Errors::VirtualBoxInvalidVersion, :version => version.to_s if version.to_f <
|
36
|
-
raise Errors::VirtualBoxInvalidOSE, :version => version.to_s if version.to_s.downcase.include?("ose")
|
39
|
+
raise Errors::VirtualBoxInvalidVersion, :version => version.to_s if version.to_f < 4.0
|
37
40
|
rescue Errors::VirtualBoxNotDetected
|
38
41
|
# On 64-bit Windows, show a special error. This error is a subclass
|
39
42
|
# of VirtualBoxNotDetected, so libraries which use Vagrant can just
|
@@ -79,12 +82,11 @@ module Vagrant
|
|
79
82
|
root_path.join(config.vagrant.dotfile_name) rescue nil
|
80
83
|
end
|
81
84
|
|
82
|
-
# The path to the home directory
|
83
|
-
# and converted into a Pathname object.
|
85
|
+
# The path to the home directory and converted into a Pathname object.
|
84
86
|
#
|
85
87
|
# @return [Pathname]
|
86
88
|
def home_path
|
87
|
-
@_home_path ||= Pathname.new(File.expand_path(
|
89
|
+
@_home_path ||= Pathname.new(File.expand_path(ENV["VAGRANT_HOME"] || DEFAULT_HOME))
|
88
90
|
end
|
89
91
|
|
90
92
|
# The path to the Vagrant tmp directory
|
@@ -114,7 +116,8 @@ module Vagrant
|
|
114
116
|
#
|
115
117
|
# @return [String]
|
116
118
|
def resource
|
117
|
-
vm.name rescue
|
119
|
+
result = vm.name rescue nil
|
120
|
+
result || "vagrant"
|
118
121
|
end
|
119
122
|
|
120
123
|
# Returns the collection of boxes for the environment.
|
@@ -146,7 +149,7 @@ module Vagrant
|
|
146
149
|
#
|
147
150
|
# @return [Array<VM>]
|
148
151
|
def vms_ordered
|
149
|
-
@vms_enum ||= config.vm.defined_vm_keys.map {|name| @vms[name]}
|
152
|
+
@vms_enum ||= config.vm.defined_vm_keys.map { |name| @vms[name] }
|
150
153
|
end
|
151
154
|
|
152
155
|
# Returns the primary VM associated with this environment. This
|
@@ -305,6 +308,14 @@ module Vagrant
|
|
305
308
|
self
|
306
309
|
end
|
307
310
|
|
311
|
+
# Reloads the configuration of this environment.
|
312
|
+
def reload_config!
|
313
|
+
@config = nil
|
314
|
+
@config_loader = nil
|
315
|
+
load_config!
|
316
|
+
self
|
317
|
+
end
|
318
|
+
|
308
319
|
# Loads this environment's configuration and stores it in the {#config}
|
309
320
|
# variable. The configuration loaded by this method is specified to
|
310
321
|
# this environment, meaning that it will use the given root directory
|
@@ -313,22 +324,23 @@ module Vagrant
|
|
313
324
|
first_run = @config.nil?
|
314
325
|
|
315
326
|
# First load the initial, non config-dependent Vagrantfiles
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
327
|
+
@config_loader ||= Config.new(parent ? parent.config_loader : nil)
|
328
|
+
@config_loader.load_order = [:default, :box, :home, :root, :sub_vm]
|
329
|
+
@config_loader.set(:default, File.expand_path("config/default.rb", Vagrant.source_root))
|
330
|
+
@config_loader.set(:box, File.join(box.directory, ROOTFILE_NAME)) if !first_run && vm && box
|
331
|
+
@config_loader.set(:home, File.join(home_path, ROOTFILE_NAME)) if !first_run && home_path
|
332
|
+
@config_loader.set(:root, File.join(root_path, ROOTFILE_NAME)) if root_path
|
321
333
|
|
322
334
|
# If this environment is representing a sub-VM, then we push that
|
323
335
|
# proc on as the last configuration.
|
324
336
|
if vm
|
325
337
|
subvm = parent.config.vm.defined_vms[vm.name]
|
326
|
-
|
338
|
+
@config_loader.set(:sub_vm, subvm.proc_stack) if subvm
|
327
339
|
end
|
328
340
|
|
329
341
|
# Execute the configuration stack and store the result as the final
|
330
342
|
# value in the config ivar.
|
331
|
-
@config =
|
343
|
+
@config = @config_loader.load(self)
|
332
344
|
|
333
345
|
# (re)load the logger
|
334
346
|
@logger = nil
|
data/lib/vagrant/errors.rb
CHANGED
@@ -230,16 +230,6 @@ module Vagrant
|
|
230
230
|
error_key(:dotfile_error, "vagrant.actions.vm.persist")
|
231
231
|
end
|
232
232
|
|
233
|
-
class ProvisionInvalidClass < VagrantError
|
234
|
-
status_code(35)
|
235
|
-
error_key(:invalid_class, "vagrant.actions.vm.provision")
|
236
|
-
end
|
237
|
-
|
238
|
-
class ProvisionUnknownType < VagrantError
|
239
|
-
status_code(36)
|
240
|
-
error_key(:unknown_type, "vagrant.actions.vm.provision")
|
241
|
-
end
|
242
|
-
|
243
233
|
class SSHAuthenticationFailed < VagrantError
|
244
234
|
status_code(11)
|
245
235
|
error_key(:ssh_authentication_failed)
|
@@ -255,6 +245,11 @@ module Vagrant
|
|
255
245
|
error_key(:ssh_key_bad_permissions)
|
256
246
|
end
|
257
247
|
|
248
|
+
class SSHPortNotDetected < VagrantError
|
249
|
+
status_code(50)
|
250
|
+
error_key(:ssh_port_not_detected)
|
251
|
+
end
|
252
|
+
|
258
253
|
class SSHUnavailable < VagrantError
|
259
254
|
status_code(45)
|
260
255
|
error_key(:ssh_unavailable)
|
@@ -275,11 +270,6 @@ module Vagrant
|
|
275
270
|
error_key(:vagrantfile_syntax_error)
|
276
271
|
end
|
277
272
|
|
278
|
-
class VirtualBoxInvalidOSE < VagrantError
|
279
|
-
status_code(9)
|
280
|
-
error_key(:virtualbox_invalid_ose)
|
281
|
-
end
|
282
|
-
|
283
273
|
class VirtualBoxInvalidVersion < VagrantError
|
284
274
|
status_code(17)
|
285
275
|
error_key(:virtualbox_invalid_version)
|
@@ -11,8 +11,26 @@ module Vagrant
|
|
11
11
|
# {Vagrant::Action::Environment}
|
12
12
|
attr_reader :action_env
|
13
13
|
|
14
|
-
|
14
|
+
# The configuration for this provisioner. This will be an instance of
|
15
|
+
# the `Config` class which is part of the provisioner.
|
16
|
+
attr_reader :config
|
17
|
+
|
18
|
+
# Registers a provisioner with a given shortcut. This allows that provisioner
|
19
|
+
# to be referenced with the shortcut.
|
20
|
+
#
|
21
|
+
# @param [Symbol] shortcut
|
22
|
+
def self.register(shortcut)
|
23
|
+
registered[shortcut] = self
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns the provisioner associated with the given shortcut.
|
27
|
+
def self.registered
|
28
|
+
@@registered ||= {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(env, config)
|
15
32
|
@action_env = env
|
33
|
+
@config = config
|
16
34
|
end
|
17
35
|
|
18
36
|
# Returns the actual {Vagrant::Environment} which this provisioner
|