vagrant 0.7.8 → 0.8.1

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.
Files changed (79) hide show
  1. data/CHANGELOG.md +39 -0
  2. data/Gemfile +1 -7
  3. data/Rakefile +0 -11
  4. data/bin/vagrant +4 -0
  5. data/config/default.rb +1 -2
  6. data/lib/vagrant.rb +7 -5
  7. data/lib/vagrant/action.rb +5 -1
  8. data/lib/vagrant/action/builtin.rb +4 -1
  9. data/lib/vagrant/action/general/package.rb +6 -2
  10. data/lib/vagrant/action/vm.rb +2 -0
  11. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +9 -22
  12. data/lib/vagrant/action/vm/clear_shared_folders.rb +9 -14
  13. data/lib/vagrant/action/vm/customize.rb +9 -4
  14. data/lib/vagrant/action/vm/forward_ports.rb +10 -11
  15. data/lib/vagrant/action/vm/match_mac_address.rb +8 -3
  16. data/lib/vagrant/action/vm/modify.rb +37 -0
  17. data/lib/vagrant/action/vm/network.rb +9 -2
  18. data/lib/vagrant/action/vm/provision.rb +10 -17
  19. data/lib/vagrant/action/vm/provisioner_cleanup.rb +26 -0
  20. data/lib/vagrant/action/vm/share_folders.rb +16 -8
  21. data/lib/vagrant/action/warden.rb +8 -2
  22. data/lib/vagrant/command/ssh.rb +4 -4
  23. data/lib/vagrant/command/ssh_config.rb +4 -2
  24. data/lib/vagrant/config/ssh.rb +3 -0
  25. data/lib/vagrant/config/vm.rb +16 -12
  26. data/lib/vagrant/downloaders/http.rb +2 -0
  27. data/lib/vagrant/environment.rb +136 -12
  28. data/lib/vagrant/errors.rb +15 -0
  29. data/lib/vagrant/provisioners.rb +1 -1
  30. data/lib/vagrant/provisioners/base.rb +4 -0
  31. data/lib/vagrant/provisioners/chef.rb +13 -11
  32. data/lib/vagrant/provisioners/{chef_server.rb → chef_client.rb} +5 -5
  33. data/lib/vagrant/provisioners/chef_solo.rb +48 -89
  34. data/lib/vagrant/provisioners/shell.rb +47 -12
  35. data/lib/vagrant/ssh.rb +61 -27
  36. data/lib/vagrant/systems.rb +1 -0
  37. data/lib/vagrant/systems/base.rb +1 -1
  38. data/lib/vagrant/systems/linux.rb +7 -9
  39. data/lib/vagrant/systems/redhat.rb +12 -4
  40. data/lib/vagrant/systems/solaris.rb +9 -4
  41. data/lib/vagrant/systems/suse.rb +9 -0
  42. data/lib/vagrant/ui.rb +12 -5
  43. data/lib/vagrant/util.rb +2 -2
  44. data/lib/vagrant/util/counter.rb +22 -0
  45. data/lib/vagrant/util/platform.rb +1 -2
  46. data/lib/vagrant/util/safe_exec.rb +28 -0
  47. data/lib/vagrant/version.rb +1 -1
  48. data/lib/vagrant/vm.rb +2 -0
  49. data/templates/chef_solo_solo.erb +4 -4
  50. data/templates/commands/init/Vagrantfile.erb +4 -0
  51. data/templates/locales/en.yml +31 -8
  52. data/templates/ssh_config.erb +6 -0
  53. data/test/test_helper.rb +5 -3
  54. data/test/vagrant/action/builder_test.rb +4 -0
  55. data/test/vagrant/action/vm/clear_forwarded_ports_test.rb +18 -38
  56. data/test/vagrant/action/vm/clear_shared_folders_test.rb +7 -16
  57. data/test/vagrant/action/vm/customize_test.rb +12 -5
  58. data/test/vagrant/action/vm/forward_ports_test.rb +12 -7
  59. data/test/vagrant/action/vm/match_mac_address_test.rb +5 -1
  60. data/test/vagrant/action/vm/modify_test.rb +38 -0
  61. data/test/vagrant/action/vm/provision_test.rb +13 -38
  62. data/test/vagrant/action/vm/provisioner_cleanup_test.rb +56 -0
  63. data/test/vagrant/action/vm/share_folders_test.rb +10 -5
  64. data/test/vagrant/action/warden_test.rb +13 -7
  65. data/test/vagrant/config/vm_test.rb +0 -22
  66. data/test/vagrant/downloaders/http_test.rb +2 -0
  67. data/test/vagrant/environment_test.rb +110 -20
  68. data/test/vagrant/provisioners/{chef_server_test.rb → chef_client_test.rb} +2 -2
  69. data/test/vagrant/provisioners/chef_solo_test.rb +16 -173
  70. data/test/vagrant/ssh_test.rb +8 -43
  71. data/test/vagrant/systems/linux_test.rb +9 -19
  72. data/test/vagrant/util/counter_test.rb +29 -0
  73. data/test/vagrant/util/platform_test.rb +2 -2
  74. data/vagrant.gemspec +1 -2
  75. metadata +114 -84
  76. data/lib/vagrant/util/plain_logger.rb +0 -25
  77. data/lib/vagrant/util/resource_logger.rb +0 -63
  78. data/test/vagrant/util/plain_logger_test.rb +0 -17
  79. data/test/vagrant/util/resource_logger_test.rb +0 -78
