vagrant 0.1.4 → 0.2.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/Gemfile +1 -1
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/bin/vagrant-box +1 -2
  5. data/bin/vagrant-down +1 -2
  6. data/bin/vagrant-halt +1 -2
  7. data/bin/vagrant-init +1 -2
  8. data/bin/vagrant-package +1 -2
  9. data/bin/vagrant-reload +1 -2
  10. data/bin/vagrant-resume +1 -2
  11. data/bin/vagrant-ssh +1 -2
  12. data/bin/vagrant-status +29 -0
  13. data/bin/vagrant-suspend +1 -2
  14. data/bin/vagrant-up +1 -2
  15. data/config/default.rb +5 -9
  16. data/keys/README.md +10 -0
  17. data/keys/vagrant +27 -0
  18. data/keys/vagrant.pub +1 -0
  19. data/lib/vagrant/actions/base.rb +14 -0
  20. data/lib/vagrant/actions/collection.rb +36 -0
  21. data/lib/vagrant/actions/runner.rb +4 -10
  22. data/lib/vagrant/actions/vm/boot.rb +4 -5
  23. data/lib/vagrant/actions/vm/customize.rb +17 -0
  24. data/lib/vagrant/actions/vm/destroy.rb +11 -2
  25. data/lib/vagrant/actions/vm/forward_ports.rb +24 -0
  26. data/lib/vagrant/actions/vm/import.rb +1 -0
  27. data/lib/vagrant/actions/vm/provision.rb +30 -52
  28. data/lib/vagrant/actions/vm/reload.rb +2 -2
  29. data/lib/vagrant/actions/vm/shared_folders.rb +37 -25
  30. data/lib/vagrant/actions/vm/up.rb +8 -4
  31. data/lib/vagrant/active_list.rb +66 -0
  32. data/lib/vagrant/commands.rb +44 -0
  33. data/lib/vagrant/config.rb +64 -47
  34. data/lib/vagrant/downloaders/file.rb +2 -12
  35. data/lib/vagrant/env.rb +48 -12
  36. data/lib/vagrant/provisioners/base.rb +22 -0
  37. data/lib/vagrant/provisioners/chef.rb +102 -0
  38. data/lib/vagrant/provisioners/chef_server.rb +96 -0
  39. data/lib/vagrant/provisioners/chef_solo.rb +67 -0
  40. data/lib/vagrant/ssh.rb +25 -6
  41. data/lib/vagrant/stacked_proc_runner.rb +33 -0
  42. data/lib/vagrant/vm.rb +8 -0
  43. data/lib/vagrant.rb +10 -5
  44. data/test/test_helper.rb +22 -6
  45. data/test/vagrant/actions/collection_test.rb +110 -0
  46. data/test/vagrant/actions/runner_test.rb +11 -7
  47. data/test/vagrant/actions/vm/boot_test.rb +7 -7
  48. data/test/vagrant/actions/vm/customize_test.rb +16 -0
  49. data/test/vagrant/actions/vm/destroy_test.rb +19 -6
  50. data/test/vagrant/actions/vm/forward_ports_test.rb +52 -0
  51. data/test/vagrant/actions/vm/import_test.rb +10 -3
  52. data/test/vagrant/actions/vm/provision_test.rb +75 -70
  53. data/test/vagrant/actions/vm/reload_test.rb +3 -2
  54. data/test/vagrant/actions/vm/shared_folders_test.rb +62 -9
  55. data/test/vagrant/actions/vm/up_test.rb +4 -4
  56. data/test/vagrant/active_list_test.rb +169 -0
  57. data/test/vagrant/config_test.rb +145 -29
  58. data/test/vagrant/downloaders/file_test.rb +4 -19
  59. data/test/vagrant/env_test.rb +96 -23
  60. data/test/vagrant/provisioners/base_test.rb +27 -0
  61. data/test/vagrant/provisioners/chef_server_test.rb +175 -0
  62. data/test/vagrant/provisioners/chef_solo_test.rb +142 -0
  63. data/test/vagrant/provisioners/chef_test.rb +116 -0
  64. data/test/vagrant/ssh_test.rb +29 -8
  65. data/test/vagrant/stacked_proc_runner_test.rb +43 -0
  66. data/test/vagrant/vm_test.rb +23 -0
  67. data/vagrant.gemspec +35 -8
  68. metadata +42 -11
  69. data/script/vagrant-ssh-expect.sh +0 -22
