test-kitchen 1.0.0.beta.4 → 1.0.0.rc.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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -1
  3. data/Gemfile +1 -1
  4. data/README.md +18 -7
  5. data/Rakefile +8 -1
  6. data/features/kitchen_init_command.feature +90 -11
  7. data/features/step_definitions/git_steps.rb +3 -0
  8. data/lib/kitchen/busser.rb +79 -45
  9. data/lib/kitchen/cli.rb +14 -13
  10. data/lib/kitchen/config.rb +79 -138
  11. data/lib/kitchen/data_munger.rb +224 -0
  12. data/lib/kitchen/driver/base.rb +4 -31
  13. data/lib/kitchen/driver/ssh_base.rb +6 -16
  14. data/lib/kitchen/driver.rb +4 -0
  15. data/lib/kitchen/generator/init.rb +20 -9
  16. data/lib/kitchen/instance.rb +53 -58
  17. data/lib/kitchen/lazy_hash.rb +50 -0
  18. data/lib/kitchen/platform.rb +2 -31
  19. data/lib/kitchen/provisioner/base.rb +55 -9
  20. data/lib/kitchen/provisioner/chef/berkshelf.rb +76 -0
  21. data/lib/kitchen/provisioner/chef/librarian.rb +72 -0
  22. data/lib/kitchen/provisioner/chef_base.rb +159 -78
  23. data/lib/kitchen/provisioner/chef_solo.rb +6 -36
  24. data/lib/kitchen/provisioner/chef_zero.rb +70 -59
  25. data/lib/kitchen/provisioner/dummy.rb +28 -0
  26. data/lib/kitchen/provisioner.rb +6 -4
  27. data/lib/kitchen/shell_out.rb +2 -5
  28. data/lib/kitchen/ssh.rb +1 -1
  29. data/lib/kitchen/suite.rb +10 -79
  30. data/lib/kitchen/util.rb +2 -2
  31. data/lib/kitchen/version.rb +2 -2
  32. data/lib/kitchen.rb +5 -0
  33. data/spec/kitchen/config_spec.rb +84 -123
  34. data/spec/kitchen/data_munger_spec.rb +1412 -0
  35. data/spec/kitchen/driver/base_spec.rb +30 -0
  36. data/spec/kitchen/instance_spec.rb +868 -86
  37. data/spec/kitchen/lazy_hash_spec.rb +63 -0
  38. data/spec/kitchen/platform_spec.rb +0 -22
  39. data/spec/kitchen/provisioner/base_spec.rb +210 -0
  40. data/spec/kitchen/provisioner_spec.rb +70 -0
  41. data/spec/kitchen/suite_spec.rb +25 -38
  42. data/spec/spec_helper.rb +1 -0
  43. data/support/chef-client-zero.rb +51 -35
  44. data/support/dummy-validation.pem +27 -0
  45. data/templates/init/kitchen.yml.erb +10 -22
  46. data/test-kitchen.gemspec +1 -2
  47. metadata +20 -18
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
4
  #
5
- # Copyright (C) 2012, Fletcher Nichol
5
+ # Copyright (C) 2012, 2013, Fletcher Nichol
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
8
8
  # you may not use this file except in compliance with the License.
@@ -18,5 +18,5 @@
18
18
 
19
19
  module Kitchen
20
20
 
21
- VERSION = "1.0.0.beta.4"
21
+ VERSION = "1.0.0.rc.1"
22
22
  end
data/lib/kitchen.rb CHANGED
@@ -31,6 +31,7 @@ require 'kitchen/busser'
31
31
  require 'kitchen/color'
32
32
  require 'kitchen/collection'
33
33
  require 'kitchen/config'
34
+ require 'kitchen/data_munger'
34
35
  require 'kitchen/driver'
35
36
  require 'kitchen/driver/base'
36
37
  require 'kitchen/driver/proxy'
@@ -85,6 +86,10 @@ module Kitchen
85
86
 
86
87
  # Default log level verbosity
87
88
  DEFAULT_LOG_LEVEL = :info
89
+
90
+ DEFAULT_TEST_DIR = "test/integration".freeze
91
+
92
+ DEFAULT_LOG_DIR = ".kitchen/logs".freeze
88
93
  end
89
94
 
90
95
  # Initialize the base logger
@@ -25,6 +25,7 @@ require 'kitchen/config'
25
25
  require 'kitchen/driver'
26
26
  require 'kitchen/instance'
27
27
  require 'kitchen/platform'
28
+ require 'kitchen/provisioner'
28
29
  require 'kitchen/suite'
29
30
  require 'kitchen/util'
30
31
 
@@ -45,189 +46,149 @@ end
45
46
  describe Kitchen::Config do
46
47
 
47
48
  let(:loader) { Kitchen::DummyLoader.new }
48
- let(:config) { Kitchen::Config.new(:loader => loader) }
49
+ let(:config) { Kitchen::Config.new(opts) }
49
50
 
50
- before do
51
- FakeFS.activate!
52
- FileUtils.mkdir_p("/tmp")
51
+ let(:opts) do
52
+ { :loader => loader, :kitchen_root => "/tmp/that/place",
53
+ :log_root => "/tmp/logs", :test_base_path => "/testing/yo",
54
+ :log_level => :debug }
53
55
  end
54
56
 
55
- after do
56
- FakeFS.deactivate!
57
- FakeFS::FileSystem.clear
58
- end
59
-
60
- describe "#platforms" do
57
+ describe "#loader" do
61
58
 
62
- it "returns platforms loaded from a kitchen.yml" do
63
- stub_data!({ :platforms => [{ :name => 'one' }, { :name => 'two' }] })
64
-
65
- config.platforms.size.must_equal 2
66
- config.platforms[0].name.must_equal 'one'
67
- config.platforms[1].name.must_equal 'two'
59
+ it "returns its loader" do
60
+ config.loader.must_equal loader
68
61
  end
69
62
 
70
- it "returns an empty Array if no platforms are given" do
71
- stub_data!({})
63
+ it "creates a Kitchen::Loader::YAML loader by default" do
64
+ opts.delete(:loader)
72
65
 
73
- config.platforms.must_equal []
66
+ config.loader.must_be_kind_of Kitchen::Loader::YAML
74
67
  end
75
68
  end
76
69
 
77
- describe "#suites" do
78
-
79
- it "returns suites loaded from a kitchen.yml" do
80
- stub_data!({ :suites => [
81
- { :name => 'one', :run_list => [] },
82
- { :name => 'two', :run_list => [] },
83
- ] })
70
+ describe "#kitchen_root" do
84
71
 
85
- config.suites.size.must_equal 2
86
- config.suites[0].name.must_equal 'one'
87
- config.suites[1].name.must_equal 'two'
72
+ it "returns its kitchen root" do
73
+ config.kitchen_root.must_equal "/tmp/that/place"
88
74
  end
89
75
 
90
- it "returns an empty Array if no suites are given" do
91
- stub_data!({})
76
+ it "uses Dir.pwd by default" do
77
+ opts.delete(:kitchen_root)
92
78
 
93
- config.suites.must_equal []
79
+ config.kitchen_root.must_equal Dir.pwd
94
80
  end