@@ -8,53 +8,18 @@ class ClearForwardedPortsVMActionTest < Test::Unit::TestCase
8
8
  @vm = mock("vm")
9
9
  @vm.stubs(:name).returns("foo")
10
10
  @env["vm"] = @vm
11
+ @env["vm.modify"] = mock("proc")
11
12
 
12
13
  @instance = @klass.new(@app, @env)
13
14
  end
14
15
 
15
16
  context "calling" do
16
- should "call the proper methods and continue chain" do
17
- seq = sequence('seq')
18
- @instance.expects(:clear).in_sequence(seq)
19
- @app.expects(:call).with(@env).in_sequence(seq)
20
- @instance.call(@env)
21
- end
22
- end
23
-
24
- context "clearing forwarded ports" do
25
- setup do
26
- @instance.stubs(:used_ports).returns([:a])
27
- @instance.stubs(:clear_ports)
28
- end
29
-
30
- should "call destroy on all forwarded ports" do
31
- @instance.expects(:clear_ports).once
32
- @vm.expects(:reload!)
33
- @instance.clear
34
- end
35
-
36
- should "do nothing if there are no forwarded ports" do
37
- @instance.stubs(:used_ports).returns([])
38
- @vm.expects(:reload!).never
39
- @instance.clear
40
- end
41
- end
42
-
43
- context "clearing ports" do
44
17
  def mock_fp
45
18
  fp = mock("fp")
46
19
  fp.expects(:destroy).once
47
20
  fp
48
21
  end
49
22
 
50
- setup do
51
- VirtualBox.stubs(:version).returns("3.2.8")
52
- @adapters = []
53
- @internal_vm = mock("internal_vm")
54
- @internal_vm.stubs(:network_adapters).returns(@adapters)
55
- @vm.stubs(:vm).returns(@internal_vm)
56
- end
57
-
58
23
  def mock_adapter
59
24
  na = mock("adapter")
60
25
  engine = mock("engine")
@@ -63,10 +28,25 @@ class ClearForwardedPortsVMActionTest < Test::Unit::TestCase
63
28
  na
64
29
  end
65
30
 
66
- should "destroy each forwarded port" do
31
+ setup do
32
+ VirtualBox.stubs(:version).returns("3.2.8")
33
+ @adapters = []
34
+ @internal_vm = mock("internal_vm")
35
+ @internal_vm.stubs(:network_adapters).returns(@adapters)
36
+ @vm.stubs(:vm).returns(@internal_vm)
37
+ end
38
+
39
+ should "call the proper methods and continue chain" do
67
40
  @adapters << mock_adapter
