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
data/templates/locales/en.yml
CHANGED
@@ -16,6 +16,9 @@ en:
|
|
16
16
|
puppet_not_detected: |-
|
17
17
|
The `puppet` binary was not found on the VM and is required for Puppet provisioning.
|
18
18
|
Please verify that Puppet is installed and that the binary is available on the PATH.
|
19
|
+
puppetd_not_detected: |-
|
20
|
+
The `puppetd` binary was not found on the VM is required for Puppet Server provisioning.
|
21
|
+
Please verify that Puppet is installed and that the binary is available on the PATH.
|
19
22
|
cli_missing_env: This command requires that a Vagrant environment be properly passed in as the last parameter.
|
20
23
|
config_validation: |-
|
21
24
|
There was a problem with the configuration of Vagrant. The error message(s)
|
@@ -28,10 +31,35 @@ en:
|
|
28
31
|
this command in another directory. If you aren't in a home directory,
|
29
32
|
then please rename ".vagrant" to something else, or configure Vagrant
|
30
33
|
to use another filename by modifying `config.vagrant.dotfile_name`.
|
31
|
-
interrupted: Vagrant exited after cleanup due to external interrupt.
|
32
|
-
multi_vm_required: A multi-vm environment is required for name specification to this command.
|
33
|
-
multi_vm_target_required: `vagrant %{command}` requires a specific VM name to target in a multi-VM environment.
|
34
|
-
no_env: No Vagrant environment detected. Run `vagrant init` to set one up.
|
34
|
+
interrupted: "Vagrant exited after cleanup due to external interrupt."
|
35
|
+
multi_vm_required: "A multi-vm environment is required for name specification to this command."
|
36
|
+
multi_vm_target_required: "`vagrant %{command}` requires a specific VM name to target in a multi-VM environment."
|
37
|
+
no_env: "No Vagrant environment detected. Run `vagrant init` to set one up."
|
38
|
+
provisioner_equals_not_supported: |-
|
39
|
+
The `config.vm.provisioner =` syntax has been removed in Vagrant 0.7.0.
|
40
|
+
Please change your provisioners to use the new syntax described below.
|
41
|
+
All of these changes are reflected on the Vagrant website as well.
|
42
|
+
|
43
|
+
Before:
|
44
|
+
|
45
|
+
config.vm.provisioner = :chef_solo
|
46
|
+
config.chef.cookbooks_path = "my_cookbooks"
|
47
|
+
config.chef.add_recipe "apache"
|
48
|
+
|
49
|
+
After:
|
50
|
+
|
51
|
+
config.vm.provision :chef_solo, :cookbooks_path => "my_cookbooks",
|
52
|
+
:run_list => ["recipe[apache]"]
|
53
|
+
|
54
|
+
Instead of just a hash, you may use a block as well to get access to the
|
55
|
+
configuration object:
|
56
|
+
|
57
|
+
config.vm.provision :chef_solo do |chef|
|
58
|
+
chef.cookbooks_path = "my_cookbooks"
|
59
|
+
chef.add_recipe "apache"
|
60
|
+
end
|
61
|
+
|
62
|
+
This error message will be removed in later versions of Vagrant.
|
35
63
|
ssh_authentication_failed: |-
|
36
64
|
SSH authentication failed! This is typically caused by the public/private
|
37
65
|
keypair for the SSH user not being properly set on the guest VM. Please
|
@@ -56,6 +84,10 @@ en:
|
|
56
84
|
permissions on the following file to 0600 and then try running this command again:
|
57
85
|
|
58
86
|
%{key_path}
|
87
|
+
ssh_port_not_detected: |-
|
88
|
+
Vagrant couldn't determine the SSH port for your VM! This is a rare,
|
89
|
+
exceptional event, and a bug should be filed. Please try recreating your
|
90
|
+
VM (vagrant destroy, then vagrant up). Sorry!
|
59
91
|
ssh_unavailable: "`ssh` binary could not be found. Is an SSH client installed?"
|
60
92
|
ssh_unavailable_windows: |-
|
61
93
|
`vagrant ssh` isn't available on the Windows platform. The
|
@@ -89,15 +121,15 @@ en:
|
|
89
121
|
message is reproduced below for convenience:
|
90
122
|
|
91
123
|
%{file}
|
92
|
-
virtualbox_invalid_ose: |-
|
93
|
-
Vagrant has detected you're using an OSE ("Open Source Edition") of VirtualBox.
|
94
|
-
Vagrant currently doesn't support any of the OSE editions due to slight API
|
95
|
-
differences. Please download the regular package from virtualbox.org and install
|
96
|
-
to continue.
|
97
124
|
virtualbox_invalid_version: |-
|
98
125
|
Vagrant has detected that you have VirtualBox version %{version} installed!
|
99
|
-
Vagrant requires that you use at least VirtualBox version
|
126
|
+
Vagrant requires that you use at least VirtualBox version 4.0. Please install
|
100
127
|
a more recent version of VirtualBox to continue.
|
128
|
+
|
129
|
+
The Vagrant 0.6.x series supports VirtualBox 3.2, so if you're stuck with that
|
130
|
+
version, then please use the 0.6.x series of Vagrant.
|
131
|
+
|
132
|
+
Any earlier versions of VirtualBox are completely unsupported. Please upgrade.
|
101
133
|
virtualbox_not_detected: |-
|
102
134
|
Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed.
|
103
135
|
If VirtualBox is installed, it may be an incorrect version. Vagrant currently
|
@@ -137,6 +169,8 @@ en:
|
|
137
169
|
box_missing: "A box must be specified."
|
138
170
|
box_not_found: "The box '%{name}' could not be found."
|
139
171
|
shared_folder_hostpath_missing: "Shared folder host path for '%{name}' doesn't exist: %{path}"
|
172
|
+
provisioner_not_found: "The provisioner '%{shortcut}' doesn't exist."
|
173
|
+
provisioner_invalid_class: "The provisioner '%{shortcut}' must inherit from `Vagrant::Provisioners::Base`."
|
140
174
|
|
141
175
|
#-------------------------------------------------------------------------------
|
142
176
|
# Translations for commands. e.g. `vagrant x`
|
@@ -346,16 +380,15 @@ en:
|
|
346
380
|
key.
|
347
381
|
persisting: "Persisting the VM UUID (%{uuid})..."
|
348
382
|
provision:
|
349
|
-
beginning: "
|
383
|
+
beginning: "Running provisioner: %{provisioner}..."
|
350
384
|
enabled: "Provisioning enabled with %{provisioner}..."
|
351
|
-
invalid_class: "Provisioners must be an instance of Vagrant::Provisioners::Base"
|
352
|
-
unknown_type: "Unknown provisioner type: %{provisioner}"
|
353
385
|
resume:
|
354
386
|
resuming: Resuming suspended VM...
|
355
387
|
share_folders:
|
356
388
|
creating: Creating shared folders metadata...
|
357
389
|
mounting: Mounting shared folders...
|
358
390
|
mounting_entry: "-- %{name}: %{guest_path}"
|
391
|
+
nomount_entry: "-- %{name}: Automounting disabled."
|
359
392
|
suspend:
|
360
393
|
suspending: Saving VM state and suspending execution...
|
361
394
|
|
@@ -365,7 +398,6 @@ en:
|
|
365
398
|
download:
|
366
399
|
with: "Downloading with %{class}..."
|
367
400
|
cleaning: "Cleaning up downloaded box..."
|
368
|
-
copying: "Copying box to temporary location..."
|
369
401
|
unknown_type: "Unknown or unsupported URI type given for box download."
|
370
402
|
unpackage:
|
371
403
|
extracting: "Extracting box..."
|
@@ -396,8 +428,10 @@ en:
|
|
396
428
|
|
397
429
|
downloaders:
|
398
430
|
file:
|
431
|
+
download: "Copying box to temporary location..."
|
399
432
|
file_missing: "The specified path to a file doesn't exist."
|
400
433
|
http:
|
434
|
+
download: "Downloading box: %{url}"
|
401
435
|
socket_error: |-
|
402
436
|
An error occurred while trying to download the specified box. This most
|
403
437
|
often happens if there is no internet connection or the address is
|
@@ -442,23 +476,39 @@ en:
|
|
442
476
|
could be because the PATH is not properly setup or perhaps Puppet is not
|
443
477
|
installed on this guest. Puppet provisioning can not continue without
|
444
478
|
Puppet properly installed.
|
445
|
-
running_puppet: "Running Puppet..."
|
446
|
-
manifest_to_run: "Puppet will use the %{manifest} manifest to configure your box."
|
479
|
+
running_puppet: "Running Puppet with %{manifest}..."
|
447
480
|
manifest_missing: "The Puppet %{manifest} manifest is missing. You cannot configure this box."
|
481
|
+
manifests_path_missing: "The manifests path specified for Puppet does not exist: %{path}"
|
482
|
+
module_path_missing: "The configured module path doesn't exist: %{path}"
|
483
|
+
|
484
|
+
puppet_server:
|
485
|
+
not_detected: |-
|
486
|
+
The `%{binary}` binary appears to not be in the PATH of the guest. This
|
487
|
+
could be because the PATH is not properly setup or perhaps Puppet is not
|
488
|
+
installed on this guest. Puppet provisioning can not continue without
|
489
|
+
Puppet properly installed.
|
490
|
+
running_puppetd: "Running Puppet agent..."
|
448
491
|
|
449
492
|
systems:
|
493
|
+
base:
|
494
|
+
unsupported_host_only: |-
|
495
|
+
Host only networking is very distro-specific. Vagrant has support for many
|
496
|
+
distros built-in: Debian, Ubuntu, Gentoo, and RedHat. The distro of your VM
|
497
|
+
couldn't be detected, or isn't supported for host only networking.
|
498
|
+
|
499
|
+
Most of the time this is simply due to the fact that no one has contributed
|
500
|
+
back the SSH commands necessary to set this up. Please report a bug and this
|
501
|
+
will be fixed for your distro.
|
502
|
+
|
450
503
|
linux:
|
451
504
|
attempting_halt: "Attempting graceful shutdown of linux..."
|
452
505
|
mount_fail: "Failed to mount shared folders. `vboxsf` was not available."
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
Otherwise, please report your distro and how to modify network interfaces
|
461
|
-
to the Vagrant mailing list or IRC and we'll probably be glad to add it
|
462
|
-
to the internal systems.
|
506
|
+
mount_nfs_fail: |-
|
507
|
+
Mounting NFS shared folders failed. This is most often caused by the NFS
|
508
|
+
client software not being installed on the guest machine. Please verify
|
509
|
+
that the NFS client software is properly installed, and consult any resources
|
510
|
+
specific to the linux distro you're using for more information on how to
|
511
|
+
do this.
|
512
|
+
|
463
513
|
solaris:
|
464
514
|
attempting_halt: "Attempting graceful shutdown of solaris..."
|
File without changes
|
data/templates/ssh_config.erb
CHANGED
@@ -45,6 +45,7 @@ class CheckBoxVMActionTest < Test::Unit::TestCase
|
|
45
45
|
env.env.boxes.expects(:find).returns(nil)
|
46
46
|
Vagrant::Box.expects(:add).with(env.env, env["config"].vm.box, env["config"].vm.box_url).in_sequence(seq)
|
47
47
|
env.env.boxes.expects(:reload!).in_sequence(seq)
|
48
|
+
env.env.expects(:reload_config!).in_sequence(seq)
|
48
49
|
app.expects(:call).with(env).once.in_sequence(seq)
|
49
50
|
|
50
51
|
assert_nothing_raised {
|
@@ -37,10 +37,10 @@ class CleanMachineFolderVMActionTest < Test::Unit::TestCase
|
|
37
37
|
@instance.clean_machine_folder
|
38
38
|
end
|
39
39
|
|
40
|
-
should "delete directories with only .
|
40
|
+
should "delete directories with only .vbox-prev files" do
|
41
41
|
folders = {
|
42
|
-
"sfoo" => %W[foo bar baz.
|
43
|
-
"sbar" => %W[foo.
|
42
|
+
"sfoo" => %W[foo bar baz.vbox-prev],
|
43
|
+
"sbar" => %W[foo.vbox-prev]
|
44
44
|
}
|
45
45
|
|
46
46
|
Dir.expects(:[]).with(@folder).returns(folders.keys)
|
@@ -57,7 +57,7 @@ class CleanMachineFolderVMActionTest < Test::Unit::TestCase
|
|
57
57
|
should "delete directories with only subdirectories" do
|
58
58
|
folders = {
|
59
59
|
"sfoo" => %W[foo bar],
|
60
|
-
"sbar" => %W[foo.
|
60
|
+
"sbar" => %W[foo.vbox-prev]
|
61
61
|
}
|
62
62
|
|
63
63
|
File.stubs(:file?).returns(false)
|
@@ -77,6 +77,8 @@ class CleanMachineFolderVMActionTest < Test::Unit::TestCase
|
|
77
77
|
should "do nothing if folder is < 10 characters" do
|
78
78
|
VirtualBox::Global.global.system_properties.stubs(:default_machine_folder).returns("foo")
|
79
79
|
Dir.expects(:[]).never
|
80
|
+
|
81
|
+
@instance.clean_machine_folder
|
80
82
|
end
|
81
83
|
end
|
82
84
|
end
|
@@ -16,7 +16,7 @@ class DestroyVMActionTest < Test::Unit::TestCase
|
|
16
16
|
|
17
17
|
context "destroying the VM" do
|
18
18
|
should "destroy VM and attached images" do
|
19
|
-
@internal_vm.expects(:destroy).
|
19
|
+
@internal_vm.expects(:destroy).once
|
20
20
|
@env["vm"].expects(:vm=).with(nil).once
|
21
21
|
@app.expects(:call).with(@env).once
|
22
22
|
@instance.call(@env)
|
@@ -16,24 +16,27 @@ class DestroyUnusedNetworkInterfacesVMActionTest < Test::Unit::TestCase
|
|
16
16
|
|
17
17
|
context "calling" do
|
18
18
|
setup do
|
19
|
-
@
|
20
|
-
|
19
|
+
@interfaces = []
|
20
|
+
global = mock("global")
|
21
|
+
host = mock("host")
|
22
|
+
VirtualBox::Global.stubs(:global).returns(global)
|
23
|
+
global.stubs(:host).returns(host)
|
24
|
+
host.stubs(:network_interfaces).returns(@interfaces)
|
21
25
|
end
|
22
26
|
|
23
|
-
def stub_interface(length=5)
|
27
|
+
def stub_interface(length=5, type=:host_only)
|
24
28
|
interface = mock("interface")
|
25
|
-
|
26
|
-
adapter.stubs(:host_interface_object).returns(interface)
|
29
|
+
interface.stubs(:interface_type).returns(type)
|
27
30
|
interface.stubs(:attached_vms).returns(Array.new(length))
|
28
31
|
|
29
|
-
@
|
32
|
+
@interfaces << interface
|
30
33
|
interface
|
31
34
|
end
|
32
35
|
|
33
36
|
should "destroy only the unused network interfaces" do
|
34
37
|
stub_interface(5)
|
35
38
|
stub_interface(7)
|
36
|
-
results = [stub_interface(
|
39
|
+
results = [stub_interface(0), stub_interface(0)]
|
37
40
|
|
38
41
|
results.each do |result|
|
39
42
|
result.expects(:destroy).once
|
@@ -160,13 +160,19 @@ class NFSVMActionTest < Test::Unit::TestCase
|
|
160
160
|
context "mounting folders" do
|
161
161
|
setup do
|
162
162
|
@instance.stubs(:host_ip).returns("foo")
|
163
|
-
@instance.stubs(:folders).returns(
|
163
|
+
@instance.stubs(:folders).returns({ "v-data" => {:guestpath => "foo"}})
|
164
164
|
end
|
165
165
|
|
166
166
|
should "mount the folders on the system" do
|
167
167
|
@vm.system.expects(:mount_nfs).with(@instance.host_ip, @instance.folders)
|
168
168
|
@instance.mount_folders
|
169
169
|
end
|
170
|
+
|
171
|
+
should "not mount folders which have no guest path" do
|
172
|
+
@instance.stubs(:folders).returns({ "v-data" => {}})
|
173
|
+
@vm.system.expects(:mount_nfs).with(@instance.host_ip, {})
|
174
|
+
@instance.mount_folders
|
175
|
+
end
|
170
176
|
end
|
171
177
|
|
172
178
|
context "getting the host IP" do
|
@@ -17,24 +17,23 @@ class ProvisionVMActionTest < Test::Unit::TestCase
|
|
17
17
|
|
18
18
|
context "initializing" do
|
19
19
|
setup do
|
20
|
-
@klass.any_instance.stubs(:
|
20
|
+
@klass.any_instance.stubs(:load_provisioners)
|
21
21
|
end
|
22
22
|
|
23
23
|
should "load provisioner if provisioning enabled" do
|
24
|
-
@env["config"].vm.
|
25
|
-
@klass.any_instance.expects(:
|
24
|
+
@env["config"].vm.provision :chef_solo
|
25
|
+
@klass.any_instance.expects(:load_provisioners).once
|
26
26
|
@klass.new(@app, @env)
|
27
27
|
end
|
28
28
|
|
29
29
|
should "not load provisioner if disabled" do
|
30
|
-
@
|
31
|
-
@klass.any_instance.expects(:load_provisioner).never
|
30
|
+
@klass.any_instance.expects(:load_provisioners).never
|
32
31
|
@klass.new(@app, @env)
|
33
32
|
end
|
34
33
|
|
35
34
|
should "not load provisioner if disabled through env hash" do
|
36
35
|
@env["provision.enabled"] = false
|
37
|
-
@klass.any_instance.expects(:
|
36
|
+
@klass.any_instance.expects(:load_provisioners).never
|
38
37
|
@klass.new(@app, @env)
|
39
38
|
end
|
40
39
|
end
|
@@ -42,101 +41,47 @@ class ProvisionVMActionTest < Test::Unit::TestCase
|
|
42
41
|
context "with an instance" do
|
43
42
|
setup do
|
44
43
|
# Set provisioner to nil so the provisioner isn't loaded on init
|
45
|
-
@env["config"].vm.
|
44
|
+
@env["config"].vm.provisioners.clear
|
46
45
|
@instance = @klass.new(@app, @env)
|
47
46
|
end
|
48
47
|
|
49
48
|
context "loading a provisioner" do
|
50
|
-
|
51
|
-
|
52
|
-
@prov = mock("instance")
|
53
|
-
@prov.stubs(:is_a?).with(Vagrant::Provisioners::Base).returns(true)
|
54
|
-
@prov.stubs(:prepare)
|
55
|
-
@klass = mock("klass")
|
56
|
-
@klass.stubs(:is_a?).with(Class).returns(true)
|
57
|
-
@klass.stubs(:new).with(@env).returns(@prov)
|
58
|
-
|
59
|
-
@env["config"].vm.provisioner = @klass
|
60
|
-
end
|
61
|
-
|
62
|
-
should "set the provisioner to an instantiation of the class" do
|
63
|
-
@klass.expects(:new).with(@env).once.returns(@prov)
|
64
|
-
assert_equal @prov, @instance.load_provisioner
|
65
|
-
end
|
66
|
-
|
67
|
-
should "call prepare on the instance" do
|
68
|
-
@prov.expects(:prepare).once
|
69
|
-
@instance.load_provisioner
|
70
|
-
end
|
71
|
-
|
72
|
-
should "error environment if the class is not a subclass of the provisioner base" do
|
73
|
-
@prov.expects(:is_a?).with(Vagrant::Provisioners::Base).returns(false)
|
74
|
-
|
75
|
-
assert_raises(Vagrant::Errors::ProvisionInvalidClass) {
|
76
|
-
@instance.load_provisioner
|
77
|
-
}
|
78
|
-
end
|
49
|
+
setup do
|
50
|
+
Vagrant::Provisioners::ChefSolo.any_instance.expects(:prepare).at_least(0)
|
79
51
|
end
|
80
52
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
instance = mock("instance")
|
86
|
-
instance.expects(:prepare).once
|
87
|
-
provisioner.expects(:new).with(@env).returns(instance)
|
88
|
-
assert_equal instance, @instance.load_provisioner
|
89
|
-
end
|
90
|
-
|
91
|
-
should "raise an error if its an unknown symbol" do
|
92
|
-
@env["config"].vm.provisioner = :this_will_never_exist
|
53
|
+
should "instantiate and prepare each provisioner" do
|
54
|
+
@env["config"].vm.provision :chef_solo
|
55
|
+
@env["config"].vm.provision :chef_solo
|
56
|
+
@instance.load_provisioners
|
93
57
|
|
94
|
-
|
95
|
-
|
96
|
-
}
|
97
|
-
end
|
58
|
+
assert_equal 2, @instance.provisioners.length
|
59
|
+
end
|
98
60
|
|
99
|
-
|
100
|
-
|
61
|
+
should "set the config for each provisioner" do
|
62
|
+
@env["config"].vm.provision :chef_solo do |chef|
|
63
|
+
chef.cookbooks_path = "foo"
|
101
64
|
end
|
102
65
|
|
103
|
-
|
104
|
-
provisioner_expectation(:chef_server, Vagrant::Provisioners::ChefServer)
|
105
|
-
end
|
66
|
+
@instance.load_provisioners
|
106
67
|
|
107
|
-
|
108
|
-
provisioner_expectation(:puppet, Vagrant::Provisioners::Puppet)
|
109
|
-
end
|
68
|
+
assert_equal "foo", @instance.provisioners.first.config.cookbooks_path
|
110
69
|
end
|
111
70
|
end
|
112
71
|
|
113
72
|
context "calling" do
|
114
73
|
setup do
|
115
74
|
Vagrant::Provisioners::ChefSolo.any_instance.stubs(:prepare)
|
116
|
-
@env["config"].vm.
|
117
|
-
@
|
75
|
+
@env["config"].vm.provision :chef_solo
|
76
|
+
@instance.load_provisioners
|
118
77
|
end
|
119
78
|
|
120
79
|
should "provision and continue chain" do
|
121
80
|
seq = sequence("seq")
|
122
81
|
@app.expects(:call).with(@env).in_sequence(seq)
|
123
|
-
@
|
124
|
-
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
should "continue chain and not provision if not enabled" do
|
129
|
-
@env["config"].vm.provisioner = nil
|
130
|
-
@prov.expects(:provision!).never
|
131
|
-
@app.expects(:call).with(@env).once
|
132
|
-
|
133
|
-
@instance.call(@env)
|
134
|
-
end
|
135
|
-
|
136
|
-
should "continue chain and not provision if not enabled through env hash" do
|
137
|
-
@env["provision.enabled"] = false
|
138
|
-
@prov.expects(:provision!).never
|
139
|
-
@app.expects(:call).with(@env).once
|
82
|
+
@instance.provisioners.each do |prov|
|
83
|
+
prov.expects(:provision!).in_sequence(seq)
|
84
|
+
end
|
140
85
|
|
141
86
|
@instance.call(@env)
|
142
87
|
end
|
@@ -116,6 +116,7 @@ class ShareFoldersVMActionTest < Test::Unit::TestCase
|
|
116
116
|
@folders = stub_shared_folders(<<-sf)
|
117
117
|
config.vm.share_folder("foo", "fooguest", "foohost")
|
118
118
|
config.vm.share_folder("bar", "barguest", "barhost")
|
119
|
+
config.vm.share_folder("foo_no_mount", nil, "foohost2")
|
119
120
|
sf
|
120
121
|
@ssh = mock("ssh")
|
121
122
|
@vm.ssh.stubs(:execute).yields(@ssh)
|
@@ -125,7 +126,11 @@ class ShareFoldersVMActionTest < Test::Unit::TestCase
|
|
125
126
|
should "mount all shared folders to the VM" do
|
126
127
|
mount_seq = sequence("mount_seq")
|
127
128
|
@folders.each do |name, data|
|
128
|
-
|
129
|
+
if data[:guestpath]
|
130
|
+
@vm.system.expects(:mount_shared_folder).with(@ssh, name, data[:guestpath]).in_sequence(mount_seq)
|
131
|
+
else
|
132
|
+
@vm.system.expects(:mount_shared_folder).with(@ssh, name, anything).never
|
133
|
+
end
|
129
134
|
end
|
130
135
|
|
131
136
|
@instance.mount_shared_folders
|
@@ -52,7 +52,7 @@ class CommandHelpersTest < Test::Unit::TestCase
|
|
52
52
|
should "return the VM if no name is specified" do
|
53
53
|
instance = command([], @env)
|
54
54
|
assert_nothing_raised {
|
55
|
-
assert_equal @env.vms.values, instance.target_vms
|
55
|
+
assert_equal @env.vms.values.sort, instance.target_vms.sort
|
56
56
|
}
|
57
57
|
end
|
58
58
|
end
|
@@ -64,7 +64,7 @@ class CommandHelpersTest < Test::Unit::TestCase
|
|
64
64
|
|
65
65
|
should "return all the VMs if no name is specified" do
|
66
66
|
instance = command([], @env)
|
67
|
-
assert_equal @env.vms.values, instance.target_vms
|
67
|
+
assert_equal @env.vms.values.sort, instance.target_vms.sort
|
68
68
|
end
|
69
69
|
|
70
70
|
should "return only the specified VM if a name is given" do
|
@@ -42,12 +42,6 @@ class ConfigBaseTest < Test::Unit::TestCase
|
|
42
42
|
assert_equal @json, @base.to_json
|
43
43
|
end
|
44
44
|
|
45
|
-
should "not include env in the JSON hash" do
|
46
|
-
@base.env = "FOO"
|
47
|
-
hash = @base.instance_variables_hash
|
48
|
-
assert !hash.has_key?(:env)
|
49
|
-
end
|
50
|
-
|
51
45
|
should "not include top in the JSON hash" do
|
52
46
|
@base.top = "FOO"
|
53
47
|
hash = @base.instance_variables_hash
|
@@ -8,7 +8,6 @@ class ConfigVagrantTest < Test::Unit::TestCase
|
|
8
8
|
context "validation" do
|
9
9
|
setup do
|
10
10
|
@config.dotfile_name = "foo"
|
11
|
-
@config.home = "foo"
|
12
11
|
@config.host = "foo"
|
13
12
|
|
14
13
|
@errors = Vagrant::Config::ErrorRecorder.new
|
@@ -26,13 +25,6 @@ class ConfigVagrantTest < Test::Unit::TestCase
|
|
26
25
|
assert !@errors.errors.empty?
|
27
26
|
end
|
28
27
|
|
29
|
-
should "be invalid with no home" do
|
30
|
-
@config.home = nil
|
31
|
-
|
32
|
-
@config.validate(@errors)
|
33
|
-
assert !@errors.errors.empty?
|
34
|
-
end
|
35
|
-
|
36
28
|
should "be invalid with no host" do
|
37
29
|
@config.host = nil
|
38
30
|
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ConfigVMProvisionerTest < Test::Unit::TestCase
|
4
|
+
setup do
|
5
|
+
@klass = Vagrant::Config::VMConfig::Provisioner
|
6
|
+
@top = Vagrant::Config::Top.new(nil)
|
7
|
+
end
|
8
|
+
|
9
|
+
context "initializing" do
|
10
|
+
should "expose the top instance that the provisioner belongs to" do
|
11
|
+
instance = @klass.new(@top, :chef_solo)
|
12
|
+
assert_equal @top, instance.top
|
13
|
+
end
|
14
|
+
|
15
|
+
should "expose the shortcut used" do
|
16
|
+
instance = @klass.new(@top, :chef_solo)
|
17
|
+
assert_equal :chef_solo, instance.shortcut
|
18
|
+
end
|
19
|
+
|
20
|
+
should "expose the provisioner class if its a valid shortcut" do
|
21
|
+
instance = @klass.new(@top, :chef_solo)
|
22
|
+
assert_equal Vagrant::Provisioners::ChefSolo, instance.provisioner
|
23
|
+
end
|
24
|
+
|
25
|
+
should "expose the provisioner class if its a valid class" do
|
26
|
+
instance = @klass.new(@top, Vagrant::Provisioners::ChefSolo)
|
27
|
+
assert_equal Vagrant::Provisioners::ChefSolo, instance.provisioner
|
28
|
+
end
|
29
|
+
|
30
|
+
should "have a nil provisioner class if invalid" do
|
31
|
+
instance = @klass.new(@top, :i_shall_never_exist)
|
32
|
+
assert_nil instance.provisioner
|
33
|
+
end
|
34
|
+
|
35
|
+
should "have a nil config instance if invalid" do
|
36
|
+
instance = @klass.new(@top, :i_shall_never_exist)
|
37
|
+
assert_nil instance.config
|
38
|
+
end
|
39
|
+
|
40
|
+
should "set the top of the config object to the given top" do
|
41
|
+
instance = @klass.new(@top, :chef_solo)
|
42
|
+
assert_equal @top, instance.config.top
|
43
|
+
end
|
44
|
+
|
45
|
+
should "configure the provisioner if valid" do
|
46
|
+
instance = @klass.new(@top, :chef_solo) do |chef|
|
47
|
+
chef.cookbooks_path = "foo"
|
48
|
+
end
|
49
|
+
|
50
|
+
assert_equal "foo", instance.config.cookbooks_path
|
51
|
+
end
|
52
|
+
|
53
|
+
should "configure the provisioner with a hash if valid" do
|
54
|
+
instance = @klass.new(@top, :chef_solo, :cookbooks_path => "foo")
|
55
|
+
assert_equal "foo", instance.config.cookbooks_path
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "validation" do
|
60
|
+
setup do
|
61
|
+
@errors = Vagrant::Config::ErrorRecorder.new
|
62
|
+
end
|
63
|
+
|
64
|
+
should "be invalid if provisioner is valid" do
|
65
|
+
instance = @klass.new(@top, :i_shall_never_exist)
|
66
|
+
instance.validate(@errors)
|
67
|
+
assert !@errors.errors.empty?
|
68
|
+
end
|
69
|
+
|
70
|
+
should "be invalid if provisioner doesn't inherit from provisioners base" do
|
71
|
+
klass = Class.new
|
72
|
+
instance = @klass.new(@top, klass)
|
73
|
+
instance.validate(@errors)
|
74
|
+
assert !@errors.errors.empty?
|
75
|
+
end
|
76
|
+
|
77
|
+
should "be valid with a valid provisioner" do
|
78
|
+
instance = @klass.new(@top, :chef_solo) do |chef|
|
79
|
+
chef.add_recipe "foo"
|
80
|
+
end
|
81
|
+
|
82
|
+
instance.validate(@errors)
|
83
|
+
assert @errors.errors.empty?
|
84
|
+
end
|
85
|
+
|
86
|
+
should "be invalid if a provisioner's config is invalid" do
|
87
|
+
instance = @klass.new(@top, :chef_solo)
|
88
|
+
instance.validate(@errors)
|
89
|
+
assert !@errors.errors.empty?
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -75,4 +75,12 @@ class ConfigVMTest < Test::Unit::TestCase
|
|
75
75
|
assert_equal @username, @config.shared_folder_gid
|
76
76
|
end
|
77
77
|
end
|
78
|
+
|
79
|
+
context "deprecated config" do
|
80
|
+
should "raise an error for provisioner=" do
|
81
|
+
assert_raises(Vagrant::Errors::VagrantError) {
|
82
|
+
@config.provisioner = :chef_solo
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
78
86
|
end
|