@@ -1,6 +1,23 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
2
 
3
3
  class ConfigTest < Test::Unit::TestCase
4
+ context "the ssh config" do
5
+ should "expand any path when requesting the value" do
6
+ Vagrant::Env.stubs(:root_path).returns('foo')
7
+ File.stubs(:expand_path).with(Vagrant.config.ssh[:private_key_path], 'foo').returns('success')
8
+ assert Vagrant.config.ssh.private_key_path, 'success'
9
+ end
10
+ end
11
+
12
+ context "adding configures" do
13
+ should "forward the method to the Top class" do
14
+ key = mock("key")
15
+ klass = mock("klass")
16
+ Vagrant::Config::Top.expects(:configures).with(key, klass)
17
+ Vagrant::Config.configures(key, klass)
18
+ end
19
+ end
20
+
4
21
  context "resetting" do
5
22
  setup do
6
23
  Vagrant::Config.run { |config| }
@@ -18,10 +35,10 @@ class ConfigTest < Test::Unit::TestCase
18
35
  assert !config.equal?(Vagrant::Config.config)
19
36
  end
20
37
 
21
- should "empty the runners" do
22
- assert !Vagrant::Config.config_runners.empty?
38
+ should "empty the proc stack" do
39
+ assert !Vagrant::Config.proc_stack.empty?
23
40
  Vagrant::Config.reset!
24
- assert Vagrant::Config.config_runners.empty?
41
+ assert Vagrant::Config.proc_stack.empty?
25
42
  end
26
43
  end
27
44
 
@@ -37,30 +54,18 @@ class ConfigTest < Test::Unit::TestCase
37
54
  end
38
55
 
39
56
  context "initializing" do
40
- teardown do
41
- Vagrant::Config.instance_variable_set(:@config_runners, nil)
42
- Vagrant::Config.instance_variable_set(:@config, nil)
43
- end
44
-
45
- should "not run the blocks right away" do
46
- obj = mock("obj")
47
- obj.expects(:foo).never
48
- Vagrant::Config.run { |config| obj.foo }
49
- Vagrant::Config.run { |config| obj.foo }
50
- Vagrant::Config.run { |config| obj.foo }
57
+ setup do
58
+ Vagrant::Config.reset!
51
59
  end
52
60
 
53
- should "run the blocks when execute! is ran" do
54
- obj = mock("obj")
55
- obj.expects(:foo).times(2)
56
- Vagrant::Config.run { |config| obj.foo }
57
- Vagrant::Config.run { |config| obj.foo }
58
- Vagrant::Config.execute!
61
+ should "add the given block to the proc stack" do
62
+ proc = Proc.new {}
63
+ Vagrant::Config.run(&proc)
64
+ assert_equal [proc], Vagrant::Config.proc_stack
59
65
  end
60
66
 
61
- should "run the blocks with the same config object" do
62
- Vagrant::Config.run { |config| assert config }
63
- Vagrant::Config.run { |config| assert config }
67
+ should "run the proc stack with the config when execute is called" do
68
+ Vagrant::Config.expects(:run_procs!).with(Vagrant::Config.config).once
64
69
  Vagrant::Config.execute!
65
70
  end
66
71
 
@@ -109,15 +114,126 @@ class ConfigTest < Test::Unit::TestCase
109
114
  end
110
115
  end
111
116
 
112
- context "chef config" do
117
+ context "top config class" do
113
118
  setup do
114
- @config = Vagrant::Config::ChefConfig.new
115
- @config.json = "HEY"
119
+ @configures_list = []
120
+ Vagrant::Config::Top.stubs(:configures_list).returns(@configures_list)
116
121
  end
117
122
 