68
41
  @adapters << mock_adapter
69
- @instance.clear_ports
42
+
43
+ @env["vm.modify"].expects(:call).with() do |proc|
44
+ proc.call(@internal_vm)
45
+ true
46
+ end
47
+
48
+ @app.expects(:call).with(@env)
49
+ @instance.call(@env)
70
50
  end
71
51
  end
72
52
  end
@@ -7,6 +7,7 @@ class ClearSharedFoldersVMActionTest < Test::Unit::TestCase
7
7
 
8
8
  @vm = mock("vm")
9
9
  @env["vm"] = @vm
10
+ @env["vm.modify"] = mock("proc")
10
11
 
11
12
  @internal_vm = mock("internal")
12
13
  @vm.stubs(:vm).returns(@internal_vm)
@@ -15,15 +16,6 @@ class ClearSharedFoldersVMActionTest < Test::Unit::TestCase
15
16
  end
16
17
 
17
18
  context "calling" do
18
- should "call the proper methods in sequence" do
19
- seq = sequence("seq")
20
- @instance.expects(:clear_shared_folders).once.in_sequence(seq)
21
- @app.expects(:call).with(@env).once
22
- @instance.call(@env)
23
- end
24
- end
25
-
26
- context "clearing shared folders" do
27
19
  setup do
28
20
  @shared_folder = mock("shared_folder")
29
21
  @shared_folders = [@shared_folder]
@@ -36,14 +28,13 @@ class ClearSharedFoldersVMActionTest < Test::Unit::TestCase
36
28
  sf.expects(:destroy).once.in_sequence(destroy_seq)
37
29
  end
38
30
 
39
- @vm.expects(:reload!).once.in_sequence(destroy_seq)
40
- @instance.clear_shared_folders
41
- end
31
+ @env["vm.modify"].expects(:call).with() do |proc|
32
+ proc.call(@internal_vm)
33
+ true
34
+ end
42
35
 
43
- should "do nothing if no shared folders existed" do
44
- @shared_folders.clear
45
- @vm.expects(:reload!).never
46
- @instance.clear_shared_folders
36
+ @app.expects(:call).with(@env).once
37
+ @instance.call(@env)
47
38
  end
48
39
  end
49
40
  end
@@ -8,22 +8,29 @@ class CustomizeVMActionTest < Test::Unit::TestCase
8
8
 
9
9
  @vm = mock("vm")
10
10
  @env["vm"] = @vm
11
+ @env["vm.modify"] = mock("proc")
11
12
 
12
13
  @internal_vm = mock("internal")
13
14
  @vm.stubs(:vm).returns(@internal_vm)
14
15
  end
15
16
 
16
17
  should "not run anything if no customize blocks exist" do
17
- @env.env.config.vm.proc_stack.clear
18
- @internal_vm.expects(:save).never
18
+ @env["config"].vm.proc_stack.clear
19
+ @env["vm.modify"].expects(:call).never
19
20
  @app.expects(:call).with(@env).once
20
21
  @instance.call(@env)
21
22
  end
22
23
 
23
24
  should "run the VM customization procs then save the VM" do
24
- @env.env.config.vm.customize { |vm| }
25
- @env.env.config.vm.expects(:run_procs!).with(@internal_vm)
26
- @internal_vm.expects(:save).once
25
+ ran = false
26
+ @env["config"].vm.customize { |vm| }
27
+ @env["config"].vm.expects(:run_procs!).with(@internal_vm)
28
+
29
+ @env["vm.modify"].expects(:call).with() do |proc|
30
+ proc.call(@internal_vm)
31
+ true
32
+ end
33
+
27
34
  @app.expects(:call).with(@env).once
28
35
  @instance.call(@env)
29
36
  end
@@ -8,6 +8,7 @@ class ForwardPortsVMActionTest < Test::Unit::TestCase
8
8
  @vm = mock("vm")
9
9
  @vm.stubs(:name).returns("foo")
