chef-apply 0.4.6 → 0.4.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -7
  3. data/chef-apply.gemspec +3 -3
  4. data/lib/chef_apply/version.rb +1 -1
  5. metadata +3 -38
  6. data/README.md +0 -62
  7. data/spec/fixtures/custom_config.toml +0 -2
  8. data/spec/integration/chef-run_spec.rb +0 -41
  9. data/spec/integration/fixtures/chef_help.out +0 -70
  10. data/spec/integration/fixtures/chef_version.out +0 -1
  11. data/spec/integration/spec_helper.rb +0 -55
  12. data/spec/spec_helper.rb +0 -154
  13. data/spec/support/matchers/output_to_terminal.rb +0 -36
  14. data/spec/unit/action/base_spec.rb +0 -60
  15. data/spec/unit/action/converge_target/ccr_failure_mapper_spec.rb +0 -106
  16. data/spec/unit/action/converge_target_spec.rb +0 -400
  17. data/spec/unit/action/generate_local_policy_spec.rb +0 -114
  18. data/spec/unit/action/generate_temp_cookbook/recipe_lookup_spec.rb +0 -122
  19. data/spec/unit/action/generate_temp_cookbook/temp_cookbook_spec.rb +0 -198
  20. data/spec/unit/action/generate_temp_cookbook_spec.rb +0 -73
  21. data/spec/unit/action/install_chef/minimum_chef_version_spec.rb +0 -90
  22. data/spec/unit/action/install_chef_spec.rb +0 -164
  23. data/spec/unit/cli/options_spec.rb +0 -75
  24. data/spec/unit/cli/validation_spec.rb +0 -81
  25. data/spec/unit/cli_spec.rb +0 -475
  26. data/spec/unit/config_spec.rb +0 -70
  27. data/spec/unit/file_fetcher_spec.rb +0 -40
  28. data/spec/unit/fixtures/multi-error.out +0 -2
  29. data/spec/unit/log_spec.rb +0 -37
  30. data/spec/unit/startup_spec.rb +0 -323
  31. data/spec/unit/target_host/linux_spec.rb +0 -57
  32. data/spec/unit/target_host/windows_spec.rb +0 -43
  33. data/spec/unit/target_host_spec.rb +0 -297
  34. data/spec/unit/target_resolver_spec.rb +0 -380
  35. data/spec/unit/telemeter/sender_spec.rb +0 -140
  36. data/spec/unit/telemeter_spec.rb +0 -191
  37. data/spec/unit/text/error_translation_spec.rb +0 -109
  38. data/spec/unit/ui/error_printer_spec.rb +0 -196
  39. data/spec/unit/ui/terminal_spec.rb +0 -119
  40. data/spec/unit/version_spec.rb +0 -31
