chef-apply 0.4.6 → 0.4.9

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 (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