10
10
  @env["vm"] = @vm
11
+ @env["vm.modify"] = mock("proc")
11
12
  end
12
13
 
13
14
  context "initializing" do
@@ -123,6 +124,12 @@ class ForwardPortsVMActionTest < Test::Unit::TestCase
123
124
  context "calling" do
124
125
  should "clear all previous ports and forward new ports" do
125
126
  exec_seq = sequence("exec_seq")
127
+
128
+ @env["vm.modify"].expects(:call).with() do |proc|
129
+ proc.call(@internal_vm)
130
+ true
131
+ end
132
+
126
133
  @instance.expects(:forward_ports).once.in_sequence(exec_seq)
127
134
  @app.expects(:call).once.with(@env).in_sequence(exec_seq)
128
135
  @instance.call(@env)
@@ -143,9 +150,8 @@ class ForwardPortsVMActionTest < Test::Unit::TestCase
143
150
  network_adapter.expects(:attachment_type).returns(:nat)
144
151
 
145
152
  @instance.expects(:forward_port).once
146
- @internal_vm.expects(:save).once
147
- @vm.expects(:reload!).once
148
- @instance.forward_ports
153
+
154
+ @instance.forward_ports(@internal_vm)
149
155
  end
150
156
 
151
157
  should "not port forward for non NAT interfaces" do
@@ -154,9 +160,8 @@ class ForwardPortsVMActionTest < Test::Unit::TestCase
154
160
 
155
161
  @internal_vm.expects(:network_adapters).returns([network_adapter])
156
162
  network_adapter.expects(:attachment_type).returns(:host_only)
157
- @internal_vm.expects(:save).once
158
- @vm.expects(:reload!).once
159
- @instance.forward_ports
163
+
164
+ @instance.forward_ports(@internal_vm)
160
165
  end
161
166
  end
162
167
 
@@ -188,7 +193,7 @@ class ForwardPortsVMActionTest < Test::Unit::TestCase
188
193
  adapters[opts[:adapter]] = adapter
189
194
  @internal_vm.stubs(:network_adapters).returns(adapters)
190
195
 
191
- @instance.forward_port(name, opts)
196
+ @instance.forward_port(@internal_vm, name, opts)
192
197
  end
193
198
  end
194
199
  end
@@ -20,9 +20,13 @@ class MatchMACAddressVMActionTest < Test::Unit::TestCase
20
20
 
21
21
  update_seq = sequence("update_seq")
22
22
  @internal_vm.expects(:network_adapters).returns([nic]).once.in_sequence(update_seq)
23
- @internal_vm.expects(:save).once.in_sequence(update_seq)
24
23
  @app.expects(:call).with(@env).once.in_sequence(update_seq)
25
24
 
25
+ @env["vm.modify"].expects(:call).with() do |proc|
26
+ proc.call(@internal_vm)
27
+ true
28
+ end
29
+
26
30
  @instance.call(@env)
27
31
  end
28
32
 
@@ -0,0 +1,38 @@
1
+ require "test_helper"
2
+
3
+ class ModifyVMActionTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = Vagrant::Action::VM::Modify
6
+ @app, @env = action_env
7
+
8
+ @vm = mock("vm")
9
+ @vm.stubs(:ssh).returns(mock("ssh"))
10
+ @env["vm"] = @vm
11
+
12
+ @internal_vm = mock("internal")
13
+ @vm.stubs(:vm).returns(@internal_vm)
14
+
15
+ @instance = @klass.new(@app, @env)
16
+ end
17
+
18
+ context "initialization" do
19
+ should "have the vm.modify function setup in the environment" do
20
+ assert @env.has_key?("vm.modify")
21
+ end
22
+ end
23
+
24
+ context "calling" do
25
+ should "run the procs with the VM as an argument and save the VM" do
26
+ seq = sequence("procseq")
27
+
28
+ proc = Proc.new { |vm| }
29
+ @env["vm.modify"].call(proc)
30
+
31
+ proc.expects(:call).with(@internal_vm).once.in_sequence(seq)
32
+ @internal_vm.expects(:save).once.in_sequence(seq)
33
+ @vm.expects(:reload!).once.in_sequence(seq)
34
+
35
+ @instance.call(@env)
36
+ end
37
+ end
38
+ end
@@ -15,29 +15,6 @@ class ProvisionVMActionTest < Test::Unit::TestCase
15
15
  @vm.stubs(:vm).returns(@internal_vm)