118
- should "not include the 'json' key in the config dump" do
119
- result = JSON.parse(@config.to_json)
120
- assert !result.has_key?("json")
123
+ context "adding configure keys" do
124
+ setup do
125
+ @key = "top_config_foo"
126
+ @klass = mock("klass")
127
+ end
128
+
129
+ should "add key and klass to configures list" do
130
+ @configures_list.expects(:<<).with([@key, @klass])
131
+ Vagrant::Config::Top.configures(@key, @klass)
132
+ end
133
+ end
134
+
135
+ context "configuration keys on instance" do
136
+ setup do
137
+ @configures_list.clear
138
+ end
139
+
140
+ should "initialize each configurer and set it to its key" do
141
+ 5.times do |i|
142
+ key = "key#{i}"
143
+ klass = mock("klass#{i}")
144
+ instance = mock("instance#{i}")
145
+ klass.expects(:new).returns(instance)
146
+ @configures_list << [key, klass]
147
+ end
148
+
149
+ Vagrant::Config::Top.new
150
+ end
151
+
152
+ should "allow reading via methods" do
153
+ key = "my_foo_bar_key"
154
+ klass = mock("klass")
155
+ instance = mock("instance")
156
+ klass.expects(:new).returns(instance)
157
+ Vagrant::Config::Top.configures(key, klass)
158
+
159
+ config = Vagrant::Config::Top.new
160
+ assert_equal instance, config.send(key)
161
+ end
162
+ end
163
+
164
+ context "loaded status" do
165
+ setup do
166
+ @top= Vagrant::Config::Top.new
167
+ end
168
+
169
+ should "not be loaded by default" do
170
+ assert !@top.loaded?
171
+ end
172
+
173
+ should "be loaded after calling loaded!" do
174
+ @top.loaded!
175
+ assert @top.loaded?
176
+ end
177
+ end
178
+ end
179
+
180
+ context "vagrant configuration" do
181
+ setup do
182
+ @config = Vagrant::Config::VagrantConfig.new
183
+ end
184
+
185
+ should "return nil if home is nil" do
186
+ File.expects(:expand_path).never
187
+ assert @config.home.nil?
188
+ end
189
+
190
+ should "expand the path if home is not nil" do
191
+ @config.home = "foo"
192
+ File.expects(:expand_path).with("foo").once.returns("result")
193
+ assert_equal "result", @config.home
194
+ end
195
+ end
196
+
197
+ context "VM configuration" do
198
+ setup do
199
+ @config = Vagrant::Config::VMConfig.new
200
+ @username = "bob"
201
+
202
+ mock_config do |config|
203
+ config.ssh.username = @username
204
+ end
205
+ end
206
+
207
+ should "include the stacked proc runner module" do
208
+ assert @config.class.included_modules.include?(Vagrant::StackedProcRunner)
209
+ end
210
+
211
+ should "add the customize proc to the proc stack" do
212
+ proc = Proc.new {}
213
+ @config.customize(&proc)
214
+ assert_equal [proc], @config.proc_stack
215
+ end
216
+
217
+ context "uid/gid" do
218
+ should "return the shared folder UID if set" do
219
+ @config.shared_folder_uid = "foo"
220
+ assert_equal "foo", @config.shared_folder_uid
221
+ end
222
+
223
+ should "return the SSH username if UID not set" do
224
+ @config.shared_folder_uid = nil
225
+ assert_equal @username, @config.shared_folder_uid
226
+ end
227
+
228
+ should "return the shared folder GID if set" do
229
+ @config.shared_folder_gid = "foo"
230
+ assert_equal "foo", @config.shared_folder_gid
231
+ end
232
+
233
+ should "return the SSH username if GID not set" do
234
+ @config.shared_folder_gid = nil
235
+ assert_equal @username, @config.shared_folder_gid
236
+ end
121
237
  end
122
238
  end
123
239
  end
@@ -7,25 +7,10 @@ class FileDownloaderTest < Test::Unit::TestCase
7
7
  end
8
8
 
9
9
  context "downloading" do