@@ -1,70 +0,0 @@
1
- #
2
- # Copyright:: Copyright (c) 2018 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require "spec_helper"
19
- require "chef_apply/config"
20
-
21
- RSpec.describe ChefApply::Config do
22
- subject(:config) do
23
- ChefApply::Config
24
- end
25
-
26
- before(:each) do
27
- ChefApply::Config.reset
28
- end
29
-
30
- it "raises an error when trying to specify non-existing config location" do
31
- expect { config.custom_location("/does/not/exist") }.to raise_error(RuntimeError, /No config file/)
32
- end
33
-
34
- it "should use default location by default" do
35
- expect(config.using_default_location?).to eq(true)
36
- end
37
-
38
- context "when there is a custom config" do
39
- let(:custom_config) { File.expand_path("../../fixtures/custom_config.toml", __FILE__) }
40
-
41
- it "successfully loads the config" do
42
- config.custom_location(custom_config)
43
- expect(config.using_default_location?).to eq(false)
44
- expect(config.exist?).to eq(true)
45
- config.load
46
- expect(config.telemetry.dev).to eq(true)
47
- end
48
- end
49
- describe "#load" do
50
- before do
51
- expect(subject).to receive(:exist?).and_return(exists)
52
- end
53
-
54
- context "when the config file exists" do
55
- let(:exists) { true }
56
- it "loads the file" do
57
- expect(subject).to receive(:from_file)
58
- subject.load
59
- end
60
- end
61
-
62
- context "when the config file does not exist" do
63
- let(:exists) { false }
64
- it "does not try to load the file" do
65
- expect(subject).to_not receive(:from_file)
66
- subject.load
67
- end
68
- end
69
- end
70
- end
@@ -1,40 +0,0 @@
1
- #
2
- # Copyright:: Copyright (c) 2018 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require "chef_apply/file_fetcher"
19
- require "spec_helper"
20
-
21
- RSpec.describe ChefApply::FileFetcher do
22
- let(:expected_local_location) { File.join(ChefApply::Config.cache.path, "example.txt") }
23
- subject { ChefApply::FileFetcher }
24
- describe ".fetch" do
25
- it "returns the local path when the file is cached" do
26
- allow(FileUtils).to receive(:mkdir)
27
- expect(File).to receive(:exist?).with(expected_local_location).and_return(true)
28
- result = subject.fetch("https://example.com/example.txt")
29
- expect(result).to eq expected_local_location
30
- end
31
-
32
- it "returns the local path when the file is fetched" do
33
- allow(FileUtils).to receive(:mkdir)
34
- expect(File).to receive(:exist?).with(expected_local_location).and_return(false)
35
- expect(subject).to receive(:download_file)
36
- result = subject.fetch("https://example.com/example.txt")
37
- expect(result).to eq expected_local_location
38
- end
39
- end
40
- end
@@ -1,2 +0,0 @@
1
- Host: host1 Error: CHEFUPL005: Uploading policy bundle to target failed.
2
- Host: host2 : An unexpected error has occurred: Hello World
@@ -1,37 +0,0 @@
1
- #
2
- # Copyright:: Copyright (c) 2018 Chef Software Inc.
3
- # License:: Apache License, Version 2.0
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
- #
17
-
18
- require "spec_helper"
19
- require "chef_apply/log"
20
-
21
- RSpec.describe ChefApply::Log do
22
- Log = ChefApply::Log
23
- let(:output) { StringIO.new }
24
-
25
- before do
26
- Log.setup output, :debug
27
- end
28
-
29
- after do
30
- Log.setup File::NULL, :error
31
- end
32
-
33
- it "correctly logs to stdout" do
34
- Log.debug("test")
35
- expect(output.string).to match(/DEBUG: test$/)
36
- end
37
- end
@@ -1,323 +0,0 @@
1
- require "chef_apply/startup"
2
- require "chef_apply/text"
3
- require "chef_apply/ui/terminal"
4
-
5
- RSpec.describe ChefApply::Startup do
6
- let(:argv) { [] }
7
- let(:telemetry) { ChefApply::Telemeter.instance }
8
- subject do
9
- ChefApply::Startup.new(argv)
10
- end
11
- before do
12
- allow(ChefApply::UI::Terminal).to receive(:init)
13
- end
14
-
15
- after do
16
- ChefApply::Config.reset
17
- end
18
-
19
- describe "#initalize" do
20
- it "initializes the terminal" do
21
- expect_any_instance_of(ChefApply::Startup).to receive(:init_terminal)
22
- ChefApply::Startup.new([])
23
- end
24
- end
25
-
26
- describe "#run" do
27
- it "performs ordered startup tasks and invokes the CLI" do
28
- ordered_messages = %i{verify_not_in_chefdk
29
- first_run_tasks
30
- setup_workstation_user_directories
31
- setup_error_handling
32
- load_config
33
- setup_logging
34
- start_telemeter_upload
35
- start_chef_apply}
36
- ordered_messages.each do |msg|
37
- expect(subject).to receive(msg).ordered
38
- end
39
- subject.run
40
- end
41
-
42
- context "when errors happen" do
43
- let(:error) { nil }
44
- let(:error_text) { ChefApply::Text.cli.error }
45
- before do
46
- # Force the error to happen in first_run_tasks, since it's always... well, first.
47
- expect(subject).to receive(:first_run_tasks).and_raise(error)
48
- end
49
-
50
- context "when an UnknownConfigOptionError is raised" do
51
- let(:bad_path) { "bad/path" }
52
- let(:bad_option) { "bad_option" }
53
-
54
- context "and it matches the expected text form" do
55
- let(:error) { Mixlib::Config::UnknownConfigOptionError.new("unsupported config value #{bad_option}.") }
56
- it "shows the correct error" do
57
- expected_text = error_text.invalid_config_key(bad_option, ChefApply::Config.location)
58
- expect(ChefApply::UI::Terminal).to receive(:output).with(expected_text)
59
- subject.run
60
- end
61
- end
62
-
63
- context "and it does not match the expeted text form" do
64
- let(:msg) { "something bad happened" }
65
- let(:error) { Mixlib::Config::UnknownConfigOptionError.new(msg) }
66
- it "shows the correct error" do
67
- expected_text = error_text.unknown_config_error(msg, ChefApply::Config.location)
68
- expect(ChefApply::UI::Terminal).to receive(:output).with(expected_text)
69
- subject.run
70
- end
71
- end
72
- end
73
-
74
- context "when a ConfigPathInvalid is raised" do
75
- let(:bad_path) { "bad/path" }
76
- let(:error) { ChefApply::Startup::ConfigPathInvalid.new(bad_path) }
77
-
78
- it "shows the correct error" do
79
- expected_text = error_text.bad_config_file(bad_path)
80
- expect(ChefApply::UI::Terminal).to receive(:output).with(expected_text)
81
- subject.run
82
- end
83
- end
84
-
85
- context "when a ConfigPathNotProvided is raised" do
86
- let(:error) { ChefApply::Startup::ConfigPathNotProvided.new }
87
-
88
- it "shows the correct error" do
89
- expected_text = error_text.missing_config_path
90
- expect(ChefApply::UI::Terminal).to receive(:output).with(expected_text)
91
- subject.run
92
- end
93
- end
94
-
95
- context "when a UnsupportedInstallation exception is raised" do
96
- let(:error) { ChefApply::Startup::UnsupportedInstallation.new }
97
-
98
- it "shows the correct error" do
99
- expected_text = error_text.unsupported_installation
100
- expect(ChefApply::UI::Terminal).to receive(:output).with(expected_text)
101
- subject.run
102
- end
103
- end
104
-
105
- context "when a Tomlrb::ParserError is raised" do
106
- let(:msg) { "Parse failed." }
107
- let(:error) { Tomlrb::ParseError.new(msg) }
108
-
109
- it "shows the correct error" do
110
- expected_text = error_text.unknown_config_error(msg, ChefApply::Config.location)
111
- expect(ChefApply::UI::Terminal).to receive(:output).with(expected_text)
112
- subject.run
113
- end
114
- end
115
- end
116
- end
117
-
118
- describe "#init_terminal" do
119
- it "initializees the terminal for stdout" do
120
- expect(ChefApply::UI::Terminal).to receive(:init).with($stdout)
121
- subject.init_terminal
122
- end
123
- end
124
-
125
- describe "#verify_not_in_chefdk" do
126
- before do
127
- allow(subject).to receive(:script_path).and_return script_path
128
- end
129
-
130
- context "when chef-run has been loaded from a *nix chefdk path" do
131
- let(:script_path) { "/opt/chefdk/embedded/lib/ruby/gems/2.5.0/gems/chef-apply/startup.rb" }
132
- it "raises an UnsupportedInstallation error" do
133
- expect { subject.verify_not_in_chefdk }.to raise_error(ChefApply::Startup::UnsupportedInstallation)
134
- end
135
- end
136
- context "when chef-run has been loaded from a Windows chefdk path" do
137
- let(:script_path) { "C:\\chefdk\\embedded\\lib\\ruby\\gems\\2.5.0\\gems\\chef-apply\\startup.rb" }
138
- it "raises an UnsupportedInstallation error" do
139
- expect { subject.verify_not_in_chefdk }.to raise_error(ChefApply::Startup::UnsupportedInstallation)
140
- end
141
- end
142
-
143
- context "when chef-run has been loaded from anywhere else" do
144
- let(:script_path) { "/home/user1/dev/chef-apply" }
145
- it "runs without error" do
146
- subject.verify_not_in_chefdk
147
- end
148
- end
149
- end
150
-
151
- describe "#first_run_tasks" do
152
- let(:first_run_complete) { true }
153
- before do
154
- allow(Dir).to receive(:exist?).with(ChefApply::Config::WS_BASE_PATH).and_return first_run_complete
155
- end
156
-
157
- context "when first run has already occurred" do
158
- let(:first_run_complete) { true }
159
- it "returns without taking action" do
160
- expect(subject).to_not receive(:create_default_config)
161
- expect(subject).to_not receive(:setup_telemetry)
162
- subject.first_run_tasks
163
- end
164
- end
165
-
166
- context "when first run has not already occurred" do
167
- let(:first_run_complete) { false }
168
- it "Performs required first-run tasks" do
169
- expect(subject).to receive(:create_default_config)
170
- expect(subject).to receive(:setup_telemetry)
171
- subject.first_run_tasks
172
- end
173
- end
174
- end
175
-
176
- describe "#create_default_config" do
177
- it "touches the configuration file to create it and notifies that it has done so" do
178
- expected_config_path = ChefApply::Config.default_location
179
- expected_message = ChefApply::Text.cli.creating_config(expected_config_path)
180
- expect(ChefApply::UI::Terminal).to receive(:output)
181
- .with(expected_message)
182
- expect(ChefApply::UI::Terminal).to receive(:output)
183
- .with("")
184
- expect(FileUtils).to receive(:touch)
185
- .with(expected_config_path)
186
- subject.create_default_config
187
-
188
- end
189
- end
190
-
191
- describe "#setup_telemetry" do
192
- let(:mock_guid) { "1234" }
193
- it "sets up a telemetry installation id and notifies the operator that telemetry is enabled" do
194
- expect(SecureRandom).to receive(:uuid).and_return(mock_guid)
195
- expect(File).to receive(:write)
196
- .with(ChefApply::Config.telemetry_installation_identifier_file, mock_guid)
197
- subject.setup_telemetry
198
- end
199
- end
200
-
201
- describe "#start_telemeter_upload" do
202
- it "launches telemetry uploads" do
203
- expect(ChefApply::Telemeter::Sender).to receive(:start_upload_thread)
204
- subject.start_telemeter_upload
205
- end
206
- end
207
-
208
- describe "setup_workstation_user_directories" do
209
- it "creates the required chef-workstation directories in HOME" do
210
- expect(FileUtils).to receive(:mkdir_p).with(ChefApply::Config::WS_BASE_PATH)
211
- expect(FileUtils).to receive(:mkdir_p).with(ChefApply::Config.base_log_directory)
212
- expect(FileUtils).to receive(:mkdir_p).with(ChefApply::Config.telemetry_path)
213
- subject.setup_workstation_user_directories
214
- end
215
- end
216
-
217
- describe "#custom_config_path" do
218
- context "when a custom config path is not provided as an option" do
219
- let(:args) { [] }
220
- it "returns nil" do
221
- expect(subject.custom_config_path).to be_nil
222
- end
223
- end
224
-
225
- context "when a --config-path is provided" do
226
- context "but the actual path parameter is not provided" do
227
- let(:argv) { %w{--config-path} }
228
- it "raises ConfigPathNotProvided" do
229
- expect { subject.custom_config_path }.to raise_error(ChefApply::Startup::ConfigPathNotProvided)
230
- end
231
- end
232
-
233
- context "and the path is provided" do
234
- let(:path) { "/mock/file.toml" }
235
- let(:argv) { ["--config-path", path] }
236
-
237
- context "but the path is not a file" do
238
- before do
239
- allow(File).to receive(:file?).with(path).and_return false
240
- end
241
- it "raises an error ConfigPathInvalid" do
242
- expect { subject.custom_config_path }.to raise_error(ChefApply::Startup::ConfigPathInvalid)
243
- end
244
- end
245
-
246
- context "and the path exists and is a valid file" do
247
- before do
248
- allow(File).to receive(:file?).with(path).and_return true
249
- end
250
-
251
- context "but it is not readable" do
252
- before do
253
- allow(File).to receive(:readable?).with(path).and_return false
254
- end
255
- it "raises an error ConfigPathInvalid" do
256
- expect { subject.custom_config_path }.to raise_error(ChefApply::Startup::ConfigPathInvalid)
257
- end
258
- end
259
-
260
- context "and it is readable" do
261
- before do
262
- allow(File).to receive(:readable?).with(path).and_return true
263
- end
264
- it "returns the custom path" do
265
- expect(subject.custom_config_path).to eq path
266
- end
267
- end
268
- end
269
- end
270
- end
271
- end
272
-
273
- describe "#load_config" do
274
- context "when a custom configuraton path is provided" do
275
- let(:config_path) { nil }
276
- it "loads the config at the custom path" do
277
- expect(subject).to receive(:custom_config_path).and_return config_path
278
- expect(ChefApply::Config).to receive(:custom_location).with config_path
279
- expect(ChefApply::Config).to receive(:load)
280
- subject.load_config
281
- end
282
- let(:config_path) { "/tmp/workstation-mock-config.toml" }
283
- end
284
-
285
- context "when no custom configuration path is provided" do
286
- let(:config_path) { nil }
287
- it "loads it at the default configuration path" do
288
- expect(subject).to receive(:custom_config_path).and_return config_path
289
- expect(ChefApply::Config).not_to receive(:custom_location)
290
- expect(ChefApply::Config).to receive(:load)
291
- subject.load_config
292
- end
293
- end
294
-
295
- end
296
-
297
- describe "#setup_logging" do
298
- let(:log_path) { "/tmp/logs" }
299
- let(:log_level) { :debug }
300
- before do
301
- ChefApply::Config.log.location = log_path
302
- ChefApply::Config.log.level = log_level
303
- end
304
-
305
- it "sets up the logging for ChefApply and Chef" do
306
- expect(ChefApply::Log).to receive(:setup)
307
- .with(ChefApply::Config.log.location, log_level)
308
- expect(Chef::Log).to receive(:init).with(ChefApply::Log.stream)
309
- subject.setup_logging
310
- expect(ChefConfig.logger).to eq(ChefApply::Log)
311
- end
312
- end
313
-
314
- describe "#start_chef_apply" do
315
- let(:argv) { %w{some arguments} }
316
- it "runs ChefApply::CLI and passes along arguments it received" do
317
- run_double = instance_double(ChefApply::CLI)
318
- expect(ChefApply::CLI).to receive(:new).with(argv).and_return(run_double)
319
- expect(run_double).to receive(:run)
320
- subject.start_chef_apply
321
- end
322
- end
323
- end