16
16
  end
17
17
 
18
- context "initializing" do
19
- setup do
20
- @klass.any_instance.stubs(:load_provisioners)
21
- end
22
-
23
- should "load provisioner if provisioning enabled" do
24
- @env["config"].vm.provision :chef_solo
25
- @klass.any_instance.expects(:load_provisioners).once
26
- @klass.new(@app, @env)
27
- end
28
-
29
- should "not load provisioner if disabled" do
30
- @klass.any_instance.expects(:load_provisioners).never
31
- @klass.new(@app, @env)
32
- end
33
-
34
- should "not load provisioner if disabled through env hash" do
35
- @env["provision.enabled"] = false
36
- @klass.any_instance.expects(:load_provisioners).never
37
- @klass.new(@app, @env)
38
- end
39
- end
40
-
41
18
  context "with an instance" do
42
19
  setup do
43
20
  # Set provisioner to nil so the provisioner isn't loaded on init
@@ -46,16 +23,12 @@ class ProvisionVMActionTest < Test::Unit::TestCase
46
23
  end
47
24
 
48
25
  context "loading a provisioner" do
49
- setup do
50
- Vagrant::Provisioners::ChefSolo.any_instance.expects(:prepare).at_least(0)
51
- end
52
-
53
26
  should "instantiate and prepare each provisioner" do
54
27
  @env["config"].vm.provision :chef_solo
55
28
  @env["config"].vm.provision :chef_solo
56
- @instance.load_provisioners
29
+ provisioners = @instance.enabled_provisioners
57
30
 
58
- assert_equal 2, @instance.provisioners.length
31
+ assert_equal 2, provisioners.length
59
32
  end
60
33
 
61
34
  should "set the config for each provisioner" do
@@ -63,23 +36,25 @@ class ProvisionVMActionTest < Test::Unit::TestCase
63
36
  chef.cookbooks_path = "foo"
64
37
  end
65
38
 
66
- @instance.load_provisioners
39
+ provisioners = @instance.enabled_provisioners
67
40
 
68
- assert_equal "foo", @instance.provisioners.first.config.cookbooks_path
41
+ assert_equal "foo", provisioners.first.config.cookbooks_path
69
42
  end
70
43
  end
71
44
 
72
45
  context "calling" do
73
- setup do
74
- Vagrant::Provisioners::ChefSolo.any_instance.stubs(:prepare)
75
- @env["config"].vm.provision :chef_solo
76
- @instance.load_provisioners
77
- end
78
-
79
46
  should "provision and continue chain" do
47
+ provisioners = [mock("one"), mock("two")]
80
48
  seq = sequence("seq")
49
+ @instance.stubs(:enabled_provisioners).returns(provisioners)
50
+
51
+ provisioners.each do |prov|
52
+ prov.expects(:prepare).in_sequence(seq)
53
+ end
54
+
81
55
  @app.expects(:call).with(@env).in_sequence(seq)
82
- @instance.provisioners.each do |prov|
56
+
57
+ provisioners.each do |prov|
83
58
  prov.expects(:provision!).in_sequence(seq)
84
59
  end
85
60
 