81
+ end
95
82
 
96
- def cheflike_suite(suite)
97
- suite.extend(Kitchen::Suite::Cheflike)
98
- end
83
+ describe "#log_root" do
99
84
 
100
- it "returns a suite with nil for data_bags_path by default" do
101
- stub_data!({ :suites => [{ :name => 'one', :run_list => [] }] })
102
- cheflike_suite(config.suites.first).data_bags_path.must_be_nil
85
+ it "returns its log root" do
86
+ config.log_root.must_equal "/tmp/logs"
103
87
  end
104
88
 
105
- it "returns a suite with a common data_bags_path set" do
106
- stub_data!({ :suites => [{ :name => 'one', :run_list => [] }] })
107
- config.test_base_path = "/tmp/base"
108
- FileUtils.mkdir_p "/tmp/base/data_bags"
89
+ it "calculates a default log root using kitchen_root" do
90
+ opts.delete(:log_root)
109
91
 
110
- cheflike_suite(config.suites.first).data_bags_path.
111
- must_equal "/tmp/base/data_bags"
92
+ config.log_root.must_equal "/tmp/that/place/.kitchen/logs"
112
93
  end
94
+ end
113
95
 
114
- it "returns a suite with a suite-specific data_bags_path set" do
115
- stub_data!({ :suites => [{ :name => 'cool', :run_list => [] }] })
116
- config.test_base_path = "/tmp/base"
117
- FileUtils.mkdir_p "/tmp/base/cool/data_bags"
96
+ describe "#test_base_path" do
118
97
 
119
- cheflike_suite(config.suites.first).data_bags_path.
120
- must_equal "/tmp/base/cool/data_bags"
98
+ it "returns its base test path" do
99
+ config.test_base_path.must_equal "/testing/yo"
121
100
  end
122
101
 
123
- it "returns a suite with a custom data_bags_path set" do
124
- stub_data!({ :suites => [{ :name => 'one', :run_list => [],
125
- :data_bags_path => 'shared/data_bags' }] })
126
- config.kitchen_root = "/tmp/base"
127
- FileUtils.mkdir_p "/tmp/base/shared/data_bags"
102
+ it "calculates a default base using kitchen_root" do
103
+ opts.delete(:test_base_path)
128
104
 
129
- cheflike_suite(config.suites.first).data_bags_path.
130
- must_equal "/tmp/base/shared/data_bags"
105
+ config.test_base_path.must_equal "/tmp/that/place/test/integration"
131
106
  end
107
+ end
132
108
 
133
- it "returns a suite with nil for roles_path by default" do
134
- stub_data!({ :suites => [{ :name => 'one', :run_list => [] }] })
109
+ describe "#log_level" do
135
110
 
136
- cheflike_suite(config.suites.first).roles_path.must_be_nil
111
+ it "returns its log level" do
112
+ config.log_level.must_equal :debug
137
113
  end
138
114
 
139
- it "returns a suite with a common roles_path set" do
140
- stub_data!({ :suites => [{ :name => 'one', :run_list => [] }] })
141
- config.test_base_path = "/tmp/base"
142
- FileUtils.mkdir_p "/tmp/base/roles"
115
+ it "uses :info by default" do
116
+ opts.delete(:log_level)
143
117
 
144
- cheflike_suite(config.suites.first).roles_path.
145
- must_equal "/tmp/base/roles"
118
+ config.log_level.must_equal :info
146
119
  end
120
+ end
147
121
 
148
- it "returns a suite with a suite-specific roles_path set" do
149
- stub_data!({ :suites => [{ :name => 'mysuite', :run_list => [] }] })
150
- config.test_base_path = "/tmp/base"
151
- FileUtils.mkdir_p "/tmp/base/mysuite/roles"
122
+ describe "#platforms" do
152
123
 
153
- cheflike_suite(config.suites.first).roles_path.
154
- must_equal "/tmp/base/mysuite/roles"
124
+ it "returns an array of platforms" do
125
+ stub_data!({
126
+ :platforms => [
127
+ { :name => 'one' },
128
+ { :name => 'two' }
129
+ ]
130
+ })
131
+
132
+ config.platforms.size.must_equal 2
133
+ config.platforms[0].name.must_equal 'one'
134
+ config.platforms[1].name.must_equal 'two'
155
135
  end
156
136
 
157
- it "returns a suite with a custom roles_path set" do
158
- stub_data!({ :suites => [{ :name => 'one', :run_list => [],
159
- :roles_path => 'shared/roles' }] })
160
- config.kitchen_root = "/tmp/base"
161
- FileUtils.mkdir_p "/tmp/base/shared/roles"
137
+ it "returns an empty Array if no platforms are given" do
138
+ stub_data!({})
162
139
 
163
- cheflike_suite(config.suites.first).roles_path.
164
- must_equal "/tmp/base/shared/roles"
140
+ config.platforms.must_equal []
165
141
  end
166
142
  end
167
143
 
168
- describe "#instances" do
144
+ describe "#suites" do
169
145
 
170
- it "returns instances loaded from a kitchen.yml" do
146
+ it "returns an array of suites" do
171
147
  stub_data!({
172
- :platforms => [
173
- { :name => 'p1' },
174
- { :name => 'p2' },
175
- ],
176
148
  :suites => [
177
- { :name => 's1', :run_list => [] },
178
- { :name => 's2', :run_list => [] },
179
- { :name => 's3', :run_list => [], :excludes => ['p1'] }
149
+ { :name => 'one' },
150
+ { :name => 'two' }
180
151
  ]
181
152
  })
182
- config.instances.size.must_equal 5
183
- instance_names = config.instances.map { |i| i.name }
184
- instance_names.must_equal %w{s1-p1 s1-p2 s2-p1 s2-p2 s3-p2}
153
+
154
+ config.suites.size.must_equal 2
155
+ config.suites[0].name.must_equal 'one'
156
+ config.suites[1].name.must_equal 'two'
185
157
  end
186
158
 
187
- it "returns an instance containing a driver instance" do
188
- stub_data!({
189
- :platforms => [{ :name => 'platform', :driver_plugin => 'dummy' }],
190
- :suites => [{ :name => 'suite', :run_list => [] }]
191
- })
192
- config.instances.first.driver.must_be_instance_of Kitchen::Driver::Dummy
159
+ it "returns an empty Array if no suites are given" do
160
+ stub_data!({})
161
+
162
+ config.suites.must_equal []
193
163
  end
164
+ end
194
165
 
195
- it "returns an instance with a driver initialized with kitchen_root" do
196
- config.kitchen_root = "/tmp"
197
- stub_data!({
198
- :platforms => [{ :name => 'platform', :driver_plugin => 'dummy' }],
199
- :suites => [{ :name => 'suite', :run_list => [] }]
200
- })
201
- config.instances.first.driver[:kitchen_root].must_equal "/tmp"
166
+ describe "#instances" do
167
+
168
+ it "returns an empty Array if no suites and platforms are given" do
169
+ stub_data!({})
170
+
171
+ config.instances.must_equal []
202
172
  end
203
173
 