10
- setup do
11
- @file = mock("file")
12
- @file.stubs(:read)
13
- @file.stubs(:eof?).returns(false)
14
- @downloader.stubs(:open).yields(@file)
15
- end
16
-
17
- should "open with the given uri" do
18
- @downloader.expects(:open).with(@uri).once
19
- @downloader.download!(@uri, @tempfile)
20
- end
21
-
22
- should "buffer the read from the file and write to the tempfile" do
23
- data = mock("data")
24
- write_seq = sequence("write_seq")
25
- @file.stubs(:eof?).returns(false).in_sequence(write_seq)
26
- @file.expects(:read).returns(data).in_sequence(write_seq)
27
- @tempfile.expects(:write).with(data).in_sequence(write_seq)
28
- @file.stubs(:eof?).returns(true).in_sequence(write_seq)
10
+ should "cp the file" do
11
+ path = '/path'
12
+ @tempfile.expects(:path).returns(path)
13
+ FileUtils.expects(:cp).with(@uri, path)
29
14
  @downloader.download!(@uri, @tempfile)
30
15
  end
31
16
  end
@@ -15,6 +15,24 @@ class EnvTest < Test::Unit::TestCase
15
15
  Vagrant::Box.stubs(:find).returns("foo")
16
16
  end
17
17
 
18
+ context "checking virtualbox version" do
19
+ setup do
20
+ VirtualBox::Command.stubs(:version)
21
+ end
22
+
23
+ should "error and exit if VirtualBox is not installed or detected" do
24
+ Vagrant::Env.expects(:error_and_exit).once
25
+ VirtualBox::Command.expects(:version).returns(nil)
26
+ Vagrant::Env.check_virtualbox!
27
+ end
28
+
29
+ should "error and exit if VirtualBox is lower than version 3.1" do
30
+ Vagrant::Env.expects(:error_and_exit).once
31
+ VirtualBox::Command.expects(:version).returns("3.0.12r1041")
32
+ Vagrant::Env.check_virtualbox!
33
+ end
34
+ end
35
+
18
36
  context "requiring a VM" do
19
37
  setup do
20
38
  Vagrant::Env.stubs(:require_root_path)
@@ -89,6 +107,20 @@ class EnvTest < Test::Unit::TestCase
89
107
  Vagrant::Env.load_config!
90
108
  end
91
109
 
110
+ should "load from the home directory" do
111
+ File.expects(:exist?).with(File.join(Vagrant::Env.home_path, Vagrant::Env::ROOTFILE_NAME)).once
112
+ Vagrant::Env.load_config!
113
+ end
114
+
115
+ should "not load from the home directory if the home config is nil" do
116
+ mock_config do |config|
117
+ config.vagrant.home = nil
118
+ end
119
+
120
+ File.expects(:exist?).with(File.join(Vagrant::Env.home_path, Vagrant::Env::ROOTFILE_NAME)).never
121
+ Vagrant::Env.load_config!
122
+ end
123
+
92
124
  should "not load from the root path if nil" do
93
125
  Vagrant::Env.stubs(:root_path).returns(nil)
94
126
  File.expects(:exist?).with(File.join(@root_path, Vagrant::Env::ROOTFILE_NAME)).never
@@ -129,29 +161,69 @@ class EnvTest < Test::Unit::TestCase
129
161
  end
130
162
 
131
163
  context "initial load" do
132
- test "load! should load the config and set the persisted_uid" do
133
- Vagrant::Env.expects(:load_config!).once
134
- Vagrant::Env.expects(:load_vm!).once
135
- Vagrant::Env.expects(:load_root_path!).once
136
- Vagrant::Env.expects(:load_home_directory!).once
137
- Vagrant::Env.expects(:load_box!).once
164
+ should "load! should load the config and set the persisted_uid" do
165
+ call_seq = sequence("call_sequence")
166
+ Vagrant::Env.expects(:load_root_path!).once.in_sequence(call_seq)
167
+ Vagrant::Env.expects(:load_config!).once.in_sequence(call_seq)
168
+ Vagrant::Env.expects(:load_home_directory!).once.in_sequence(call_seq)
169
+ Vagrant::Env.expects(:load_box!).once.in_sequence(call_seq)
170
+ Vagrant::Env.expects(:load_config!).once.in_sequence(call_seq)
171
+ Vagrant::Env.expects(:check_virtualbox!).once.in_sequence(call_seq)
172
+ Vagrant::Env.expects(:load_vm!).once.in_sequence(call_seq)
138
173
  Vagrant::Env.load!