@@ -0,0 +1,56 @@
1
+ require "test_helper"
2
+
3
+ class ProvisionerCleanupVMActionTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = Vagrant::Action::VM::ProvisionerCleanup
6
+ @app, @env = action_env
7
+
8
+ @vm = mock("vm")
9
+ @env["vm"] = @vm
10
+
11
+ @internal_vm = mock("internal")
12
+ @vm.stubs(:vm).returns(@internal_vm)
13
+ end
14
+
15
+ context "with an instance" do
16
+ setup do
17
+ # Set provisioner to nil so the provisioner isn't loaded on init
18
+ @env["config"].vm.provisioners.clear
19
+ @instance = @klass.new(@app, @env)
20
+ end
21
+
22
+ context "loading a provisioner" do
23
+ should "instantiate and prepare each provisioner" do
24
+ @env["config"].vm.provision :chef_solo
25
+ @env["config"].vm.provision :chef_solo
26
+ provisioners = @instance.enabled_provisioners
27
+
28
+ assert_equal 2, provisioners.length
29
+ end
30
+
31
+ should "set the config for each provisioner" do
32
+ @env["config"].vm.provision :chef_solo do |chef|
33
+ chef.cookbooks_path = "foo"
34
+ end
35
+
36
+ provisioners = @instance.enabled_provisioners
37
+
38
+ assert_equal "foo", provisioners.first.config.cookbooks_path
39
+ end
40
+ end
41
+
42
+ context "calling" do
43
+ should "provision and continue chain" do
44
+ provisioners = [mock("one"), mock("two")]
45
+ seq = sequence("seq")
46
+ @instance.stubs(:enabled_provisioners).returns(provisioners)
47
+ provisioners.each do |prov|
48
+ prov.expects(:cleanup).in_sequence(seq)
49
+ end
50
+ @app.expects(:call).with(@env).in_sequence(seq)
51
+
52
+ @instance.call(@env)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -10,6 +10,7 @@ class ShareFoldersVMActionTest < Test::Unit::TestCase
10
10
  @vm.stubs(:ssh).returns(mock("ssh"))
11
11
  @vm.stubs(:system).returns(mock("system"))
12
12
  @env["vm"] = @vm
13
+ @env["vm.modify"] = mock("proc")
13
14
 
14
15
  @internal_vm = mock("internal")
15
16
  @vm.stubs(:vm).returns(@internal_vm)
@@ -105,7 +106,11 @@ class ShareFoldersVMActionTest < Test::Unit::TestCase
105
106
  end
106
107
 
107
108
  @internal_vm.stubs(:shared_folders).returns(shared_folders)
108
- @internal_vm.expects(:save).once
109
+
110
+ @env["vm.modify"].expects(:call).with() do |proc|
111
+ proc.call(@internal_vm)
112
+ true
113
+ end
109
114
 
110
115
  @instance.create_metadata
111
116
  end
@@ -114,8 +119,8 @@ class ShareFoldersVMActionTest < Test::Unit::TestCase
114
119
  context "mounting the shared folders" do
115
120
  setup do
116
121
  @folders = stub_shared_folders(<<-sf)
117
- config.vm.share_folder("foo", "fooguest", "foohost")
118
- config.vm.share_folder("bar", "barguest", "barhost")
122
+ config.vm.share_folder("foo", "fooguest", "foohost", :owner => "yo", :group => "fo")
123
+ config.vm.share_folder("bar", "barguest", "barhost", :owner => "foo", :group => "bar")
119
124
  config.vm.share_folder("foo_no_mount", nil, "foohost2")
120
125
  sf
121
126
  @ssh = mock("ssh")
@@ -127,9 +132,9 @@ class ShareFoldersVMActionTest < Test::Unit::TestCase
127
132
  mount_seq = sequence("mount_seq")
128
133
  @folders.each do |name, data|
129
134
  if data[:guestpath]
130
- @vm.system.expects(:mount_shared_folder).with(@ssh, name, data[:guestpath]).in_sequence(mount_seq)
135
+ @vm.system.expects(:mount_shared_folder).with(@ssh, name, data[:guestpath], data[:owner], data[:group]).in_sequence(mount_seq)
131
136
  else
132
- @vm.system.expects(:mount_shared_folder).with(@ssh, name, anything).never
137
+ @vm.system.expects(:mount_shared_folder).with(@ssh, name, anything, anything, anything).never
133
138
  end
134
139
  end
135
140