204
- it "returns an instance with a driver initialized with passed in config" do
174
+ it "returns an array of instances" do
175
+ skip "much more needed here"
176
+
205
177
  stub_data!({
206
178
  :platforms => [
207
- { :name => 'platform', :driver_plugin => 'dummy',
208
- :driver_config => { :foo => 'bar' }
209
- }
179
+ { :name => "p1" },
180
+ { :name => "p2" }
210
181
  ],
211
- :suites => [{ :name => 'suite', :run_list => [] }]
182
+ :suites => [
183
+ { :name => 's1' },
184
+ { :name => 's2' }
185
+ ]
212
186
  })
213
- config.instances.first.driver[:foo].must_equal "bar"
214
- end
215
- end
216
-
217
- describe "#log_level" do
218
187
 
219
- it "returns a default log_level of info" do
220
- config.log_level.must_equal :info
221
- end
222
-
223
- it "returns an overridden log_level" do
224
- config.log_level = :error
225
- config.log_level.must_equal :error
188
+ config.instances
226
189
  end
227
190
  end
228
191
 
229
- private
230
-
231
192
  def stub_data!(hash)
232
193
  loader.data = hash
233
194
  end
@@ -0,0 +1,1412 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative '../spec_helper'
20
+
21
+ require 'kitchen/data_munger'
22
+
23
+ module Kitchen
24
+
25
+ describe DataMunger do
26
+
27
+ describe "#platform_data" do
28
+
29
+ it "returns an array of platform data" do
30
+ DataMunger.new({
31
+ :platforms => [
32
+ {
33
+ :name => "one",
34
+ :stuff => "junk"
35
+ },
36
+ {
37
+ :name => "two",
38
+ :misc => "things"
39
+ }
40
+ ]
41
+ }).platform_data.must_equal([
42
+ {
43
+ :name => "one",
44
+ :stuff => "junk"
45
+ },
46
+ {
47
+ :name => "two",
48
+ :misc => "things"
49
+ }
50
+ ])
51
+ end
52
+
53
+ it "returns an empty array if platforms is not defined" do
54
+ DataMunger.new({}).platform_data.must_equal([])
55
+ end
56
+ end
57
+
58
+ describe "#suite_data" do
59
+
60
+ it "returns an array of suite data" do
61
+ DataMunger.new({
62
+ :suites => [
63
+ {
64
+ :name => "one",
65
+ :stuff => "junk"
66
+ },
67
+ {
68
+ :name => "two",
69
+ :misc => "things"
70
+ }
71
+ ]
72
+ }).suite_data.must_equal([
73
+ {
74
+ :name => "one",
75
+ :stuff => "junk"
76
+ },
77
+ {
78
+ :name => "two",
79
+ :misc => "things"
80
+ }
81
+ ])
82
+ end
83
+
84
+ it "returns an empty array if suites is not defined" do
85
+ DataMunger.new({}).suite_data.must_equal([])
86
+ end
87
+ end
88
+
89
+ DATA_KEYS = {
90
+ :driver => :name,
91
+ :provisioner => :name,
92
+ :busser => :version
93
+ }
94
+
95
+ DATA_KEYS.each_pair do |key, default_key|
96
+
97
+ describe "##{key}" do
98
+
99
+ describe "from single source" do
100
+
101
+ it "returns empty hash if no common #{key} hash is provided" do
102
+ DataMunger.new({
103
+ }).public_send("#{key}_data_for", "suite", "platform").must_equal({
104
+ })
105
+ end
106
+
107
+ it "drops common #{key} if hash is nil" do
108
+ DataMunger.new({
109
+ key => nil
110
+ }).public_send("#{key}_data_for", "suite", "plat").must_equal({})
111
+ end
112
+
113
+ it "returns kitchen config #{key} name" do
114
+ DataMunger.new({
115
+ }, {
116
+ :defaults => {
117
+ key => "thenoseknows"
118
+ }
119
+ }).public_send("#{key}_data_for", "suite", "platform").must_equal({
120
+ default_key => "thenoseknows"
121
+ })
122
+ end
123
+
124
+ it "returns common #{key} name" do
125
+ DataMunger.new({
126
+ key => "starship"
127
+ }).public_send("#{key}_data_for", "suite", "platform").must_equal({
128
+ default_key => "starship"
129
+ })
130
+ end
131
+
132
+ it "returns common #{key} config" do
133
+ DataMunger.new({
134
+ key => {
135
+ default_key => "starship",
136
+ :speed => 42
137
+ }
138
+ }).public_send("#{key}_data_for", "suite", "platform").must_equal({
139
+ default_key => "starship",
140
+ :speed => 42
141
+ })
142
+ end
143
+
144
+ it "returns empty hash if platform config doesn't have #{key} hash" do
145
+ DataMunger.new({
146
+ :platforms => [
147
+ { :name => "plat" }
148
+ ]
149
+ }).public_send("#{key}_data_for", "suite", "plat").must_equal({})
150
+ end
151
+
152
+ it "drops platform #{key} if hash is nil" do
153
+ DataMunger.new({
154
+ :platforms => [
155
+ {
156
+ :name => "plat",
157
+ key => nil
158
+ }
159
+ ]
160
+ }).public_send("#{key}_data_for", "suite", "plat").must_equal({})
161
+ end
162
+
163
+ it "returns platform #{key} name" do
164
+ DataMunger.new({
165
+ :platforms => [
166
+ {
167
+ :name => "plat",
168
+ key => "flip"
169
+ }
170
+ ]
171
+ }).public_send("#{key}_data_for", "suite", "plat").must_equal({
172
+ default_key => "flip"
173
+ })
174
+ end
175
+
176
+ it "returns platform config containing #{key} hash" do
177
+ DataMunger.new({
178
+ :platforms => [
179
+ {
180
+ :name => "plat",
181
+ key => {
182
+ default_key => "flip",
183
+ :flop => "yep"
184
+ }
185
+ }
186
+ ]
187
+ }).public_send("#{key}_data_for", "suite", "plat").must_equal({
188
+ default_key => "flip",
189
+ :flop => "yep"
190
+ })
191
+ end
192
+
193
+ it "returns empty hash if suite config doesn't have #{key} hash" do
194
+ DataMunger.new({
195
+ :suites => [
196
+ { :name => "sweet" }
197
+ ]
198
+ }).public_send("#{key}_data_for", "sweet", "platform").must_equal({
199
+ })
200
+ end
201
+
202
+ it "drops suite #{key} hash is nil" do
203
+ DataMunger.new({
204
+ :suites => [
205
+ {
206
+ :name => "suite",
207
+ key => nil
208
+ }
209
+ ]
210
+ }).public_send("#{key}_data_for", "suite", "plat").must_equal({})
211
+ end
212
+
213
+ it "returns suite #{key} name" do
214
+ DataMunger.new({
215
+ :suites => [
216
+ {
217
+ :name => "sweet",
218
+ key => "waz"
219
+ }
220
+ ]
221
+ }).public_send("#{key}_data_for", "sweet", "platform").must_equal({
222
+ default_key => "waz"
223
+ })
224
+ end
225
+
226
+ it "returns suite config containing #{key} hash" do
227
+ DataMunger.new({
228
+ :suites => [
229
+ {
230
+ :name => "sweet",
231
+ key => {
232
+ default_key => "waz",
233
+ :up => "nope"
234
+ }
235
+ }
236
+ ]
237
+ }).public_send("#{key}_data_for", "sweet", "platform").must_equal({
238
+ default_key => "waz",
239
+ :up => "nope"
240
+ })
241
+ end
242
+ end
243
+
244
+ describe "from multiple sources merging" do
245
+
246
+ it "suite into platform into common" do
247
+ DataMunger.new({
248
+ key => {
249
+ default_key => "commony",
250
+ :color => "purple",
251
+ :fruit => ["apple", "pear"],
252
+ :deep => { :common => "junk" }
253
+ },
254
+ :platforms => [
255
+ {
256
+ :name => "plat",
257
+ key => {
258
+ default_key => "platformy",
259
+ :fruit => ["banana"],
260
+ :deep => { :platform => "stuff" }
261
+ }
262
+ }
263
+ ],
264
+ :suites => [
265
+ {
266
+ :name => "sweet",
267
+ key => {
268
+ default_key => "suitey",
269
+ :vehicle => "car",
270
+ :deep => { :suite => "things" }
271
+ }
272
+ }
273
+ ]
274
+ }).public_send("#{key}_data_for", "sweet", "plat").must_equal({
275
+ default_key => "suitey",
276
+ :color => "purple",
277
+ :fruit => ["banana"],
278
+ :vehicle => "car",
279
+ :deep => {
280
+ :common => "junk",
281
+ :platform => "stuff",
282
+ :suite => "things"
283
+ }
284
+ })
285
+ end
286
+
287
+ it "platform into common" do
288
+ DataMunger.new({
289
+ key => {
290
+ default_key => "commony",
291
+ :color => "purple",
292
+ :fruit => ["apple", "pear"],
293
+ :deep => { :common => "junk" }
294
+ },
295
+ :platforms => [
296
+ {
297
+ :name => "plat",
298
+ key => {
299
+ default_key => "platformy",
300
+ :fruit => ["banana"],
301
+ :deep => { :platform => "stuff" }
302
+ }
303
+ }
304
+ ]
305
+ }).public_send("#{key}_data_for", "sweet", "plat").must_equal({
306
+ default_key => "platformy",
307
+ :color => "purple",
308
+ :fruit => ["banana"],
309
+ :deep => {
310
+ :common => "junk",
311
+ :platform => "stuff"
312
+ }
313
+ })
314
+ end
315
+
316
+ it "suite into common" do
317
+ DataMunger.new({
318
+ key => {
319
+ default_key => "commony",
320
+ :color => "purple",
321
+ :fruit => ["apple", "pear"],
322
+ :deep => { :common => "junk" }
323
+ },
324
+ :suites => [
325
+ {
326
+ :name => "sweet",
327
+ key => {
328
+ default_key => "suitey",
329
+ :vehicle => "car",
330
+ :deep => { :suite => "things" }
331
+ }
332
+ }
333
+ ]
334
+ }).public_send("#{key}_data_for", "sweet", "plat").must_equal({
335
+ default_key => "suitey",
336
+ :color => "purple",
337
+ :fruit => ["apple", "pear"],
338
+ :vehicle => "car",
339
+ :deep => {
340
+ :common => "junk",
341
+ :suite => "things"
342
+ }
343
+ })
344
+ end
345
+
346
+ it "suite into platform" do
347
+ DataMunger.new({
348
+ :platforms => [
349
+ {
350
+ :name => "plat",
351
+ key => {
352
+ default_key => "platformy",
353
+ :fruit => ["banana"],
354
+ :deep => { :platform => "stuff" }
355
+ }
356
+ }
357
+ ],
358
+ :suites => [
359
+ {
360
+ :name => "sweet",
361
+ key => {
362
+ default_key => "suitey",
363
+ :vehicle => "car",
364
+ :deep => { :suite => "things" }
365
+ }
366
+ }
367
+ ]
368
+ }).public_send("#{key}_data_for", "sweet", "plat").must_equal({
369
+ default_key => "suitey",
370
+ :fruit => ["banana"],
371
+ :vehicle => "car",
372
+ :deep => {
373
+ :platform => "stuff",
374
+ :suite => "things"
375
+ }
376
+ })
377
+ end
378
+ end
379
+ end
380
+ end
381
+
382
+ describe "primary Chef data" do
383
+
384
+ describe "in a suite" do
385
+
386
+ it "moves attributes into provisioner" do
387
+ DataMunger.new({
388
+ :provisioner => "chefy",
389
+ :suites => [
390
+ {
391
+ :name => "sweet",
392
+ :attributes => { :one => "two" }
393
+ }
394
+ ]
395
+ }).provisioner_data_for("sweet", "plat").must_equal({
396
+ :name => "chefy",
397
+ :attributes => { :one => "two" }
398
+ })
399
+ end
400
+
401
+ it "moves run_list into provisioner" do
402
+ DataMunger.new({
403
+ :provisioner => "chefy",
404
+ :suites => [
405
+ {
406
+ :name => "sweet",
407
+ :run_list => ["one", "two"]
408
+ }
409
+ ]
410
+ }).provisioner_data_for("sweet", "plat").must_equal({
411
+ :name => "chefy",
412
+ :run_list => ["one", "two"]
413
+ })
414
+ end
415
+
416
+ it "maintains run_list in provisioner" do
417
+ DataMunger.new({
418
+ :provisioner => "chefy",
419
+ :suites => [
420
+ {
421
+ :name => "sweet",
422
+ :provisioner => {
423
+ :run_list => ["one", "two"]
424
+ }
425
+ }
426
+ ]
427
+ }).provisioner_data_for("sweet", "plat").must_equal({
428
+ :name => "chefy",
429
+ :run_list => ["one", "two"]
430
+ })
431
+ end
432
+
433
+ it "merge provisioner into attributes if provisioner exists" do
434
+ DataMunger.new({
435
+ :suites => [
436
+ {
437
+ :name => "sweet",
438
+ :attributes => { :one => "two" },
439
+ :provisioner => "chefy"
440
+ }
441
+ ]
442
+ }).provisioner_data_for("sweet", "plat").must_equal({
443
+ :name => "chefy",
444
+ :attributes => { :one => "two" }
445
+ })
446
+ end
447
+
448
+ it "merge provisioner into run_list if provisioner exists" do
449
+ DataMunger.new({
450
+ :suites => [
451
+ {
452
+ :name => "sweet",
453
+ :run_list => ["one", "two"],
454
+ :provisioner => "chefy"
455
+ }
456
+ ]
457
+ }).provisioner_data_for("sweet", "plat").must_equal({
458
+ :name => "chefy",
459
+ :run_list => ["one", "two"]
460
+ })
461
+ end
462
+
463
+ it "drops nil run_list" do
464
+ DataMunger.new({
465
+ :suites => [
466
+ {
467
+ :name => "sweet",
468
+ :run_list => nil,
469
+ :provisioner => "chefy"
470
+ }
471
+ ]
472
+ }).provisioner_data_for("sweet", "plat").must_equal({
473
+ :name => "chefy"
474
+ })
475
+ end
476
+
477
+ it "drops nil attributes" do
478
+ DataMunger.new({
479
+ :suites => [
480
+ {
481
+ :name => "sweet",
482
+ :attributes => nil,
483
+ :provisioner => "chefy"
484
+ }
485
+ ]
486
+ }).provisioner_data_for("sweet", "plat").must_equal({
487
+ :name => "chefy"
488
+ })
489
+ end
490
+ end
491
+
492
+ describe "in a platform" do
493
+
494
+ it "moves attributes into provisioner" do
495
+ DataMunger.new({
496
+ :provisioner => "chefy",
497
+ :platforms => [
498
+ {
499
+ :name => "plat",
500
+ :attributes => { :one => "two" }
501
+ }
502
+ ]
503
+ }).provisioner_data_for("sweet", "plat").must_equal({
504
+ :name => "chefy",
505
+ :attributes => { :one => "two" }
506
+ })
507
+ end
508
+
509
+ it "moves run_list into provisioner" do
510
+ DataMunger.new({
511
+ :provisioner => "chefy",
512
+ :platforms => [
513
+ {
514
+ :name => "plat",
515
+ :run_list => ["one", "two"]
516
+ }
517
+ ]
518
+ }).provisioner_data_for("sweet", "plat").must_equal({
519
+ :name => "chefy",
520
+ :run_list => ["one", "two"]
521
+ })
522
+ end
523
+
524
+ it "maintains run_list in provisioner" do
525
+ DataMunger.new({
526
+ :provisioner => "chefy",
527
+ :platforms => [
528
+ {
529
+ :name => "plat",
530
+ :provisioner => {
531
+ :run_list => ["one", "two"]
532
+ }
533
+ }
534
+ ]
535
+ }).provisioner_data_for("sweet", "plat").must_equal({
536
+ :name => "chefy",
537
+ :run_list => ["one", "two"]
538
+ })
539
+ end
540
+
541
+ it "merge provisioner into attributes if provisioner exists" do
542
+ DataMunger.new({
543
+ :platforms => [
544
+ {
545
+ :name => "plat",
546
+ :attributes => { :one => "two" },
547
+ :provisioner => "chefy"
548
+ }
549
+ ]
550
+ }).provisioner_data_for("sweet", "plat").must_equal({
551
+ :name => "chefy",
552
+ :attributes => { :one => "two" }
553
+ })
554
+ end
555
+
556
+ it "merge provisioner into run_list if provisioner exists" do
557
+ DataMunger.new({
558
+ :platforms => [
559
+ {
560
+ :name => "plat",
561
+ :run_list => ["one", "two"],
562
+ :provisioner => "chefy"
563
+ }
564
+ ]
565
+ }).provisioner_data_for("sweet", "plat").must_equal({
566
+ :name => "chefy",
567
+ :run_list => ["one", "two"]
568
+ })
569
+ end
570
+
571
+ it "drops nil run_list" do
572
+ DataMunger.new({
573
+ :platforms => [
574
+ {
575
+ :name => "plat",
576
+ :run_list => nil,
577
+ :provisioner => "chefy"
578
+ }
579
+ ]
580
+ }).provisioner_data_for("sweet", "plat").must_equal({
581
+ :name => "chefy"
582
+ })
583
+ end
584
+
585
+ it "drops nil attributes" do
586
+ DataMunger.new({
587
+ :platforms => [
588
+ {
589
+ :name => "plat",
590
+ :attributes => nil,
591
+ :provisioner => "chefy"
592
+ }
593
+ ]
594
+ }).provisioner_data_for("sweet", "plat").must_equal({
595
+ :name => "chefy"
596
+ })
597
+ end
598
+ end
599
+
600
+ describe "in a suite and platform" do
601
+
602
+ it "merges suite attributes into platform attributes" do
603
+ DataMunger.new({
604
+ :provisioner => "chefy",
605
+ :platforms => [
606
+ {
607
+ :name => "plat",
608
+ :attributes => {
609
+ :color => "blue",
610
+ :deep => { :platform => "much" }
611
+ }
612
+ }
613
+ ],
614
+ :suites => [
615
+ {
616
+ :name => "sweet",
617
+ :attributes => {
618
+ :color => "pink",
619
+ :deep => { :suite => "wow" }
620
+ }
621
+ }
622
+ ]
623
+ }).provisioner_data_for("sweet", "plat").must_equal({
624
+ :name => "chefy",
625
+ :attributes => {
626
+ :color => "pink",
627
+ :deep => {
628
+ :suite => "wow",
629
+ :platform => "much"
630
+ }
631
+ }
632
+ })
633
+ end
634
+
635
+ it "concats suite run_list to platform run_list" do
636
+ DataMunger.new({
637
+ :provisioner => "chefy",
638
+ :platforms => [
639
+ {
640
+ :name => "plat",
641
+ :run_list => ["one", "two"]
642
+ }
643
+ ],
644
+ :suites => [
645
+ {
646
+ :name => "sweet",
647
+ :run_list => ["three", "four"]
648
+ }
649
+ ]
650
+ }).provisioner_data_for("sweet", "plat").must_equal({
651
+ :name => "chefy",
652
+ :run_list => ["one", "two", "three", "four"]
653
+ })
654
+ end
655
+
656
+ it "concats suite run_list in provisioner to platform run_list" do
657
+ DataMunger.new({
658
+ :provisioner => "chefy",
659
+ :platforms => [
660
+ {
661
+ :name => "plat",
662
+ :run_list => ["one", "two"]
663
+ }
664
+ ],
665
+ :suites => [
666
+ {
667
+ :name => "sweet",
668
+ :provisioner => {
669
+ :run_list => ["three", "four"]
670
+ }
671
+ }
672
+ ]
673
+ }).provisioner_data_for("sweet", "plat").must_equal({
674
+ :name => "chefy",
675
+ :run_list => ["one", "two", "three", "four"]
676
+ })
677
+ end
678
+
679
+ it "concats suite run_list to platform run_list in provisioner" do
680
+ DataMunger.new({
681
+ :provisioner => "chefy",
682
+ :platforms => [
683
+ {
684
+ :name => "plat",
685
+ :provisioner => {
686
+ :run_list => ["one", "two"]
687
+ }
688
+ }
689
+ ],
690
+ :suites => [
691
+ {
692
+ :name => "sweet",
693
+ :run_list => ["three", "four"]
694
+ }
695
+ ]
696
+ }).provisioner_data_for("sweet", "plat").must_equal({
697
+ :name => "chefy",
698
+ :run_list => ["one", "two", "three", "four"]
699
+ })
700
+ end
701
+
702
+ it "concats to nil run_lists into an empty Array" do
703
+ DataMunger.new({
704
+ :provisioner => "chefy",
705
+ :platforms => [
706
+ {
707
+ :name => "plat",
708
+ :provisioner => {
709
+ :run_list => nil
710
+ }
711
+ }
712
+ ],
713
+ :suites => [
714
+ {
715
+ :name => "sweet",
716
+ :run_list => nil
717
+ }
718
+ ]
719
+ }).provisioner_data_for("sweet", "plat").must_equal({
720
+ :name => "chefy",
721
+ :run_list => []
722
+ })
723
+ end
724
+
725
+ it "does not corrupt run_list data for multiple suite/platform pairs" do
726
+ munger = DataMunger.new({
727
+ :provisioner => "chefy",
728
+ :platforms => [
729
+ {
730
+ :name => "p1"
731
+ },
732
+ {
733
+ :name => "p2",
734
+ :run_list => ["one", "two"]
735
+ }
736
+ ],
737
+ :suites => [
738
+ {
739
+ :name => "s1",
740
+ :run_list => ["alpha", "beta"]
741
+ },
742
+ {
743
+ :name => "s2",
744
+ :provisioner => {
745
+ :run_list => ["three", "four"]
746
+ }
747
+ }
748
+ ]
749
+ })
750
+
751
+ # call munger for other data to cause any necessary internal
752
+ # data mutation
753
+ munger.provisioner_data_for("s1", "p1")
754
+ munger.provisioner_data_for("s1", "p2")
755
+ munger.provisioner_data_for("s2", "p1")
756
+
757
+ munger.provisioner_data_for("s2", "p2").must_equal({
758
+ :name => "chefy",
759
+ :run_list => ["one", "two", "three", "four"]
760
+ })
761
+ end
762
+ end
763
+ end
764
+
765
+ describe "kitchen config" do
766
+
767
+ [:kitchen_root, :test_base_path, :log_level].each do |key|
768
+
769
+ describe "for #{key}" do
770
+
771
+ describe "for #driver_data_for" do
772
+
773
+ it "is returned when provided" do
774
+ DataMunger.new({
775
+ :driver => "chefy",
776
+ :platforms => [
777
+ { :name => "plat" }
778
+ ],
779
+ :suites => [
780
+ { :name => "sweet" }
781
+ ]
782
+ }, {
783
+ key => "datvalue"
784
+ }).driver_data_for("sweet", "plat").must_equal({
785
+ :name => "chefy",
786
+ key => "datvalue"
787
+ })
788
+ end
789
+
790
+ it "is returned when provided in user data" do
791
+ DataMunger.new({
792
+ :kitchen => {
793
+ key => "datvalue"
794
+ },
795
+ :driver => "chefy",
796
+ :platforms => [
797
+ { :name => "plat" }
798
+ ],
799
+ :suites => [
800
+ { :name => "sweet" }
801
+ ]
802
+ }).driver_data_for("sweet", "plat").must_equal({
803
+ :name => "chefy",
804
+ key => "datvalue"
805
+ })
806
+ end
807
+
808
+ it "user data value beats provided value" do
809
+ DataMunger.new({
810
+ :kitchen => {
811
+ key => "datvalue"
812
+ },
813
+ :driver => "chefy",
814
+ :platforms => [
815
+ { :name => "plat" }
816
+ ],
817
+ :suites => [
818
+ { :name => "sweet" }
819
+ ]
820
+ }, {
821
+ key => "ilose"
822
+ }).driver_data_for("sweet", "plat").must_equal({
823
+ :name => "chefy",
824
+ key => "datvalue"
825
+ })
826
+ end
827
+
828
+ it "rejects any value in driver data" do
829
+ DataMunger.new({
830
+ :driver => {
831
+ :name => "chefy",
832
+ key => "imevil"
833
+ },
834
+ :platforms => [
835
+ { :name => "plat" }
836
+ ],
837
+ :suites => [
838
+ { :name => "sweet" }
839
+ ]
840
+ }).driver_data_for("sweet", "plat").must_equal({
841
+ :name => "chefy"
842
+ })
843
+ end
844
+ end
845
+
846
+ describe "for #provisioner_data_for" do
847
+
848
+ it "is returned when provided" do
849
+ DataMunger.new({
850
+ :provisioner => "chefy",
851
+ :platforms => [
852
+ { :name => "plat" }
853
+ ],
854
+ :suites => [
855
+ { :name => "sweet" }
856
+ ]
857
+ }, {
858
+ key => "datvalue"
859
+ }).provisioner_data_for("sweet", "plat").must_equal({
860
+ :name => "chefy",
861
+ key => "datvalue"
862
+ })
863
+ end
864
+
865
+ it "is returned when provided in user data" do
866
+ DataMunger.new({
867
+ :kitchen => {
868
+ key => "datvalue"
869
+ },
870
+ :provisioner => "chefy",
871
+ :platforms => [
872
+ { :name => "plat" }
873
+ ],
874
+ :suites => [
875
+ { :name => "sweet" }
876
+ ]
877
+ }).provisioner_data_for("sweet", "plat").must_equal({
878
+ :name => "chefy",
879
+ key => "datvalue"
880
+ })
881
+ end
882
+
883
+ it "user data value beats provided value" do
884
+ DataMunger.new({
885
+ :kitchen => {
886
+ key => "datvalue"
887
+ },
888
+ :provisioner => "chefy",
889
+ :platforms => [
890
+ { :name => "plat" }
891
+ ],
892
+ :suites => [
893
+ { :name => "sweet" }
894
+ ]
895
+ }, {
896
+ key => "ilose"
897
+ }).provisioner_data_for("sweet", "plat").must_equal({
898
+ :name => "chefy",
899
+ key => "datvalue"
900
+ })
901
+ end
902
+
903
+ it "rejects any value in provisioner data" do
904
+ DataMunger.new({
905
+ :provisioner => {
906
+ :name => "chefy",
907
+ key => "imevil"
908
+ },
909
+ :platforms => [
910
+ { :name => "plat" }
911
+ ],
912
+ :suites => [
913
+ { :name => "sweet" }
914
+ ]
915
+ }).provisioner_data_for("sweet", "plat").must_equal({
916
+ :name => "chefy"
917
+ })
918
+ end
919
+ end
920
+
921
+ describe "for #busser_data_for" do
922
+
923
+ it "is returned when provided" do
924
+ DataMunger.new({
925
+ :busser => "chefy",
926
+ :platforms => [
927
+ { :name => "plat" }
928
+ ],
929
+ :suites => [
930
+ { :name => "sweet" }
931
+ ]
932
+ }, {
933
+ key => "datvalue"
934
+ }).busser_data_for("sweet", "plat").must_equal({
935
+ :version => "chefy",
936
+ key => "datvalue"
937
+ })
938
+ end
939
+
940
+ it "is returned when provided in user data" do
941
+ DataMunger.new({
942
+ :kitchen => {
943
+ key => "datvalue"
944
+ },
945
+ :busser => "chefy",
946
+ :platforms => [
947
+ { :name => "plat" }
948
+ ],
949
+ :suites => [
950
+ { :name => "sweet" }
951
+ ]
952
+ }).busser_data_for("sweet", "plat").must_equal({
953
+ :version => "chefy",
954
+ key => "datvalue"
955
+ })
956
+ end
957
+
958
+ it "user data value beats provided value" do
959
+ DataMunger.new({
960
+ :kitchen => {
961
+ key => "datvalue"
962
+ },
963
+ :busser => "chefy",
964
+ :platforms => [
965
+ { :name => "plat" }
966
+ ],
967
+ :suites => [
968
+ { :name => "sweet" }
969
+ ]
970
+ }, {
971
+ key => "ilose"
972
+ }).busser_data_for("sweet", "plat").must_equal({
973
+ :version => "chefy",
974
+ key => "datvalue"
975
+ })
976
+ end
977
+
978
+ it "rejects any value in busser data" do
979
+ DataMunger.new({
980
+ :busser => {
981
+ :version => "chefy",
982
+ key => "imevil"
983
+ },
984
+ :platforms => [
985
+ { :name => "plat" }
986
+ ],
987
+ :suites => [
988
+ { :name => "sweet" }
989
+ ]
990
+ }).busser_data_for("sweet", "plat").must_equal({
991
+ :version => "chefy"
992
+ })
993
+ end
994
+ end
995
+ end
996
+ end
997
+ end
998
+
999
+ describe "legacy driver_config and driver_plugin" do
1000
+
1001
+ describe "from a single source" do
1002
+
1003
+ it "returns common driver name" do
1004
+ DataMunger.new({
1005
+ :driver_plugin => "starship"
1006
+ }).driver_data_for("suite", "platform").must_equal({
1007
+ :name => "starship"
1008
+ })
1009
+ end
1010
+
1011
+ it "merges driver into driver_plugin if driver exists" do
1012
+ DataMunger.new({
1013
+ :driver_plugin => "starship",
1014
+ :driver => "zappa"
1015
+ }).driver_data_for("suite", "platform").must_equal({
1016
+ :name => "zappa"
1017
+ })
1018
+ end
1019
+
1020
+ it "returns common driver config" do
1021
+ DataMunger.new({
1022
+ :driver_plugin => "starship",
1023
+ :driver_config => {
1024
+ :speed => 42
1025
+ }
1026
+ }).driver_data_for("suite", "platform").must_equal({
1027
+ :name => "starship",
1028
+ :speed => 42
1029
+ })
1030
+ end
1031
+
1032
+ it "merges driver into driver_config if driver with name exists" do
1033
+ DataMunger.new({
1034
+ :driver_config => {
1035
+ :eh => "yep"
1036
+ },
1037
+ :driver => "zappa"
1038
+ }).driver_data_for("suite", "platform").must_equal({
1039
+ :name => "zappa",
1040
+ :eh => "yep"
1041
+ })
1042
+ end
1043
+
1044
+ it "merges driver into driver_config if driver exists" do
1045
+ DataMunger.new({
1046
+ :driver_plugin => "imold",
1047
+ :driver_config => {
1048
+ :eh => "yep",
1049
+ :color => "pink"
1050
+ },
1051
+ :driver => {
1052
+ :name => "zappa",
1053
+ :color => "black"
1054
+ }
1055
+ }).driver_data_for("suite", "platform").must_equal({
1056
+ :name => "zappa",
1057
+ :eh => "yep",
1058
+ :color => "black"
1059
+ })
1060
+ end
1061
+
1062
+ it "returns platform driver name" do
1063
+ DataMunger.new({
1064
+ :platforms => [
1065
+ {
1066
+ :name => "plat",
1067
+ :driver_plugin => "flip"
1068
+ }
1069
+ ]
1070
+ }).driver_data_for("suite", "plat").must_equal({
1071
+ :name => "flip"
1072
+ })
1073
+ end
1074
+
1075
+ it "returns platform config containing driver hash" do
1076
+ DataMunger.new({
1077
+ :platforms => [
1078
+ {
1079
+ :name => "plat",
1080
+ :driver_plugin => "flip",
1081
+ :driver_config => {
1082
+ :flop => "yep"
1083
+ }
1084
+ }
1085
+ ]
1086
+ }).driver_data_for("suite", "plat").must_equal({
1087
+ :name => "flip",
1088
+ :flop => "yep"
1089
+ })
1090
+ end
1091
+
1092
+ it "returns suite driver name" do
1093
+ DataMunger.new({
1094
+ :suites => [
1095
+ {
1096
+ :name => "sweet",
1097
+ :driver_plugin => "waz"
1098
+ }
1099
+ ]
1100
+ }).driver_data_for("sweet", "platform").must_equal({
1101
+ :name => "waz"
1102
+ })
1103
+ end
1104
+
1105
+ it "returns suite config containing driver hash" do
1106
+ DataMunger.new({
1107
+ :suites => [
1108
+ {
1109
+ :name => "sweet",
1110
+ :driver_plugin => "waz",
1111
+ :driver_config => {
1112
+ :up => "nope"
1113
+ }
1114
+ }
1115
+ ]
1116
+ }).driver_data_for("sweet", "platform").must_equal({
1117
+ :name => "waz",
1118
+ :up => "nope"
1119
+ })
1120
+ end
1121
+ end
1122
+
1123
+ describe "from multiple sources" do
1124
+
1125
+ it "suite into platform into common" do
1126
+ DataMunger.new({
1127
+ :driver_plugin => "commony",
1128
+ :driver_config => {
1129
+ :color => "purple",
1130
+ :fruit => ["apple", "pear"],
1131
+ :deep => { :common => "junk" }
1132
+ },
1133
+ :platforms => [
1134
+ {
1135
+ :name => "plat",
1136
+ :driver_plugin => "platformy",
1137
+ :driver_config => {
1138
+ :fruit => ["banana"],
1139
+ :deep => { :platform => "stuff" }
1140
+ }
1141
+ }
1142
+ ],
1143
+ :suites => [
1144
+ {
1145
+ :name => "sweet",
1146
+ :driver_plugin => "suitey",
1147
+ :driver_config => {
1148
+ :vehicle => "car",
1149
+ :deep => { :suite => "things" }
1150
+ }
1151
+ }
1152
+ ]
1153
+ }).driver_data_for("sweet", "plat").must_equal({
1154
+ :name => "suitey",
1155
+ :color => "purple",
1156
+ :fruit => ["banana"],
1157
+ :vehicle => "car",
1158
+ :deep => {
1159
+ :common => "junk",
1160
+ :platform => "stuff",
1161
+ :suite => "things"
1162
+ }
1163
+ })
1164
+ end
1165
+
1166
+ it "platform into common" do
1167
+ DataMunger.new({
1168
+ :driver_plugin => "commony",
1169
+ :driver_config => {
1170
+ :color => "purple",
1171
+ :fruit => ["apple", "pear"],
1172
+ :deep => { :common => "junk" }
1173
+ },
1174
+ :platforms => [
1175
+ {
1176
+ :name => "plat",
1177
+ :driver_plugin => "platformy",
1178
+ :driver_config => {
1179
+ :fruit => ["banana"],
1180
+ :deep => { :platform => "stuff" }
1181
+ }
1182
+ }
1183
+ ]
1184
+ }).driver_data_for("sweet", "plat").must_equal({
1185
+ :name => "platformy",
1186
+ :color => "purple",
1187
+ :fruit => ["banana"],
1188
+ :deep => {
1189
+ :common => "junk",
1190
+ :platform => "stuff"
1191
+ }
1192
+ })
1193
+ end
1194
+
1195
+ it "suite into common" do
1196
+ DataMunger.new({
1197
+ :driver_plugin => "commony",
1198
+ :driver_config => {
1199
+ :color => "purple",
1200
+ :fruit => ["apple", "pear"],
1201
+ :deep => { :common => "junk" }
1202
+ },
1203
+ :suites => [
1204
+ {
1205
+ :name => "sweet",
1206
+ :driver_plugin => "suitey",
1207
+ :driver_config => {
1208
+ :vehicle => "car",
1209
+ :deep => { :suite => "things" }
1210
+ }
1211
+ }
1212
+ ]
1213
+ }).driver_data_for("sweet", "plat").must_equal({
1214
+ :name => "suitey",
1215
+ :color => "purple",
1216
+ :fruit => ["apple", "pear"],
1217
+ :vehicle => "car",
1218
+ :deep => {
1219
+ :common => "junk",
1220
+ :suite => "things"
1221
+ }
1222
+ })
1223
+ end
1224
+
1225
+ it "suite into platform" do
1226
+ DataMunger.new({
1227
+ :platforms => [
1228
+ {
1229
+ :name => "plat",
1230
+ :driver_plugin => "platformy",
1231
+ :driver_config => {
1232
+ :fruit => ["banana"],
1233
+ :deep => { :platform => "stuff" }
1234
+ }
1235
+ }
1236
+ ],
1237
+ :suites => [
1238
+ {
1239
+ :name => "sweet",
1240
+ :driver_plugin => "suitey",
1241
+ :driver_config => {
1242
+ :vehicle => "car",
1243
+ :deep => { :suite => "things" }
1244
+ }
1245
+ }
1246
+ ]
1247
+ }).driver_data_for("sweet", "plat").must_equal({
1248
+ :name => "suitey",
1249
+ :fruit => ["banana"],
1250
+ :vehicle => "car",
1251
+ :deep => {
1252
+ :platform => "stuff",
1253
+ :suite => "things"
1254
+ }
1255
+ })
1256
+ end
1257
+ end
1258
+ end
1259
+
1260
+ describe "legacy chef paths from suite" do
1261
+
1262
+ LEGACY_CHEF_PATHS = [:data_path, :data_bags_path, :environments_path,
1263
+ :nodes_path, :roles_path]
1264
+
1265
+ LEGACY_CHEF_PATHS.each do |key|
1266
+
1267
+ it "moves #{key} into provisioner" do
1268
+ DataMunger.new({
1269
+ :provisioner => "chefy",
1270
+ :suites => [
1271
+ {
1272
+ :name => "sweet",
1273
+ key => "mypath"
1274
+ }
1275
+ ]
1276
+ }).provisioner_data_for("sweet", "plat").must_equal({
1277
+ :name => "chefy",
1278
+ key => "mypath"
1279
+ })
1280
+ end
1281
+
1282
+ it "merges provisioner into data_path if provisioner exists" do
1283
+ DataMunger.new({
1284
+ :suites => [
1285
+ {
1286
+ :name => "sweet",
1287
+ key => "mypath",
1288
+ :provisioner => "chefy",
1289
+ }
1290
+ ]
1291
+ }).provisioner_data_for("sweet", "plat").must_equal({
1292
+ :name => "chefy",
1293
+ key => "mypath"
1294
+ })
1295
+ end
1296
+ end
1297
+ end
1298
+
1299
+ describe "legacy require_chef_omnibus from driver" do
1300
+
1301
+ describe "from a single source" do
1302
+
1303
+ it "common driver value moves into provisioner" do
1304
+ DataMunger.new({
1305
+ :provisioner => "chefy",
1306
+ :driver => {
1307
+ :name => "starship",
1308
+ :require_chef_omnibus => "it's probably fine"
1309
+ }
1310
+ }).provisioner_data_for("suite", "platform").must_equal({
1311
+ :name => "chefy",
1312
+ :require_chef_omnibus => "it's probably fine"
1313
+ })
1314
+ end
1315
+
1316
+ it "common driver value loses to existing provisioner value" do
1317
+ DataMunger.new({
1318
+ :provisioner => {
1319
+ :name => "chefy",
1320
+ :require_chef_omnibus => "it's probably fine"
1321
+ },
1322
+ :driver => {
1323
+ :name => "starship",
1324
+ :require_chef_omnibus => "dragons"
1325
+ }
1326
+ }).provisioner_data_for("suite", "platform").must_equal({
1327
+ :name => "chefy",
1328
+ :require_chef_omnibus => "it's probably fine"
1329
+ })
1330
+ end
1331
+
1332
+ it "suite driver value moves into provisioner" do
1333
+ DataMunger.new({
1334
+ :suites => [
1335
+ {
1336
+ :name => "sweet",
1337
+ :provisioner => "chefy",
1338
+ :driver => {
1339
+ :name => "starship",
1340
+ :require_chef_omnibus => "it's probably fine"
1341
+ }
1342
+ }
1343
+ ],
1344
+ }).provisioner_data_for("sweet", "platform").must_equal({
1345
+ :name => "chefy",
1346
+ :require_chef_omnibus => "it's probably fine"
1347
+ })
1348
+ end
1349
+
1350
+ it "suite driver value loses to existing provisioner value" do
1351
+ DataMunger.new({
1352
+ :suites => [
1353
+ {
1354
+ :name => "sweet",
1355
+ :provisioner => {
1356
+ :name => "chefy",
1357
+ :require_chef_omnibus => "it's probably fine"
1358
+ },
1359
+ :driver => {
1360
+ :name => "starship",
1361
+ :require_chef_omnibus => "dragons"
1362
+ }
1363
+ }
1364
+ ]
1365
+ }).provisioner_data_for("sweet", "platform").must_equal({
1366
+ :name => "chefy",
1367
+ :require_chef_omnibus => "it's probably fine"
1368
+ })
1369
+ end
1370
+
1371
+ it "platform driver value moves into provisioner" do
1372
+ DataMunger.new({
1373
+ :platforms => [
1374
+ {
1375
+ :name => "plat",
1376
+ :provisioner => "chefy",
1377
+ :driver => {
1378
+ :name => "starship",
1379
+ :require_chef_omnibus => "it's probably fine"
1380
+ }
1381
+ }
1382
+ ],
1383
+ }).provisioner_data_for("suite", "plat").must_equal({
1384
+ :name => "chefy",
1385
+ :require_chef_omnibus => "it's probably fine"
1386
+ })
1387
+ end
1388
+
1389
+ it "platform driver value loses to existing provisioner value" do
1390
+ DataMunger.new({
1391
+ :platforms => [
1392
+ {
1393
+ :name => "plat",
1394
+ :provisioner => {
1395
+ :name => "chefy",
1396
+ :require_chef_omnibus => "it's probably fine"
1397
+ },
1398
+ :driver => {
1399
+ :name => "starship",
1400
+ :require_chef_omnibus => "dragons"
1401
+ }
1402
+ }
1403
+ ]
1404
+ }).provisioner_data_for("suite", "plat").must_equal({
1405
+ :name => "chefy",
1406
+ :require_chef_omnibus => "it's probably fine"
1407
+ })
1408
+ end
1409
+ end
1410
+ end
1411
+ end
1412
+ end