vagrant 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +19 -0
- data/bin/vagrant +1 -1
- data/config/default.rb +1 -0
- data/lib/vagrant.rb +1 -1
- data/lib/vagrant/action/vm/network.rb +26 -15
- data/lib/vagrant/action/vm/nfs.rb +0 -1
- data/lib/vagrant/communication/ssh.rb +17 -6
- data/lib/vagrant/config/base.rb +6 -1
- data/lib/vagrant/config/ssh.rb +0 -6
- data/lib/vagrant/config/vm.rb +8 -0
- data/lib/vagrant/driver/virtualbox.rb +8 -3
- data/lib/vagrant/guest/debian.rb +1 -1
- data/lib/vagrant/guest/linux.rb +38 -9
- data/lib/vagrant/provisioners/chef.rb +11 -5
- data/lib/vagrant/provisioners/chef_client.rb +7 -9
- data/lib/vagrant/provisioners/chef_solo.rb +35 -6
- data/lib/vagrant/util/platform.rb +10 -0
- data/lib/vagrant/util/subprocess.rb +5 -5
- data/lib/vagrant/version.rb +1 -1
- data/lib/vagrant/vm.rb +1 -1
- data/templates/locales/en.yml +8 -1
- data/test/acceptance/shared_folders_test.rb +84 -0
- data/test/acceptance/up_basic_test.rb +0 -44
- data/test/unit/vagrant/config/base_test.rb +22 -0
- data/test/unit/vagrant/config/ssh_test.rb +17 -0
- metadata +6 -4
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## 0.9.2 (January 20, 2012)
|
2
|
+
|
3
|
+
- Support shell expansions in shared folder guest paths again. [GH-656]
|
4
|
+
- Fix issue where Chef solo always expected the host to have a
|
5
|
+
"cookbooks" folder in their directory. [GH-638]
|
6
|
+
- Fix `forward_agent` not working when outside of blocks. [GH-651]
|
7
|
+
- Fix issue causing custom guest implementations to not load properly.
|
8
|
+
- Filter clear screen character out of output on SSH.
|
9
|
+
- Log output now goes on `stderr`, since it is utility information.
|
10
|
+
- Get rid of case where a `NoMethodError` could be raised while
|
11
|
+
determining VirtualBox version. [GH-658]
|
12
|
+
- Debian/Ubuntu uses `ifdown` again, instead of `ifconfig xxx down`, since
|
13
|
+
the behavior seems different/wrong.
|
14
|
+
- Give a nice error if `:vagrant` is used as a JSON key, since Vagrant
|
15
|
+
uses this. [GH-661]
|
16
|
+
- If there is only one bridgable interface, use that without asking
|
17
|
+
the user. [GH-655]
|
18
|
+
- The shell will have color output if ANSICON is installed on Windows. [GH-666]
|
19
|
+
|
1
20
|
## 0.9.1 (January 18, 2012)
|
2
21
|
|
3
22
|
- Use `ifconfig device down` instead of `ifdown`. [GH-649]
|
data/bin/vagrant
CHANGED
@@ -19,7 +19,7 @@ opts = {}
|
|
19
19
|
# Disable color if the proper argument was passed or if we're
|
20
20
|
# on Windows since the default Windows terminal doesn't support
|
21
21
|
# colors.
|
22
|
-
if
|
22
|
+
if ARGV.include?("--no-color") || !$stdout.tty? || !Vagrant::Util::Platform.terminal_supports_colors?
|
23
23
|
# Delete the argument from the list so that it doesn't cause any
|
24
24
|
# invalid arguments down the road.
|
25
25
|
ARGV.delete("--no-color")
|
data/config/default.rb
CHANGED
data/lib/vagrant.rb
CHANGED
@@ -35,7 +35,7 @@ if ENV["VAGRANT_LOG"] && ENV["VAGRANT_LOG"] != ""
|
|
35
35
|
# logs as long as we have a valid level.
|
36
36
|
if level
|
37
37
|
logger = Log4r::Logger.new("vagrant")
|
38
|
-
logger.outputters = Log4r::Outputter.
|
38
|
+
logger.outputters = Log4r::Outputter.stderr
|
39
39
|
logger.level = level
|
40
40
|
logger = nil
|
41
41
|
end
|
@@ -314,29 +314,40 @@ module Vagrant
|
|
314
314
|
def bridged_adapter(config)
|
315
315
|
bridgedifs = @env[:vm].driver.read_bridged_interfaces
|
316
316
|
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
317
|
+
chosen_bridge = nil
|
318
|
+
if bridgedifs.length == 1
|
319
|
+
# One bridgable interface? Just use it.
|
320
|
+
chosen_bridge = bridgedifs[0][:name]
|
321
|
+
else
|
322
|
+
# More than one bridgable interface requires a user decision, so
|
323
|
+
# show options to choose from.
|
324
|
+
@env[:ui].info I18n.t("vagrant.actions.vm.bridged_networking.available",
|
325
|
+
:prefix => false)
|
326
|
+
bridgedifs.each_index do |index|
|
327
|
+
interface = bridgedifs[index]
|
328
|
+
@env[:ui].info("#{index + 1}) #{interface[:name]}", :prefix => false)
|
329
|
+
end
|
324
330
|
|
325
|
-
|
326
|
-
|
331
|
+
# The range of valid choices
|
332
|
+
valid = Range.new(1, bridgedifs.length)
|
327
333
|
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
334
|
+
# The choice that the user has chosen as the bridging interface
|
335
|
+
choice = nil
|
336
|
+
while !valid.include?(choice)
|
337
|
+
choice = @env[:ui].ask("What interface should the network bridge to? ")
|
338
|
+
choice = choice.to_i
|
339
|
+
end
|
340
|
+
|
341
|
+
chosen_bridge = bridgedifs[choice - 1][:name]
|
333
342
|
end
|
334
343
|
|
344
|
+
@logger.info("Bridging adapter #{config[:adapter]} to #{bridge}")
|
345
|
+
|
335
346
|
# Given the choice we can now define the adapter we're using
|
336
347
|
return {
|
337
348
|
:adapter => config[:adapter],
|
338
349
|
:type => :bridged,
|
339
|
-
:bridge =>
|
350
|
+
:bridge => chosen_bridge,
|
340
351
|
:mac_address => config[:mac]
|
341
352
|
}
|
342
353
|
end
|
@@ -71,6 +71,8 @@ module Vagrant
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def upload(from, to)
|
74
|
+
@logger.debug("Uploading: #{from} to #{to}")
|
75
|
+
|
74
76
|
# Do an SCP-based upload...
|
75
77
|
connect do |connection|
|
76
78
|
scp = Net::SCP.new(connection)
|
@@ -102,7 +104,7 @@ module Vagrant
|
|
102
104
|
# If the @connection is still around, then it is valid,
|
103
105
|
# and we use it.
|
104
106
|
if @connection
|
105
|
-
@logger.
|
107
|
+
@logger.debug("Re-using SSH connection.")
|
106
108
|
return yield @connection if block_given?
|
107
109
|
return
|
108
110
|
end
|
@@ -148,13 +150,11 @@ module Vagrant
|
|
148
150
|
rescue Errno::ECONNREFUSED
|
149
151
|
# This is raised if we failed to connect the max amount of times
|
150
152
|
raise Errors::SSHConnectionRefused
|
151
|
-
ensure
|
152
|
-
# Be sure the connection is always closed
|
153
|
-
# connection.close if connection && !connection.closed?
|
154
153
|
end
|
155
154
|
|
156
155
|
# Executes the command on an SSH connection within a login shell.
|
157
156
|
def shell_execute(connection, command, sudo=false)
|
157
|
+
@logger.info("Execute: #{command} (sudo=#{sudo.inspect})")
|
158
158
|
exit_status = nil
|
159
159
|
|
160
160
|
# Determine the shell to execute. If we are using `sudo` then we
|
@@ -167,15 +167,26 @@ module Vagrant
|
|
167
167
|
ch.exec(shell) do |ch2, _|
|
168
168
|
# Setup the channel callbacks so we can get data and exit status
|
169
169
|
ch2.on_data do |ch3, data|
|
170
|
-
|
170
|
+
if block_given?
|
171
|
+
# Filter out the clear screen command
|
172
|
+
data.gsub!("\e[H", "")
|
173
|
+
@logger.debug("stdout: #{data}")
|
174
|
+
yield :stdout, data
|
175
|
+
end
|
171
176
|
end
|
172
177
|
|
173
178
|
ch2.on_extended_data do |ch3, type, data|
|
174
|
-
|
179
|
+
if block_given?
|
180
|
+
# Filter out the clear screen command
|
181
|
+
data.gsub!("\e[H", "")
|
182
|
+
@logger.debug("stderr: #{data}")
|
183
|
+
yield :stderr, data
|
184
|
+
end
|
175
185
|
end
|
176
186
|
|
177
187
|
ch2.on_request("exit-status") do |ch3, data|
|
178
188
|
exit_status = data.read_long
|
189
|
+
@logger.debug("Exit status: #{exit_status}")
|
179
190
|
end
|
180
191
|
|
181
192
|
# Set the terminal
|
data/lib/vagrant/config/base.rb
CHANGED
@@ -33,7 +33,12 @@ module Vagrant
|
|
33
33
|
def merge(other)
|
34
34
|
result = self.class.new
|
35
35
|
instance_variables_hash.merge(other.instance_variables_hash).each do |key, value|
|
36
|
-
|
36
|
+
# Ignore keys that start with a double underscore. This allows
|
37
|
+
# configuration classes to still hold around internal state
|
38
|
+
# that isn't propagated.
|
39
|
+
if !key.start_with?("__")
|
40
|
+
result.instance_variable_set("@#{key}".to_sym, value)
|
41
|
+
end
|
37
42
|
end
|
38
43
|
|
39
44
|
result
|
data/lib/vagrant/config/ssh.rb
CHANGED
@@ -13,12 +13,6 @@ module Vagrant
|
|
13
13
|
attr_accessor :forward_x11
|
14
14
|
attr_accessor :shell
|
15
15
|
|
16
|
-
def initialize
|
17
|
-
@shell = "bash"
|
18
|
-
@forward_agent = false
|
19
|
-
@forward_x11 = false
|
20
|
-
end
|
21
|
-
|
22
16
|
def forwarded_port_key=(value)
|
23
17
|
raise Errors::DeprecationError, :message => <<-MESSAGE
|
24
18
|
`config.ssh.forwarded_port_key` is now gone. You must now use
|
data/lib/vagrant/config/vm.rb
CHANGED
@@ -39,6 +39,14 @@ module Vagrant
|
|
39
39
|
result
|
40
40
|
end
|
41
41
|
|
42
|
+
def system=(value)
|
43
|
+
raise Errors::DeprecationError, :message => <<-MESSAGE
|
44
|
+
`config.vm.system` has changed to `config.vm.guest` in Vagrant 0.9,
|
45
|
+
since this is more clear about the use of the configuration key.
|
46
|
+
Please change all references of `config.vm.system` to `config.vm.guest`.
|
47
|
+
MESSAGE
|
48
|
+
end
|
49
|
+
|
42
50
|
def forward_port(guestport, hostport, options=nil)
|
43
51
|
if !guestport.kind_of?(Integer)
|
44
52
|
raise Errors::DeprecationError, :message => <<-MESSAGE
|
@@ -33,7 +33,7 @@ module Vagrant
|
|
33
33
|
# Read and assign the version of VirtualBox we know which
|
34
34
|
# specific driver to instantiate.
|
35
35
|
begin
|
36
|
-
@version = read_version
|
36
|
+
@version = read_version || ""
|
37
37
|
rescue Subprocess::LaunchError
|
38
38
|
# This means that VirtualBox was not found, so we raise this
|
39
39
|
# error here.
|
@@ -113,8 +113,13 @@ module Vagrant
|
|
113
113
|
# * 4.1.8r1234_OSE
|
114
114
|
# * 4.1.8_MacPortsr1234
|
115
115
|
#
|
116
|
-
# Below accounts for all of these
|
117
|
-
|
116
|
+
# Below accounts for all of these.
|
117
|
+
|
118
|
+
# Note: We split this into multiple lines because apparently "".split("_")
|
119
|
+
# is [], so we have to check for an empty array in between.
|
120
|
+
parts = execute("--version").split("_")
|
121
|
+
return nil if parts.empty?
|
122
|
+
parts[0].split("r")[0]
|
118
123
|
end
|
119
124
|
end
|
120
125
|
end
|
data/lib/vagrant/guest/debian.rb
CHANGED
@@ -38,7 +38,7 @@ module Vagrant
|
|
38
38
|
# each specifically, we avoid reconfiguring eth0 (the NAT interface) so
|
39
39
|
# SSH never dies.
|
40
40
|
interfaces.each do |interface|
|
41
|
-
vm.channel.sudo("/sbin/
|
41
|
+
vm.channel.sudo("/sbin/ifdown eth#{interface} 2> /dev/null")
|
42
42
|
end
|
43
43
|
|
44
44
|
vm.channel.sudo("cat /tmp/vagrant-network-entry >> /etc/network/interfaces")
|
data/lib/vagrant/guest/linux.rb
CHANGED
@@ -1,9 +1,17 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
|
1
3
|
require 'vagrant/guest/linux/error'
|
2
4
|
require 'vagrant/guest/linux/config'
|
3
5
|
|
4
6
|
module Vagrant
|
5
7
|
module Guest
|
6
8
|
class Linux < Base
|
9
|
+
def initialize(*args)
|
10
|
+
super
|
11
|
+
|
12
|
+
@logger = Log4r::Logger.new("vagrant::guest::linux")
|
13
|
+
end
|
14
|
+
|
7
15
|
def distro_dispatch
|
8
16
|
if @vm.channel.test("cat /etc/debian_version")
|
9
17
|
return :debian if @vm.channel.test("cat /proc/version | grep 'Debian'")
|
@@ -20,32 +28,53 @@ module Vagrant
|
|
20
28
|
end
|
21
29
|
|
22
30
|
def halt
|
23
|
-
vm.channel.sudo("shutdown -h now")
|
31
|
+
@vm.channel.sudo("shutdown -h now")
|
24
32
|
|
25
33
|
# Wait until the VM's state is actually powered off. If this doesn't
|
26
34
|
# occur within a reasonable amount of time (15 seconds by default),
|
27
35
|
# then simply return and allow Vagrant to kill the machine.
|
28
36
|
count = 0
|
29
|
-
while vm.state != :poweroff
|
37
|
+
while @vm.state != :poweroff
|
30
38
|
count += 1
|
31
39
|
|
32
|
-
return if count >= vm.config.linux.halt_timeout
|
33
|
-
sleep vm.config.linux.halt_check_interval
|
40
|
+
return if count >= @vm.config.linux.halt_timeout
|
41
|
+
sleep @vm.config.linux.halt_check_interval
|
34
42
|
end
|
35
43
|
end
|
36
44
|
|
37
45
|
def mount_shared_folder(name, guestpath, options)
|
38
|
-
|
39
|
-
|
40
|
-
|
46
|
+
# Determine the real guest path. Since we use a `sudo` shell everywhere
|
47
|
+
# else, things like '~' don't expand properly in shared folders. We have
|
48
|
+
# to `echo` here to get that path.
|
49
|
+
real_guestpath = nil
|
50
|
+
@vm.channel.execute("echo #{guestpath}") do |type, data|
|
51
|
+
if type == :stdout
|
52
|
+
real_guestpath ||= ""
|
53
|
+
real_guestpath += data
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if !real_guestpath
|
58
|
+
# Really strange error case if this happens. Let's throw an error,
|
59
|
+
# tell the user to check the echo output.
|
60
|
+
raise LinuxError, :_key => :guestpath_expand_fail
|
61
|
+
end
|
62
|
+
|
63
|
+
# Chomp off the newline if it exists
|
64
|
+
real_guestpath = real_guestpath.chomp
|
65
|
+
@logger.debug("Shell expanded guest path: #{real_guestpath}")
|
66
|
+
|
67
|
+
@vm.channel.sudo("mkdir -p #{real_guestpath}")
|
68
|
+
mount_folder(name, real_guestpath, options)
|
69
|
+
@vm.channel.sudo("chown `id -u #{options[:owner]}`:`id -g #{options[:group]}` #{real_guestpath}")
|
41
70
|
end
|
42
71
|
|
43
72
|
def mount_nfs(ip, folders)
|
44
73
|
# TODO: Maybe check for nfs support on the guest, since its often
|
45
74
|
# not installed by default
|
46
75
|
folders.each do |name, opts|
|
47
|
-
vm.channel.sudo("mkdir -p #{opts[:guestpath]}")
|
48
|
-
vm.channel.sudo("mount #{ip}:'#{opts[:hostpath]}' #{opts[:guestpath]}",
|
76
|
+
@vm.channel.sudo("mkdir -p #{opts[:guestpath]}")
|
77
|
+
@vm.channel.sudo("mount #{ip}:'#{opts[:hostpath]}' #{opts[:guestpath]}",
|
49
78
|
:error_class => LinuxError,
|
50
79
|
:error_key => :mount_nfs_fail)
|
51
80
|
end
|
@@ -115,11 +115,11 @@ module Vagrant
|
|
115
115
|
attr_accessor :attempts
|
116
116
|
attr_writer :run_list
|
117
117
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
end
|
118
|
+
# Provide defaults in such a way that they won't override the instance
|
119
|
+
# variable. This is so merging continues to work properly.
|
120
|
+
def attempts; @attempts || 1; end
|
121
|
+
def json; @json ||= {}; end
|
122
|
+
def log_level; @log_level || :info; end
|
123
123
|
|
124
124
|
# This returns the json that is merged with the defaults and the
|
125
125
|
# user set data.
|
@@ -147,6 +147,12 @@ module Vagrant
|
|
147
147
|
run_list << name
|
148
148
|
end
|
149
149
|
|
150
|
+
def validate(env, errors)
|
151
|
+
super
|
152
|
+
|
153
|
+
errors.add(I18n.t("vagrant.config.chef.vagrant_as_json_key")) if json.has_key?(:vagrant)
|
154
|
+
end
|
155
|
+
|
150
156
|
def instance_variables_hash
|
151
157
|
# Overridden so that the 'json' key could be removed, since its just
|
152
158
|
# merged into the config anyways
|
@@ -18,15 +18,13 @@ module Vagrant
|
|
18
18
|
attr_accessor :encrypted_data_bag_secret_key_path
|
19
19
|
attr_accessor :encrypted_data_bag_secret
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
@encrypted_data_bag_secret = "/tmp/encrypted_data_bag_secret"
|
29
|
-
end
|
21
|
+
# Provide defaults in such a way that they won't override the instance
|
22
|
+
# variable. This is so merging continues to work properly.
|
23
|
+
def validation_client_name; @validation_client_name || "chef-validator"; end
|
24
|
+
def client_key_path; @client_key_path || "/etc/chef/client.pem"; end
|
25
|
+
def file_cache_path; @file_cache_path || "/srv/chef/file_store"; end
|
26
|
+
def file_backup_path; @file_backup_path || "/srv/chef/cache"; end
|
27
|
+
def encrypted_data_bag_secret; @encrypted_data_bag_secret || "/tmp/encrypted_data_bag_secret"; end
|
30
28
|
|
31
29
|
def validate(env, errors)
|
32
30
|
super
|
@@ -19,8 +19,24 @@ module Vagrant
|
|
19
19
|
def initialize
|
20
20
|
super
|
21
21
|
|
22
|
-
@
|
23
|
-
|
22
|
+
@__default = ["cookbooks", [:vm, "cookbooks"]]
|
23
|
+
end
|
24
|
+
|
25
|
+
# Provide defaults in such a way that they won't override the instance
|
26
|
+
# variable. This is so merging continues to work properly.
|
27
|
+
def cookbooks_path
|
28
|
+
@cookbooks_path || _default_cookbook_path
|
29
|
+
end
|
30
|
+
|
31
|
+
# This stores a reference to the default cookbook path which is used
|
32
|
+
# later. Do not use this publicly. I apologize for not making it
|
33
|
+
# "protected" but it has to be called by Vagrant internals later.
|
34
|
+
def _default_cookbook_path
|
35
|
+
@__default
|
36
|
+
end
|
37
|
+
|
38
|
+
def nfs
|
39
|
+
@nfs || false
|
24
40
|
end
|
25
41
|
|
26
42
|
def validate(env, errors)
|
@@ -83,16 +99,27 @@ module Vagrant
|
|
83
99
|
# path element which contains the folder location (:host or :vm)
|
84
100
|
paths = [paths] if paths.is_a?(String) || paths.first.is_a?(Symbol)
|
85
101
|
|
86
|
-
|
102
|
+
results = []
|
103
|
+
paths.each do |path|
|
87
104
|
path = [:host, path] if !path.is_a?(Array)
|
88
105
|
type, path = path
|
89
106
|
|
90
107
|
# Create the local/remote path based on whether this is a host
|
91
108
|
# or VM path.
|
92
109
|
local_path = nil
|
93
|
-
local_path = File.expand_path(path, env[:root_path]) if type == :host
|
94
110
|
remote_path = nil
|
95
111
|
if type == :host
|
112
|
+
# Get the expanded path that the host path points to
|
113
|
+
local_path = File.expand_path(path, env[:root_path])
|
114
|
+
|
115
|
+
# Super hacky but if we're expanded the default cookbook paths,
|
116
|
+
# and one of the host paths doesn't exist, then just ignore it,
|
117
|
+
# because that is fine.
|
118
|
+
if paths.equal?(config._default_cookbook_path) && !File.directory?(local_path)
|
119
|
+
@logger.info("'cookbooks' folder doesn't exist on defaults. Ignoring.")
|
120
|
+
next
|
121
|
+
end
|
122
|
+
|
96
123
|
# Path exists on the host, setup the remote path
|
97
124
|
remote_path = "#{config.provisioning_path}/chef-solo-#{get_and_update_counter(:cookbooks_path)}"
|
98
125
|
else
|
@@ -110,9 +137,11 @@ module Vagrant
|
|
110
137
|
# If we have specified a folder name to append then append it
|
111
138
|
remote_path += "/#{appended_folder}" if appended_folder
|
112
139
|
|
113
|
-
#
|
114
|
-
[type, local_path, remote_path]
|
140
|
+
# Append the result
|
141
|
+
results << [type, local_path, remote_path]
|
115
142
|
end
|
143
|
+
|
144
|
+
results
|
116
145
|
end
|
117
146
|
|
118
147
|
# Shares the given folders with the given prefix. The folders should
|
@@ -44,6 +44,16 @@ module Vagrant
|
|
44
44
|
!bit64?
|
45
45
|
end
|
46
46
|
|
47
|
+
# Returns a boolean noting whether the terminal supports color.
|
48
|
+
# output.
|
49
|
+
def terminal_supports_colors?
|
50
|
+
if windows?
|
51
|
+
return ENV.has_key?("ANSICON")
|
52
|
+
end
|
53
|
+
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
47
57
|
def tar_file_options
|
48
58
|
# create, write only, fail if the file exists, binary if windows
|
49
59
|
File::WRONLY | File::EXCL | File::CREAT | (windows? ? File::BINARY : 0)
|
@@ -69,7 +69,7 @@ module Vagrant
|
|
69
69
|
stderr_writer.close
|
70
70
|
|
71
71
|
# Create a dictionary to store all the output we see.
|
72
|
-
io_data = { stdout => "", stderr => "" }
|
72
|
+
io_data = { :stdout => "", :stderr => "" }
|
73
73
|
|
74
74
|
# Record the start time for timeout purposes
|
75
75
|
start_time = Time.now.to_i
|
@@ -94,7 +94,7 @@ module Vagrant
|
|
94
94
|
io_name = r == stdout ? :stdout : :stderr
|
95
95
|
@logger.debug("#{io_name}: #{data}")
|
96
96
|
|
97
|
-
io_data[
|
97
|
+
io_data[io_name] += data
|
98
98
|
yield io_name, data if block_given?
|
99
99
|
end
|
100
100
|
end
|
@@ -133,15 +133,15 @@ module Vagrant
|
|
133
133
|
|
134
134
|
# Log it out and accumulate
|
135
135
|
@logger.debug(extra_data)
|
136
|
-
|
136
|
+
io_name = io == stdout ? :stdout : :stderr
|
137
|
+
io_data[io_name] += extra_data
|
137
138
|
|
138
139
|
# Yield to any listeners any remaining data
|
139
|
-
io_name = io == stdout ? :stdout : :stderr
|
140
140
|
yield io_name, extra_data if block_given?
|
141
141
|
end
|
142
142
|
|
143
143
|
# Return an exit status container
|
144
|
-
return Result.new(process.exit_code, io_data[stdout], io_data[stderr])
|
144
|
+
return Result.new(process.exit_code, io_data[:stdout], io_data[:stderr])
|
145
145
|
end
|
146
146
|
|
147
147
|
protected
|
data/lib/vagrant/version.rb
CHANGED
data/lib/vagrant/vm.rb
CHANGED
@@ -49,7 +49,7 @@ module Vagrant
|
|
49
49
|
@logger.info("Loading guest: #{guest}")
|
50
50
|
|
51
51
|
if guest.is_a?(Class)
|
52
|
-
raise Errors::VMGuestError, :_key => :invalid_class, :system => guest.to_s if !(guest <=
|
52
|
+
raise Errors::VMGuestError, :_key => :invalid_class, :system => guest.to_s if !(guest <= Guest::Base)
|
53
53
|
@guest = guest.new(self)
|
54
54
|
elsif guest.is_a?(Symbol)
|
55
55
|
guest_klass = Vagrant.guests.get(guest)
|
data/templates/locales/en.yml
CHANGED
@@ -188,9 +188,11 @@ en:
|
|
188
188
|
common:
|
189
189
|
error_empty: "`%{field}` must be filled in."
|
190
190
|
chef:
|
191
|
-
run_list_empty: "Run list must not be empty."
|
192
191
|
cookbooks_path_empty: "Must specify a cookbooks path for chef solo."
|
192
|
+
run_list_empty: "Run list must not be empty."
|
193
193
|
server_url_empty: "Chef server URL must be populated."
|
194
|
+
vagrant_as_json_key: |-
|
195
|
+
`vagrant` cannot be a JSON key, because it is used by Vagrant already.
|
194
196
|
validation_key_path: "Validation key path must be valid path to your chef server validation key."
|
195
197
|
ssh:
|
196
198
|
private_key_missing: "`private_key_path` file must exist: %{path}"
|
@@ -667,6 +669,11 @@ en:
|
|
667
669
|
back the logic necessary to set this up. Please report a bug as well as the
|
668
670
|
box you're using.
|
669
671
|
linux:
|
672
|
+
guestpath_expand_fail: |-
|
673
|
+
Vagrant failed to determine the shell expansion of the guest path
|
674
|
+
for one of your shared folders. This is an extremely rare error case
|
675
|
+
and most likely indicates an unusual configuration of the guest system.
|
676
|
+
Please report a bug with your Vagrantfile.
|
670
677
|
mount_fail: "Failed to mount shared folders. `vboxsf` was not available."
|
671
678
|
mount_nfs_fail: |-
|
672
679
|
Mounting NFS shared folders failed. This is most often caused by the NFS
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.expand_path("../base", __FILE__)
|
2
|
+
require "acceptance/support/shared/command_examples"
|
3
|
+
|
4
|
+
describe "vagrant shared folders" do
|
5
|
+
include_context "acceptance"
|
6
|
+
|
7
|
+
# This creates an initial environment that is ready for a "vagrant up"
|
8
|
+
def initialize_valid_environment
|
9
|
+
require_box("default")
|
10
|
+
|
11
|
+
assert_execute("vagrant", "box", "add", "base", box_path("default"))
|
12
|
+
assert_execute("vagrant", "init")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have a '/vagrant' shared folder" do
|
16
|
+
initialize_valid_environment
|
17
|
+
|
18
|
+
# This is the file that will be created from the VM,
|
19
|
+
# but should then exist on the host machine
|
20
|
+
foofile = environment.workdir.join("foo")
|
21
|
+
|
22
|
+
assert_execute("vagrant", "up")
|
23
|
+
foofile.exist?.should_not be,
|
24
|
+
"'foo' should not exist yet."
|
25
|
+
|
26
|
+
assert_execute("vagrant", "ssh", "-c", "touch /vagrant/foo")
|
27
|
+
foofile.exist?.should be, "'foo' should exist since it was touched in the shared folder"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should create a shared folder if the :create flag is set" do
|
31
|
+
initialize_valid_environment
|
32
|
+
|
33
|
+
# Setup the custom Vagrantfile
|
34
|
+
environment.workdir.join("Vagrantfile").open("w+") do |f|
|
35
|
+
f.write(<<-VF)
|
36
|
+
Vagrant::Config.run do |config|
|
37
|
+
config.vm.box = "base"
|
38
|
+
config.vm.share_folder "v-root", "/vagrant", "./data", :create => true
|
39
|
+
end
|
40
|
+
VF
|
41
|
+
end
|
42
|
+
|
43
|
+
data_dir = environment.workdir.join("data")
|
44
|
+
|
45
|
+
# Verify the directory doesn't exist prior, for sanity
|
46
|
+
data_dir.exist?.should_not be
|
47
|
+
|
48
|
+
# Bring up the VM
|
49
|
+
assert_execute("vagrant", "up")
|
50
|
+
|
51
|
+
# Verify the directory exists
|
52
|
+
data_dir.should be_directory
|
53
|
+
|
54
|
+
# Touch a file and verify it is shared
|
55
|
+
assert_execute("vagrant", "ssh", "-c", "touch /vagrant/foo")
|
56
|
+
data_dir.join("foo").exist?.should be
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should properly shell expand relative directories on the guest" do
|
60
|
+
initialize_valid_environment
|
61
|
+
|
62
|
+
# Setup the custom Vagrantfile
|
63
|
+
environment.workdir.join("Vagrantfile").open("w+") do |f|
|
64
|
+
f.write(<<-VF)
|
65
|
+
Vagrant::Config.run do |config|
|
66
|
+
config.vm.box = "base"
|
67
|
+
config.vm.share_folder "v-root", "~/data", "."
|
68
|
+
end
|
69
|
+
VF
|
70
|
+
end
|
71
|
+
|
72
|
+
# Sanity
|
73
|
+
foo_file = environment.workdir.join("foo")
|
74
|
+
foo_file.exist?.should_not be
|
75
|
+
|
76
|
+
# Bring up the VM
|
77
|
+
assert_execute("vagrant", "up")
|
78
|
+
|
79
|
+
# Touch a file in the shared folder we expect and verify
|
80
|
+
# it is shared.
|
81
|
+
assert_execute("vagrant", "ssh", "-c", "touch ~/data/foo")
|
82
|
+
foo_file.exist?.should be
|
83
|
+
end
|
84
|
+
end
|
@@ -30,48 +30,4 @@ describe "vagrant up", "basics" do
|
|
30
30
|
foodir.mkdir
|
31
31
|
assert_execute("vagrant", "up", :chdir => foodir.to_s)
|
32
32
|
end
|
33
|
-
|
34
|
-
it "should have a '/vagrant' shared folder" do
|
35
|
-
initialize_valid_environment
|
36
|
-
|
37
|
-
# This is the file that will be created from the VM,
|
38
|
-
# but should then exist on the host machine
|
39
|
-
foofile = environment.workdir.join("foo")
|
40
|
-
|
41
|
-
assert_execute("vagrant", "up")
|
42
|
-
foofile.exist?.should_not be,
|
43
|
-
"'foo' should not exist yet."
|
44
|
-
|
45
|
-
assert_execute("vagrant", "ssh", "-c", "touch /vagrant/foo")
|
46
|
-
foofile.exist?.should be, "'foo' should exist since it was touched in the shared folder"
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should create a shared folder if the :create flag is set" do
|
50
|
-
initialize_valid_environment
|
51
|
-
|
52
|
-
# Setup the custom Vagrantfile
|
53
|
-
environment.workdir.join("Vagrantfile").open("w+") do |f|
|
54
|
-
f.write(<<-VF)
|
55
|
-
Vagrant::Config.run do |config|
|
56
|
-
config.vm.box = "base"
|
57
|
-
config.vm.share_folder "v-root", "/vagrant", "./data", :create => true
|
58
|
-
end
|
59
|
-
VF
|
60
|
-
end
|
61
|
-
|
62
|
-
data_dir = environment.workdir.join("data")
|
63
|
-
|
64
|
-
# Verify the directory doesn't exist prior, for sanity
|
65
|
-
data_dir.exist?.should_not be
|
66
|
-
|
67
|
-
# Bring up the VM
|
68
|
-
assert_execute("vagrant", "up")
|
69
|
-
|
70
|
-
# Verify the directory exists
|
71
|
-
data_dir.should be_directory
|
72
|
-
|
73
|
-
# Touch a file and verify it is shared
|
74
|
-
assert_execute("vagrant", "ssh", "-c", "touch /vagrant/foo")
|
75
|
-
data_dir.join("foo").exist?.should be
|
76
|
-
end
|
77
33
|
end
|
@@ -22,4 +22,26 @@ describe Vagrant::Config::Base do
|
|
22
22
|
result.one.should == 2
|
23
23
|
result.two.should == 5
|
24
24
|
end
|
25
|
+
|
26
|
+
it "doesn't merge values that start with a double underscore" do
|
27
|
+
bar_class = Class.new(foo_class) do
|
28
|
+
@@counter = 0
|
29
|
+
def initialize
|
30
|
+
@__test = @@counter
|
31
|
+
@@counter += 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
one = bar_class.new
|
36
|
+
one.one = 2
|
37
|
+
one.two = 1
|
38
|
+
|
39
|
+
two = bar_class.new
|
40
|
+
two.two = 5
|
41
|
+
|
42
|
+
# Verify the counters
|
43
|
+
one.instance_variable_get(:@__test).should == 0
|
44
|
+
two.instance_variable_get(:@__test).should == 1
|
45
|
+
one.merge(two).instance_variable_get(:@__test).should == 2
|
46
|
+
end
|
25
47
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.expand_path("../../../base", __FILE__)
|
2
|
+
|
3
|
+
describe Vagrant::Config::SSHConfig do
|
4
|
+
include_context "unit"
|
5
|
+
|
6
|
+
[:forward_agent, :forward_x11].each do |bool_setting|
|
7
|
+
it "merges boolean #{bool_setting} properly" do
|
8
|
+
a = described_class.new
|
9
|
+
a.send("#{bool_setting}=", true)
|
10
|
+
|
11
|
+
b = described_class.new
|
12
|
+
|
13
|
+
c = a.merge(b)
|
14
|
+
c.send(bool_setting).should be
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 2
|
10
|
+
version: 0.9.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Mitchell Hashimoto
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2012-01-
|
19
|
+
date: 2012-01-20 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
@@ -456,6 +456,7 @@ files:
|
|
456
456
|
- test/acceptance/provisioning/chef_solo_test.rb
|
457
457
|
- test/acceptance/provisioning/shell_test.rb
|
458
458
|
- test/acceptance/resume_test.rb
|
459
|
+
- test/acceptance/shared_folders_test.rb
|
459
460
|
- test/acceptance/skeletons/chef_solo_basic/README.md
|
460
461
|
- test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb
|
461
462
|
- test/acceptance/skeletons/chef_solo_json/README.md
|
@@ -557,6 +558,7 @@ files:
|
|
557
558
|
- test/unit/vagrant/command/base_test.rb
|
558
559
|
- test/unit/vagrant/config/base_test.rb
|
559
560
|
- test/unit/vagrant/config/loader_test.rb
|
561
|
+
- test/unit/vagrant/config/ssh_test.rb
|
560
562
|
- test/unit/vagrant/config/top_test.rb
|
561
563
|
- test/unit/vagrant/config/vm_test.rb
|
562
564
|
- test/unit/vagrant/config_test.rb
|