139
174
  end
140
175
  end
141
176
 
142
177
  context "persisting the VM into a file" do
143
178
  setup do
144
- mock_config
145
- end
179
+ @vm = mock("vm")
180
+ @vm.stubs(:uuid).returns("foo")
146
181
 
147
- test "should save it to the dotfile path" do
148
- vm = mock("vm")
149
- vm.stubs(:uuid).returns("foo")
182
+ File.stubs(:open)
183
+ Vagrant::ActiveList.stubs(:add)
184
+ end
150
185
 
186
+ should "should save it to the dotfile path" do
151
187
  filemock = mock("filemock")
152
- filemock.expects(:write).with(vm.uuid)
188
+ filemock.expects(:write).with(@vm.uuid)
153
189
  File.expects(:open).with(Vagrant::Env.dotfile_path, 'w+').once.yields(filemock)
154
- Vagrant::Env.persist_vm(vm)
190
+ Vagrant::Env.persist_vm(@vm)
191
+ end
192
+
193
+ should "add the VM to the activelist" do
194
+ Vagrant::ActiveList.expects(:add).with(@vm)
195
+ Vagrant::Env.persist_vm(@vm)
196
+ end
197
+ end
198
+
199
+ context "depersisting the VM" do
200
+ setup do
201
+ File.stubs(:exist?).returns(false)
202
+ File.stubs(:delete)
203
+
204
+ Vagrant::ActiveList.stubs(:remove)
205
+
206
+ @dotfile_path = "foo"
207
+ Vagrant::Env.stubs(:dotfile_path).returns(@dotfile_path)
208
+
209
+ @vm = mock("vm")
210
+ end
211
+
212
+ should "remove the dotfile if it exists" do
213
+ File.expects(:exist?).with(Vagrant::Env.dotfile_path).returns(true)
214
+ File.expects(:delete).with(Vagrant::Env.dotfile_path).once
215
+ Vagrant::Env.depersist_vm(@vm)
216
+ end
217
+
218
+ should "not remove the dotfile if it doesn't exist" do
219
+ File.expects(:exist?).returns(false)
220
+ File.expects(:delete).never
221
+ Vagrant::Env.depersist_vm(@vm)
222
+ end
223
+
224
+ should "remove from the active list" do
225
+ Vagrant::ActiveList.expects(:remove).with(@vm)
226
+ Vagrant::Env.depersist_vm(@vm)
155
227
  end
156
228
  end
157
229
 
@@ -191,7 +263,7 @@ class EnvTest < Test::Unit::TestCase
191
263
  context "loading the root path" do
192
264
  should "default the path to the pwd if nil" do
193
265
  @path = mock("path")
194
- @path.stubs(:to_s).returns("/")
266
+ @path.stubs(:root?).returns(true)
195
267
  Pathname.expects(:new).with(Dir.pwd).returns(@path)
196
268
  Vagrant::Env.load_root_path!(nil)
197
269
  end
@@ -199,7 +271,9 @@ class EnvTest < Test::Unit::TestCase
199
271
  should "not default the path to pwd if its not nil" do
200
272
  @path = mock("path")
201
273
  @path.stubs(:to_s).returns("/")
202
- Pathname.expects(:new).never
274
+ File.expects(:expand_path).with(@path).returns("/")
275
+ Pathname.expects(:new).with("/").returns(@path)
276
+ @path.stubs(:root?).returns(true)
203
277
  Vagrant::Env.load_root_path!(@path)
204
278
  end
205
279
 
@@ -224,8 +298,13 @@ class EnvTest < Test::Unit::TestCase
224
298
  end
225
299
 
226
300
  should "return false if not found on windows-style root" do
227
- path = Pathname.new("C:.")
228
- assert !Vagrant::Env.load_root_path!(path)
301
+ # TODO: Is there _any_ way to test this on unix machines? The
302
+ # expand path doesn't work [properly for the test] on unix machines.
303
+ if RUBY_PLATFORM.downcase.include?("mswin")
304
+ # Note the escaped back slash
305
+ path = Pathname.new("C:\\")
306
+ assert !Vagrant::Env.load_root_path!(path)
307
+ end
229
308
  end
