chef-config 12.22.1 → 12.22.3
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.
- checksums.yaml +4 -4
- data/LICENSE +201 -201
- data/README.md +4 -4
- data/Rakefile +17 -17
- data/chef-config.gemspec +34 -34
- data/lib/chef-config.rb +20 -20
- data/lib/chef-config/config.rb +1097 -1097
- data/lib/chef-config/exceptions.rb +27 -27
- data/lib/chef-config/fips.rb +51 -51
- data/lib/chef-config/logger.rb +59 -59
- data/lib/chef-config/mixin/dot_d.rb +38 -38
- data/lib/chef-config/mixin/fuzzy_hostname_matcher.rb +41 -41
- data/lib/chef-config/package_task.rb +272 -272
- data/lib/chef-config/path_helper.rb +283 -283
- data/lib/chef-config/version.rb +34 -34
- data/lib/chef-config/windows.rb +28 -28
- data/lib/chef-config/workstation_config_loader.rb +182 -182
- data/spec/spec_helper.rb +75 -75
- data/spec/unit/config_spec.rb +1190 -1190
- data/spec/unit/fips_spec.rb +128 -128
- data/spec/unit/path_helper_spec.rb +307 -307
- data/spec/unit/workstation_config_loader_spec.rb +366 -366
- metadata +2 -2
@@ -1,366 +1,366 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Daniel DeLeo (<dan@chef.io>)
|
3
|
-
# Copyright:: Copyright 2014-2016, Chef Software, Inc.
|
4
|
-
# License:: Apache License, Version 2.0
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
#
|
18
|
-
|
19
|
-
require "spec_helper"
|
20
|
-
require "tempfile"
|
21
|
-
|
22
|
-
require "chef-config/exceptions"
|
23
|
-
require "chef-config/windows"
|
24
|
-
require "chef-config/workstation_config_loader"
|
25
|
-
|
26
|
-
RSpec.describe ChefConfig::WorkstationConfigLoader do
|
27
|
-
|
28
|
-
let(:explicit_config_location) { nil }
|
29
|
-
|
30
|
-
let(:env) { {} }
|
31
|
-
|
32
|
-
let(:config_loader) do
|
33
|
-
described_class.new(explicit_config_location).tap do |c|
|
34
|
-
allow(c).to receive(:env).and_return(env)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
before do
|
39
|
-
# We set this to nil so that a dev workstation will
|
40
|
-
# not interfere with the tests.
|
41
|
-
ChefConfig::Config[:config_d_dir] = nil
|
42
|
-
end
|
43
|
-
|
44
|
-
# Test methods that do I/O or reference external state which are stubbed out
|
45
|
-
# elsewhere.
|
46
|
-
describe "external dependencies" do
|
47
|
-
let(:config_loader) { described_class.new(nil) }
|
48
|
-
|
49
|
-
it "delegates to ENV for env" do
|
50
|
-
expect(config_loader.env).to equal(ENV)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "tests a path's existence" do
|
54
|
-
expect(config_loader.path_exists?("/nope/nope/nope/nope/frab/jab/nab")).to be(false)
|
55
|
-
expect(config_loader.path_exists?(__FILE__)).to be(true)
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
describe "locating the config file" do
|
61
|
-
context "without an explicit config" do
|
62
|
-
|
63
|
-
before do
|
64
|
-
allow(config_loader).to receive(:path_exists?).with(an_instance_of(String)).and_return(false)
|
65
|
-
end
|
66
|
-
|
67
|
-
it "has no config if HOME is not set" do
|
68
|
-
expect(config_loader.config_location).to be(nil)
|
69
|
-
expect(config_loader.no_config_found?).to be(true)
|
70
|
-
end
|
71
|
-
|
72
|
-
context "when HOME is set and contains a knife.rb" do
|
73
|
-
|
74
|
-
let(:home) { "/Users/example.user" }
|
75
|
-
|
76
|
-
before do
|
77
|
-
allow(ChefConfig::PathHelper).to receive(:home).with(".chef").and_yield(File.join(home, ".chef"))
|
78
|
-
allow(config_loader).to receive(:path_exists?).with("#{home}/.chef/knife.rb").and_return(true)
|
79
|
-
end
|
80
|
-
|
81
|
-
it "uses the config in HOME/.chef/knife.rb" do
|
82
|
-
expect(config_loader.config_location).to eq("#{home}/.chef/knife.rb")
|
83
|
-
end
|
84
|
-
|
85
|
-
context "and has a config.rb" do
|
86
|
-
|
87
|
-
before do
|
88
|
-
allow(config_loader).to receive(:path_exists?).with("#{home}/.chef/config.rb").and_return(true)
|
89
|
-
end
|
90
|
-
|
91
|
-
it "uses the config in HOME/.chef/config.rb" do
|
92
|
-
expect(config_loader.config_location).to eq("#{home}/.chef/config.rb")
|
93
|
-
end
|
94
|
-
|
95
|
-
context "and/or a parent dir contains a .chef dir" do
|
96
|
-
|
97
|
-
let(:env_pwd) { "/path/to/cwd" }
|
98
|
-
|
99
|
-
before do
|
100
|
-
if ChefConfig.windows?
|
101
|
-
env["CD"] = env_pwd
|
102
|
-
else
|
103
|
-
env["PWD"] = env_pwd
|
104
|
-
end
|
105
|
-
|
106
|
-
allow(config_loader).to receive(:path_exists?).with("#{env_pwd}/.chef/knife.rb").and_return(true)
|
107
|
-
allow(File).to receive(:exist?).with("#{env_pwd}/.chef").and_return(true)
|
108
|
-
allow(File).to receive(:directory?).with("#{env_pwd}/.chef").and_return(true)
|
109
|
-
end
|
110
|
-
|
111
|
-
it "prefers the config from parent_dir/.chef" do
|
112
|
-
expect(config_loader.config_location).to eq("#{env_pwd}/.chef/knife.rb")
|
113
|
-
end
|
114
|
-
|
115
|
-
context "and the parent dir's .chef dir has a config.rb" do
|
116
|
-
|
117
|
-
before do
|
118
|
-
allow(config_loader).to receive(:path_exists?).with("#{env_pwd}/.chef/config.rb").and_return(true)
|
119
|
-
end
|
120
|
-
|
121
|
-
it "prefers the config from parent_dir/.chef" do
|
122
|
-
expect(config_loader.config_location).to eq("#{env_pwd}/.chef/config.rb")
|
123
|
-
end
|
124
|
-
|
125
|
-
context "and/or the current working directory contains a .chef dir" do
|
126
|
-
|
127
|
-
let(:cwd) { Dir.pwd }
|
128
|
-
|
129
|
-
before do
|
130
|
-
allow(config_loader).to receive(:path_exists?).with("#{cwd}/knife.rb").and_return(true)
|
131
|
-
end
|
132
|
-
|
133
|
-
it "prefers a knife.rb located in the cwd" do
|
134
|
-
expect(config_loader.config_location).to eq("#{cwd}/knife.rb")
|
135
|
-
end
|
136
|
-
|
137
|
-
context "and the CWD's .chef dir has a config.rb" do
|
138
|
-
|
139
|
-
before do
|
140
|
-
allow(config_loader).to receive(:path_exists?).with("#{cwd}/config.rb").and_return(true)
|
141
|
-
end
|
142
|
-
|
143
|
-
it "prefers a config located in the cwd" do
|
144
|
-
expect(config_loader.config_location).to eq("#{cwd}/config.rb")
|
145
|
-
end
|
146
|
-
|
147
|
-
context "and/or KNIFE_HOME is set" do
|
148
|
-
|
149
|
-
let(:knife_home) { "/path/to/knife/home" }
|
150
|
-
|
151
|
-
before do
|
152
|
-
env["KNIFE_HOME"] = knife_home
|
153
|
-
allow(config_loader).to receive(:path_exists?).with("#{knife_home}/knife.rb").and_return(true)
|
154
|
-
end
|
155
|
-
|
156
|
-
it "prefers a knife located in KNIFE_HOME" do
|
157
|
-
expect(config_loader.config_location).to eq("/path/to/knife/home/knife.rb")
|
158
|
-
end
|
159
|
-
|
160
|
-
context "and KNIFE_HOME contains a config.rb" do
|
161
|
-
|
162
|
-
before do
|
163
|
-
env["KNIFE_HOME"] = knife_home
|
164
|
-
allow(config_loader).to receive(:path_exists?).with("#{knife_home}/config.rb").and_return(true)
|
165
|
-
end
|
166
|
-
|
167
|
-
it "prefers a config.rb located in KNIFE_HOME" do
|
168
|
-
expect(config_loader.config_location).to eq("/path/to/knife/home/config.rb")
|
169
|
-
end
|
170
|
-
|
171
|
-
end
|
172
|
-
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
context "when the current working dir is inside a symlinked directory" do
|
182
|
-
before do
|
183
|
-
# pwd according to your shell is /home/someuser/prod/chef-repo, but
|
184
|
-
# chef-repo is a symlink to /home/someuser/codes/chef-repo
|
185
|
-
env["CD"] = "/home/someuser/prod/chef-repo" # windows
|
186
|
-
env["PWD"] = "/home/someuser/prod/chef-repo" # unix
|
187
|
-
|
188
|
-
allow(Dir).to receive(:pwd).and_return("/home/someuser/codes/chef-repo")
|
189
|
-
end
|
190
|
-
|
191
|
-
it "loads the config from the non-dereferenced directory path" do
|
192
|
-
expect(File).to receive(:exist?).with("/home/someuser/prod/chef-repo/.chef").and_return(false)
|
193
|
-
expect(File).to receive(:exist?).with("/home/someuser/prod/.chef").and_return(true)
|
194
|
-
expect(File).to receive(:directory?).with("/home/someuser/prod/.chef").and_return(true)
|
195
|
-
|
196
|
-
expect(config_loader).to receive(:path_exists?).with("/home/someuser/prod/.chef/knife.rb").and_return(true)
|
197
|
-
|
198
|
-
expect(config_loader.config_location).to eq("/home/someuser/prod/.chef/knife.rb")
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
context "when given an explicit config to load" do
|
204
|
-
|
205
|
-
let(:explicit_config_location) { "/path/to/explicit/config.rb" }
|
206
|
-
|
207
|
-
it "prefers the explicit config" do
|
208
|
-
expect(config_loader.config_location).to eq(explicit_config_location)
|
209
|
-
end
|
210
|
-
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
describe "loading the config file" do
|
215
|
-
|
216
|
-
context "when no explicit config is specifed and no implicit config is found" do
|
217
|
-
|
218
|
-
before do
|
219
|
-
allow(config_loader).to receive(:path_exists?).with(an_instance_of(String)).and_return(false)
|
220
|
-
end
|
221
|
-
|
222
|
-
it "skips loading" do
|
223
|
-
expect(config_loader.config_location).to be(nil)
|
224
|
-
expect(config_loader).not_to receive(:apply_config)
|
225
|
-
config_loader.load
|
226
|
-
end
|
227
|
-
|
228
|
-
end
|
229
|
-
|
230
|
-
context "when an explicit config is given but it doesn't exist" do
|
231
|
-
|
232
|
-
let(:explicit_config_location) { "/nope/nope/nope/frab/jab/nab" }
|
233
|
-
|
234
|
-
it "raises a configuration error" do
|
235
|
-
expect { config_loader.load }.to raise_error(ChefConfig::ConfigurationError)
|
236
|
-
end
|
237
|
-
|
238
|
-
end
|
239
|
-
|
240
|
-
context "when the config file exists" do
|
241
|
-
|
242
|
-
let(:config_content) { "" }
|
243
|
-
|
244
|
-
# We need to keep a reference to the tempfile because while #close does
|
245
|
-
# not unlink the file, the object being GC'd will.
|
246
|
-
let(:tempfile) do
|
247
|
-
Tempfile.new("Chef-WorkstationConfigLoader-rspec-test").tap do |t|
|
248
|
-
t.print(config_content)
|
249
|
-
t.close
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
let(:explicit_config_location) do
|
254
|
-
tempfile.path
|
255
|
-
end
|
256
|
-
|
257
|
-
after { File.unlink(explicit_config_location) if File.exist?(explicit_config_location) }
|
258
|
-
|
259
|
-
context "and is valid" do
|
260
|
-
|
261
|
-
let(:config_content) { "config_file_evaluated(true)" }
|
262
|
-
|
263
|
-
it "loads the config" do
|
264
|
-
expect(config_loader).to receive(:apply_config).and_call_original
|
265
|
-
config_loader.load
|
266
|
-
expect(ChefConfig::Config.config_file_evaluated).to be(true)
|
267
|
-
end
|
268
|
-
|
269
|
-
it "sets ChefConfig::Config.config_file" do
|
270
|
-
config_loader.load
|
271
|
-
expect(ChefConfig::Config.config_file).to eq(explicit_config_location)
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
context "and has a syntax error" do
|
276
|
-
|
277
|
-
let(:config_content) { "{{{{{:{{" }
|
278
|
-
|
279
|
-
it "raises a ConfigurationError" do
|
280
|
-
expect { config_loader.load }.to raise_error(ChefConfig::ConfigurationError)
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
context "and raises a ruby exception during evaluation" do
|
285
|
-
|
286
|
-
let(:config_content) { ":foo\n:bar\nraise 'oops'\n:baz\n" }
|
287
|
-
|
288
|
-
it "raises a ConfigurationError" do
|
289
|
-
expect { config_loader.load }.to raise_error(ChefConfig::ConfigurationError)
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
end
|
294
|
-
|
295
|
-
end
|
296
|
-
|
297
|
-
describe "when loading config.d" do
|
298
|
-
context "when the conf.d directory exists" do
|
299
|
-
let(:config_content) { "" }
|
300
|
-
|
301
|
-
let(:tempdir) { Dir.mktmpdir("chef-workstation-test") }
|
302
|
-
|
303
|
-
let!(:confd_file) do
|
304
|
-
Tempfile.new(["Chef-WorkstationConfigLoader-rspec-test", ".rb"], tempdir).tap do |t|
|
305
|
-
t.print(config_content)
|
306
|
-
t.close
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
|
-
before do
|
311
|
-
ChefConfig::Config[:config_d_dir] = tempdir
|
312
|
-
allow(config_loader).to receive(:path_exists?).with(
|
313
|
-
an_instance_of(String)).and_return(false)
|
314
|
-
end
|
315
|
-
|
316
|
-
after do
|
317
|
-
FileUtils.remove_entry_secure tempdir
|
318
|
-
end
|
319
|
-
|
320
|
-
context "and is valid" do
|
321
|
-
let(:config_content) { "config_d_file_evaluated(true)" }
|
322
|
-
|
323
|
-
it "loads the config" do
|
324
|
-
expect(config_loader).to receive(:apply_config).and_call_original
|
325
|
-
config_loader.load
|
326
|
-
expect(ChefConfig::Config.config_d_file_evaluated).to be(true)
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
context "and has a syntax error" do
|
331
|
-
let(:config_content) { "{{{{{:{{" }
|
332
|
-
|
333
|
-
it "raises a ConfigurationError" do
|
334
|
-
expect { config_loader.load }.to raise_error(ChefConfig::ConfigurationError)
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
|
-
context "has a non rb file" do
|
339
|
-
let(:sytax_error_content) { "{{{{{:{{" }
|
340
|
-
let(:config_content) { "config_d_file_evaluated(true)" }
|
341
|
-
|
342
|
-
let!(:not_confd_file) do
|
343
|
-
Tempfile.new(["Chef-WorkstationConfigLoader-rspec-test", ".foorb"], tempdir).tap do |t|
|
344
|
-
t.print(sytax_error_content)
|
345
|
-
t.close
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
it "does not load the non rb file" do
|
350
|
-
expect { config_loader.load }.not_to raise_error
|
351
|
-
expect(ChefConfig::Config.config_d_file_evaluated).to be(true)
|
352
|
-
end
|
353
|
-
end
|
354
|
-
end
|
355
|
-
|
356
|
-
context "when the conf.d directory does not exist" do
|
357
|
-
before do
|
358
|
-
ChefConfig::Config[:config_d_dir] = "/nope/nope/nope/nope/notdoingit"
|
359
|
-
end
|
360
|
-
|
361
|
-
it "does not load anything" do
|
362
|
-
expect(config_loader).not_to receive(:apply_config)
|
363
|
-
end
|
364
|
-
end
|
365
|
-
end
|
366
|
-
end
|
1
|
+
#
|
2
|
+
# Author:: Daniel DeLeo (<dan@chef.io>)
|
3
|
+
# Copyright:: Copyright 2014-2016, Chef Software, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require "spec_helper"
|
20
|
+
require "tempfile"
|
21
|
+
|
22
|
+
require "chef-config/exceptions"
|
23
|
+
require "chef-config/windows"
|
24
|
+
require "chef-config/workstation_config_loader"
|
25
|
+
|
26
|
+
RSpec.describe ChefConfig::WorkstationConfigLoader do
|
27
|
+
|
28
|
+
let(:explicit_config_location) { nil }
|
29
|
+
|
30
|
+
let(:env) { {} }
|
31
|
+
|
32
|
+
let(:config_loader) do
|
33
|
+
described_class.new(explicit_config_location).tap do |c|
|
34
|
+
allow(c).to receive(:env).and_return(env)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
before do
|
39
|
+
# We set this to nil so that a dev workstation will
|
40
|
+
# not interfere with the tests.
|
41
|
+
ChefConfig::Config[:config_d_dir] = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
# Test methods that do I/O or reference external state which are stubbed out
|
45
|
+
# elsewhere.
|
46
|
+
describe "external dependencies" do
|
47
|
+
let(:config_loader) { described_class.new(nil) }
|
48
|
+
|
49
|
+
it "delegates to ENV for env" do
|
50
|
+
expect(config_loader.env).to equal(ENV)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "tests a path's existence" do
|
54
|
+
expect(config_loader.path_exists?("/nope/nope/nope/nope/frab/jab/nab")).to be(false)
|
55
|
+
expect(config_loader.path_exists?(__FILE__)).to be(true)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "locating the config file" do
|
61
|
+
context "without an explicit config" do
|
62
|
+
|
63
|
+
before do
|
64
|
+
allow(config_loader).to receive(:path_exists?).with(an_instance_of(String)).and_return(false)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "has no config if HOME is not set" do
|
68
|
+
expect(config_loader.config_location).to be(nil)
|
69
|
+
expect(config_loader.no_config_found?).to be(true)
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when HOME is set and contains a knife.rb" do
|
73
|
+
|
74
|
+
let(:home) { "/Users/example.user" }
|
75
|
+
|
76
|
+
before do
|
77
|
+
allow(ChefConfig::PathHelper).to receive(:home).with(".chef").and_yield(File.join(home, ".chef"))
|
78
|
+
allow(config_loader).to receive(:path_exists?).with("#{home}/.chef/knife.rb").and_return(true)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "uses the config in HOME/.chef/knife.rb" do
|
82
|
+
expect(config_loader.config_location).to eq("#{home}/.chef/knife.rb")
|
83
|
+
end
|
84
|
+
|
85
|
+
context "and has a config.rb" do
|
86
|
+
|
87
|
+
before do
|
88
|
+
allow(config_loader).to receive(:path_exists?).with("#{home}/.chef/config.rb").and_return(true)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "uses the config in HOME/.chef/config.rb" do
|
92
|
+
expect(config_loader.config_location).to eq("#{home}/.chef/config.rb")
|
93
|
+
end
|
94
|
+
|
95
|
+
context "and/or a parent dir contains a .chef dir" do
|
96
|
+
|
97
|
+
let(:env_pwd) { "/path/to/cwd" }
|
98
|
+
|
99
|
+
before do
|
100
|
+
if ChefConfig.windows?
|
101
|
+
env["CD"] = env_pwd
|
102
|
+
else
|
103
|
+
env["PWD"] = env_pwd
|
104
|
+
end
|
105
|
+
|
106
|
+
allow(config_loader).to receive(:path_exists?).with("#{env_pwd}/.chef/knife.rb").and_return(true)
|
107
|
+
allow(File).to receive(:exist?).with("#{env_pwd}/.chef").and_return(true)
|
108
|
+
allow(File).to receive(:directory?).with("#{env_pwd}/.chef").and_return(true)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "prefers the config from parent_dir/.chef" do
|
112
|
+
expect(config_loader.config_location).to eq("#{env_pwd}/.chef/knife.rb")
|
113
|
+
end
|
114
|
+
|
115
|
+
context "and the parent dir's .chef dir has a config.rb" do
|
116
|
+
|
117
|
+
before do
|
118
|
+
allow(config_loader).to receive(:path_exists?).with("#{env_pwd}/.chef/config.rb").and_return(true)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "prefers the config from parent_dir/.chef" do
|
122
|
+
expect(config_loader.config_location).to eq("#{env_pwd}/.chef/config.rb")
|
123
|
+
end
|
124
|
+
|
125
|
+
context "and/or the current working directory contains a .chef dir" do
|
126
|
+
|
127
|
+
let(:cwd) { Dir.pwd }
|
128
|
+
|
129
|
+
before do
|
130
|
+
allow(config_loader).to receive(:path_exists?).with("#{cwd}/knife.rb").and_return(true)
|
131
|
+
end
|
132
|
+
|
133
|
+
it "prefers a knife.rb located in the cwd" do
|
134
|
+
expect(config_loader.config_location).to eq("#{cwd}/knife.rb")
|
135
|
+
end
|
136
|
+
|
137
|
+
context "and the CWD's .chef dir has a config.rb" do
|
138
|
+
|
139
|
+
before do
|
140
|
+
allow(config_loader).to receive(:path_exists?).with("#{cwd}/config.rb").and_return(true)
|
141
|
+
end
|
142
|
+
|
143
|
+
it "prefers a config located in the cwd" do
|
144
|
+
expect(config_loader.config_location).to eq("#{cwd}/config.rb")
|
145
|
+
end
|
146
|
+
|
147
|
+
context "and/or KNIFE_HOME is set" do
|
148
|
+
|
149
|
+
let(:knife_home) { "/path/to/knife/home" }
|
150
|
+
|
151
|
+
before do
|
152
|
+
env["KNIFE_HOME"] = knife_home
|
153
|
+
allow(config_loader).to receive(:path_exists?).with("#{knife_home}/knife.rb").and_return(true)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "prefers a knife located in KNIFE_HOME" do
|
157
|
+
expect(config_loader.config_location).to eq("/path/to/knife/home/knife.rb")
|
158
|
+
end
|
159
|
+
|
160
|
+
context "and KNIFE_HOME contains a config.rb" do
|
161
|
+
|
162
|
+
before do
|
163
|
+
env["KNIFE_HOME"] = knife_home
|
164
|
+
allow(config_loader).to receive(:path_exists?).with("#{knife_home}/config.rb").and_return(true)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "prefers a config.rb located in KNIFE_HOME" do
|
168
|
+
expect(config_loader.config_location).to eq("/path/to/knife/home/config.rb")
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context "when the current working dir is inside a symlinked directory" do
|
182
|
+
before do
|
183
|
+
# pwd according to your shell is /home/someuser/prod/chef-repo, but
|
184
|
+
# chef-repo is a symlink to /home/someuser/codes/chef-repo
|
185
|
+
env["CD"] = "/home/someuser/prod/chef-repo" # windows
|
186
|
+
env["PWD"] = "/home/someuser/prod/chef-repo" # unix
|
187
|
+
|
188
|
+
allow(Dir).to receive(:pwd).and_return("/home/someuser/codes/chef-repo")
|
189
|
+
end
|
190
|
+
|
191
|
+
it "loads the config from the non-dereferenced directory path" do
|
192
|
+
expect(File).to receive(:exist?).with("/home/someuser/prod/chef-repo/.chef").and_return(false)
|
193
|
+
expect(File).to receive(:exist?).with("/home/someuser/prod/.chef").and_return(true)
|
194
|
+
expect(File).to receive(:directory?).with("/home/someuser/prod/.chef").and_return(true)
|
195
|
+
|
196
|
+
expect(config_loader).to receive(:path_exists?).with("/home/someuser/prod/.chef/knife.rb").and_return(true)
|
197
|
+
|
198
|
+
expect(config_loader.config_location).to eq("/home/someuser/prod/.chef/knife.rb")
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
context "when given an explicit config to load" do
|
204
|
+
|
205
|
+
let(:explicit_config_location) { "/path/to/explicit/config.rb" }
|
206
|
+
|
207
|
+
it "prefers the explicit config" do
|
208
|
+
expect(config_loader.config_location).to eq(explicit_config_location)
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
describe "loading the config file" do
|
215
|
+
|
216
|
+
context "when no explicit config is specifed and no implicit config is found" do
|
217
|
+
|
218
|
+
before do
|
219
|
+
allow(config_loader).to receive(:path_exists?).with(an_instance_of(String)).and_return(false)
|
220
|
+
end
|
221
|
+
|
222
|
+
it "skips loading" do
|
223
|
+
expect(config_loader.config_location).to be(nil)
|
224
|
+
expect(config_loader).not_to receive(:apply_config)
|
225
|
+
config_loader.load
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
229
|
+
|
230
|
+
context "when an explicit config is given but it doesn't exist" do
|
231
|
+
|
232
|
+
let(:explicit_config_location) { "/nope/nope/nope/frab/jab/nab" }
|
233
|
+
|
234
|
+
it "raises a configuration error" do
|
235
|
+
expect { config_loader.load }.to raise_error(ChefConfig::ConfigurationError)
|
236
|
+
end
|
237
|
+
|
238
|
+
end
|
239
|
+
|
240
|
+
context "when the config file exists" do
|
241
|
+
|
242
|
+
let(:config_content) { "" }
|
243
|
+
|
244
|
+
# We need to keep a reference to the tempfile because while #close does
|
245
|
+
# not unlink the file, the object being GC'd will.
|
246
|
+
let(:tempfile) do
|
247
|
+
Tempfile.new("Chef-WorkstationConfigLoader-rspec-test").tap do |t|
|
248
|
+
t.print(config_content)
|
249
|
+
t.close
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
let(:explicit_config_location) do
|
254
|
+
tempfile.path
|
255
|
+
end
|
256
|
+
|
257
|
+
after { File.unlink(explicit_config_location) if File.exist?(explicit_config_location) }
|
258
|
+
|
259
|
+
context "and is valid" do
|
260
|
+
|
261
|
+
let(:config_content) { "config_file_evaluated(true)" }
|
262
|
+
|
263
|
+
it "loads the config" do
|
264
|
+
expect(config_loader).to receive(:apply_config).and_call_original
|
265
|
+
config_loader.load
|
266
|
+
expect(ChefConfig::Config.config_file_evaluated).to be(true)
|
267
|
+
end
|
268
|
+
|
269
|
+
it "sets ChefConfig::Config.config_file" do
|
270
|
+
config_loader.load
|
271
|
+
expect(ChefConfig::Config.config_file).to eq(explicit_config_location)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
context "and has a syntax error" do
|
276
|
+
|
277
|
+
let(:config_content) { "{{{{{:{{" }
|
278
|
+
|
279
|
+
it "raises a ConfigurationError" do
|
280
|
+
expect { config_loader.load }.to raise_error(ChefConfig::ConfigurationError)
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
context "and raises a ruby exception during evaluation" do
|
285
|
+
|
286
|
+
let(:config_content) { ":foo\n:bar\nraise 'oops'\n:baz\n" }
|
287
|
+
|
288
|
+
it "raises a ConfigurationError" do
|
289
|
+
expect { config_loader.load }.to raise_error(ChefConfig::ConfigurationError)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
end
|
294
|
+
|
295
|
+
end
|
296
|
+
|
297
|
+
describe "when loading config.d" do
|
298
|
+
context "when the conf.d directory exists" do
|
299
|
+
let(:config_content) { "" }
|
300
|
+
|
301
|
+
let(:tempdir) { Dir.mktmpdir("chef-workstation-test") }
|
302
|
+
|
303
|
+
let!(:confd_file) do
|
304
|
+
Tempfile.new(["Chef-WorkstationConfigLoader-rspec-test", ".rb"], tempdir).tap do |t|
|
305
|
+
t.print(config_content)
|
306
|
+
t.close
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
before do
|
311
|
+
ChefConfig::Config[:config_d_dir] = tempdir
|
312
|
+
allow(config_loader).to receive(:path_exists?).with(
|
313
|
+
an_instance_of(String)).and_return(false)
|
314
|
+
end
|
315
|
+
|
316
|
+
after do
|
317
|
+
FileUtils.remove_entry_secure tempdir
|
318
|
+
end
|
319
|
+
|
320
|
+
context "and is valid" do
|
321
|
+
let(:config_content) { "config_d_file_evaluated(true)" }
|
322
|
+
|
323
|
+
it "loads the config" do
|
324
|
+
expect(config_loader).to receive(:apply_config).and_call_original
|
325
|
+
config_loader.load
|
326
|
+
expect(ChefConfig::Config.config_d_file_evaluated).to be(true)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
context "and has a syntax error" do
|
331
|
+
let(:config_content) { "{{{{{:{{" }
|
332
|
+
|
333
|
+
it "raises a ConfigurationError" do
|
334
|
+
expect { config_loader.load }.to raise_error(ChefConfig::ConfigurationError)
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
context "has a non rb file" do
|
339
|
+
let(:sytax_error_content) { "{{{{{:{{" }
|
340
|
+
let(:config_content) { "config_d_file_evaluated(true)" }
|
341
|
+
|
342
|
+
let!(:not_confd_file) do
|
343
|
+
Tempfile.new(["Chef-WorkstationConfigLoader-rspec-test", ".foorb"], tempdir).tap do |t|
|
344
|
+
t.print(sytax_error_content)
|
345
|
+
t.close
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
it "does not load the non rb file" do
|
350
|
+
expect { config_loader.load }.not_to raise_error
|
351
|
+
expect(ChefConfig::Config.config_d_file_evaluated).to be(true)
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
context "when the conf.d directory does not exist" do
|
357
|
+
before do
|
358
|
+
ChefConfig::Config[:config_d_dir] = "/nope/nope/nope/nope/notdoingit"
|
359
|
+
end
|
360
|
+
|
361
|
+
it "does not load anything" do
|
362
|
+
expect(config_loader).not_to receive(:apply_config)
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|