230
309
 
231
310
  should "should set the path for the rootfile" do
@@ -283,12 +362,6 @@ class EnvTest < Test::Unit::TestCase
283
362
  Vagrant::Env.load_box!
284
363
  assert @box.equal?(Vagrant::Env.box)
285
364
  end
286
-
287
- should "load the config if a box is loaded" do
288
- Vagrant::Env.expects(:load_config!).once
289
- Vagrant::Box.expects(:find).returns(@box)
290
- Vagrant::Env.load_box!
291
- end
292
365
  end
293
366
 
294
367
  context "requiring boxes" do
@@ -0,0 +1,27 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class BaseProvisionerTest < Test::Unit::TestCase
4
+ should "include the util class so subclasses have access to it" do
5
+ assert Vagrant::Provisioners::Base.include?(Vagrant::Util)
6
+ end
7
+
8
+ context "base instance" do
9
+ setup do
10
+ @base = Vagrant::Provisioners::Base.new
11
+ end
12
+
13
+ should "implement provision! which does nothing" do
14
+ assert_nothing_raised do
15
+ assert @base.respond_to?(:provision!)
16
+ @base.provision!
17
+ end
18
+ end
19
+
20
+ should "implement prepare which does nothing" do
21
+ assert_nothing_raised do
22
+ assert @base.respond_to?(:prepare)
23
+ @base.prepare
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,175 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class ChefServerProvisionerTest < Test::Unit::TestCase
4
+ setup do
5
+ @action = Vagrant::Provisioners::ChefServer.new
6
+
7
+ Vagrant::SSH.stubs(:execute)
8
+ Vagrant::SSH.stubs(:upload!)
9
+
10
+ mock_config
11
+ end
12
+
13
+ context "provisioning" do
14
+ should "run the proper sequence of methods in order" do
15
+ prov_seq = sequence("prov_seq")
16
+ @action.expects(:chown_provisioning_folder).once.in_sequence(prov_seq)
17
+ @action.expects(:create_client_key_folder).once.in_sequence(prov_seq)
18
+ @action.expects(:upload_validation_key).once.in_sequence(prov_seq)
19
+ @action.expects(:setup_json).once.in_sequence(prov_seq)
20
+ @action.expects(:setup_config).once.in_sequence(prov_seq)
21
+ @action.expects(:run_chef_client).once.in_sequence(prov_seq)
22
+ @action.provision!
23
+ end
24
+ end
25
+
26
+ context "preparing" do
27
+ setup do
28
+ File.stubs(:file?).returns(true)
29
+ end
30
+
31
+ should "not raise an exception if validation_key_path is set" do
32
+ mock_config do |config|
33
+ config.chef.validation_key_path = "7"
34
+ end
35
+
36
+ assert_nothing_raised { @action.prepare }
37
+ end
38
+
39
+ should "raise an exception if validation_key_path is nil" do
40
+ mock_config do |config|
41
+ config.chef.validation_key_path = nil
42
+ end
43
+
44
+ assert_raises(Vagrant::Actions::ActionException) {
45
+ @action.prepare
46
+ }
47
+ end
48
+
49
+ should "not raise an exception if validation_key_path does exist" do
50
+ mock_config do |config|
51
+ config.chef.validation_key_path = "7"
52
+ end
53
+
54
+ File.expects(:file?).with(Vagrant.config.chef.validation_key_path).returns(true)
55
+ assert_nothing_raised { @action.prepare }
56
+ end
57
+
58
+ should "raise an exception if validation_key_path doesn't exist" do
59
+ mock_config do |config|
60
+ config.chef.validation_key_path = "7"
61
+ end
62
+
63
+ File.expects(:file?).with(Vagrant.config.chef.validation_key_path).returns(false)
64
+ assert_raises(Vagrant::Actions::ActionException) {
65
+ @action.prepare
66
+ }
67
+ end
68
+
69
+ should "not raise an exception if chef_server_url is set" do
70
+ mock_config do |config|
71
+ config.chef.chef_server_url = "7"
72
+ end
73
+
74
+ assert_nothing_raised { @action.prepare }
75
+ end
76
+
77
+ should "raise an exception if chef_server_url is nil" do
78
+ mock_config do |config|
79
+ config.chef.chef_server_url = nil
80
+ end
81
+
82
+ assert_raises(Vagrant::Actions::ActionException) {
83
+ @action.prepare
84
+ }
85
+ end
86
+ end
87
+
88
+ context "creating the client key folder" do
89
+ setup do
90
+ @raw_path = "/foo/bar/baz.pem"
91
+ mock_config do |config|
92
+ config.chef.client_key_path = @raw_path
93
+ end
94
+
95
+ @path = Pathname.new(@raw_path)
96
+ end
97
+
98
+ should "create the folder using the dirname of the path" do
99
+ ssh = mock("ssh")
100
+ ssh.expects(:exec!).with("sudo mkdir -p #{@path.dirname}").once
101
+ Vagrant::SSH.expects(:execute).yields(ssh)
102
+ @action.create_client_key_folder
103
+ end
104
+ end
105
+
106
+ context "uploading the validation key" do
107
+ should "upload the validation key to the provisioning path" do
108
+ @action.expects(:validation_key_path).once.returns("foo")
109
+ @action.expects(:guest_validation_key_path).once.returns("bar")
110
+ Vagrant::SSH.expects(:upload!).with("foo", "bar").once
111
+ @action.upload_validation_key
112
+ end
113
+ end
114
+
115
+ context "the validation key path" do
116
+ should "expand the configured key path" do
117
+ result = mock("result")
118
+ File.expects(:expand_path).with(Vagrant.config.chef.validation_key_path, Vagrant::Env.root_path).once.returns(result)
119
+ assert_equal result, @action.validation_key_path
120
+ end
121
+ end
122
+
123
+ context "the guest validation key path" do
124
+ should "be the provisioning path joined with validation.pem" do
125
+ result = mock("result")
126
+ File.expects(:join).with(Vagrant.config.chef.provisioning_path, "validation.pem").once.returns(result)
127
+ assert_equal result, @action.guest_validation_key_path
128
+ end
129
+ end
130
+
131
+ context "generating and uploading chef client configuration file" do
132
+ setup do
133
+ @action.stubs(:guest_validation_key_path).returns("foo")
134
+ end
135
+
136
+ should "upload properly generate the configuration file using configuration data" do
137
+ expected_config = <<-config
138
+ log_level :info
139
+ log_location STDOUT
140
+ ssl_verify_mode :verify_none
141
+ chef_server_url "#{Vagrant.config.chef.chef_server_url}"
142
+
143
+ validation_client_name "#{Vagrant.config.chef.validation_client_name}"
144
+ validation_key "#{@action.guest_validation_key_path}"
145
+ client_key "#{Vagrant.config.chef.client_key_path}"
146
+
147
+ file_store_path "/srv/chef/file_store"
148
+ file_cache_path "/srv/chef/cache"
149
+
150
+ pid_file "/var/run/chef/chef-client.pid"
151
+
152
+ Mixlib::Log::Formatter.show_time = true
153
+ config
154
+
155
+ StringIO.expects(:new).with(expected_config).once
156
+ @action.setup_config
157
+ end
158
+
159
+ should "upload this file as client.rb to the provisioning folder" do
160
+ StringIO.expects(:new).returns("foo")
161
+ File.expects(:join).with(Vagrant.config.chef.provisioning_path, "client.rb").once.returns("bar")
162
+ Vagrant::SSH.expects(:upload!).with("foo", "bar").once
163
+ @action.setup_config
164
+ end
165
+ end
166
+
167
+ context "running chef client" do
168
+ should "cd into the provisioning directory and run chef client" do
169
+ ssh = mock("ssh")
170
+ ssh.expects(:exec!).with("cd #{Vagrant.config.chef.provisioning_path} && sudo chef-client -c client.rb -j dna.json").once
171
+ Vagrant::SSH.expects(:execute).yields(ssh)
172
+ @action.run_chef_client
173
+ end
174
+ end
175
+ end