chef-apply 0.1.18 → 0.1.21
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/Gemfile.lock +31 -158
- data/lib/chef_apply/action/base.rb +3 -3
- data/lib/chef_apply/action/install_chef/base.rb +2 -44
- data/lib/chef_apply/log.rb +1 -1
- data/lib/chef_apply/minimum_chef_version.rb +79 -0
- data/lib/chef_apply/startup.rb +1 -1
- data/lib/chef_apply/version.rb +1 -1
- data/spec/unit/action/base_spec.rb +1 -1
- data/spec/unit/action/install_chef/base_spec.rb +4 -70
- data/spec/unit/minimum_chef_version_spec.rb +90 -0
- data/spec/unit/startup_spec.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8086d987312367597bbad62738f67c8b8595b44b62514e1b4e1c8526ef417c72
|
|
4
|
+
data.tar.gz: 9bab05e2fa8aeb213a120cb26bb8e822025f0a339cffced136dde7a38a8bc142
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b3e55c36d4fe20ae7e91a47332380d65fc70956c9d97d2edb602130c72889d91bad321faddd0316f26882b83e81a6edbd8fed62c1bc0333265bd9b984286279a
|
|
7
|
+
data.tar.gz: 3a07a9aa07e46c6aca8e49bab6b4e4e856173b9187c049f89154d411ea2f26da96d59d88604b0aab227527a3f80d5757527758cb409f4a0e4d3a77ab1a4edc5d
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
chef-apply (0.1.
|
|
4
|
+
chef-apply (0.1.21)
|
|
5
5
|
chef (>= 14.0)
|
|
6
6
|
chef-dk (>= 3.0)
|
|
7
7
|
chef-telemetry
|
|
@@ -21,16 +21,16 @@ GEM
|
|
|
21
21
|
addressable (2.5.2)
|
|
22
22
|
public_suffix (>= 2.0.2, < 4.0)
|
|
23
23
|
ast (2.4.0)
|
|
24
|
-
aws-sdk (2.11.
|
|
25
|
-
aws-sdk-resources (= 2.11.
|
|
26
|
-
aws-sdk-core (2.11.
|
|
24
|
+
aws-sdk (2.11.104)
|
|
25
|
+
aws-sdk-resources (= 2.11.104)
|
|
26
|
+
aws-sdk-core (2.11.104)
|
|
27
27
|
aws-sigv4 (~> 1.0)
|
|
28
28
|
jmespath (~> 1.0)
|
|
29
|
-
aws-sdk-resources (2.11.
|
|
30
|
-
aws-sdk-core (= 2.11.
|
|
29
|
+
aws-sdk-resources (2.11.104)
|
|
30
|
+
aws-sdk-core (= 2.11.104)
|
|
31
31
|
aws-sigv4 (1.0.3)
|
|
32
|
-
azure_mgmt_resources (0.
|
|
33
|
-
ms_rest_azure (~> 0.
|
|
32
|
+
azure_mgmt_resources (0.17.0)
|
|
33
|
+
ms_rest_azure (~> 0.11.0)
|
|
34
34
|
binding_of_caller (0.8.0)
|
|
35
35
|
debug_inspector (>= 0.0.1)
|
|
36
36
|
builder (3.2.3)
|
|
@@ -119,7 +119,6 @@ GEM
|
|
|
119
119
|
declarative (0.0.10)
|
|
120
120
|
declarative-option (0.1.0)
|
|
121
121
|
diff-lcs (1.3)
|
|
122
|
-
digest-crc (0.4.1)
|
|
123
122
|
docile (1.3.1)
|
|
124
123
|
docker-api (1.34.2)
|
|
125
124
|
excon (>= 0.47.0)
|
|
@@ -145,134 +144,13 @@ GEM
|
|
|
145
144
|
mime-types (~> 3.0)
|
|
146
145
|
representable (~> 3.0)
|
|
147
146
|
retriable (>= 2.0, < 4.0)
|
|
148
|
-
|
|
149
|
-
google-cloud-bigquery (~> 1.1)
|
|
150
|
-
google-cloud-bigquery-data_transfer (~> 0.1)
|
|
151
|
-
google-cloud-container (~> 0.1)
|
|
152
|
-
google-cloud-dataproc (~> 0.1)
|
|
153
|
-
google-cloud-datastore (~> 1.4)
|
|
154
|
-
google-cloud-dlp (~> 0.1)
|
|
155
|
-
google-cloud-dns (~> 0.28)
|
|
156
|
-
google-cloud-error_reporting (~> 0.30)
|
|
157
|
-
google-cloud-firestore (~> 0.21)
|
|
158
|
-
google-cloud-language (~> 0.30)
|
|
159
|
-
google-cloud-logging (~> 1.5)
|
|
160
|
-
google-cloud-monitoring (~> 0.27)
|
|
161
|
-
google-cloud-os_login (~> 0.1)
|
|
162
|
-
google-cloud-pubsub (~> 0.30)
|
|
163
|
-
google-cloud-resource_manager (~> 0.29)
|
|
164
|
-
google-cloud-spanner (~> 1.3)
|
|
165
|
-
google-cloud-speech (~> 0.29)
|
|
166
|
-
google-cloud-storage (~> 1.10)
|
|
167
|
-
google-cloud-trace (~> 0.31)
|
|
168
|
-
google-cloud-translate (~> 1.2)
|
|
169
|
-
google-cloud-video_intelligence (~> 1.0)
|
|
170
|
-
google-cloud-vision (~> 0.28)
|
|
171
|
-
google-cloud-bigquery (1.5.0)
|
|
172
|
-
concurrent-ruby (~> 1.0)
|
|
173
|
-
google-api-client (~> 0.19.8)
|
|
174
|
-
google-cloud-core (~> 1.2)
|
|
175
|
-
googleauth (~> 0.6.2)
|
|
176
|
-
google-cloud-bigquery-data_transfer (0.1.0)
|
|
177
|
-
google-gax (~> 1.0)
|
|
178
|
-
google-cloud-container (0.1.0)
|
|
179
|
-
google-gax (~> 1.0.1)
|
|
180
|
-
google-cloud-core (1.2.2)
|
|
181
|
-
google-cloud-env (~> 1.0)
|
|
182
|
-
google-cloud-dataproc (0.1.0)
|
|
183
|
-
google-gax (~> 1.0.0)
|
|
184
|
-
google-cloud-datastore (1.4.0)
|
|
185
|
-
google-cloud-core (~> 1.2)
|
|
186
|
-
google-gax (~> 1.0)
|
|
187
|
-
google-protobuf (~> 3.3)
|
|
188
|
-
google-cloud-dlp (0.4.0)
|
|
189
|
-
google-gax (~> 1.0)
|
|
190
|
-
google-cloud-dns (0.28.0)
|
|
191
|
-
google-api-client (~> 0.19.0)
|
|
192
|
-
google-cloud-core (~> 1.2)
|
|
193
|
-
googleauth (~> 0.6.2)
|
|
194
|
-
zonefile (~> 1.04)
|
|
195
|
-
google-cloud-env (1.0.2)
|
|
196
|
-
faraday (~> 0.11)
|
|
197
|
-
google-cloud-error_reporting (0.30.1)
|
|
198
|
-
google-cloud-core (~> 1.2)
|
|
199
|
-
google-gax (~> 1.0)
|
|
200
|
-
stackdriver-core (~> 1.3)
|
|
201
|
-
google-cloud-firestore (0.22.0)
|
|
202
|
-
concurrent-ruby (~> 1.0)
|
|
203
|
-
google-cloud-core (~> 1.2)
|
|
204
|
-
google-gax (~> 1.0)
|
|
205
|
-
google-cloud-language (0.30.0)
|
|
206
|
-
google-gax (~> 1.0)
|
|
207
|
-
google-cloud-logging (1.5.1)
|
|
208
|
-
google-cloud-core (~> 1.2)
|
|
209
|
-
google-gax (~> 1.0)
|
|
210
|
-
stackdriver-core (~> 1.3)
|
|
211
|
-
google-cloud-monitoring (0.28.0)
|
|
212
|
-
google-gax (~> 1.0)
|
|
213
|
-
google-cloud-os_login (0.1.0)
|
|
214
|
-
google-gax (~> 1.0.0)
|
|
215
|
-
google-cloud-pubsub (0.31.0)
|
|
216
|
-
concurrent-ruby (~> 1.0)
|
|
217
|
-
google-cloud-core (~> 1.2)
|
|
218
|
-
google-gax (~> 1.0)
|
|
219
|
-
grpc-google-iam-v1 (~> 0.6.9)
|
|
220
|
-
google-cloud-resource_manager (0.29.0)
|
|
221
|
-
google-api-client (~> 0.19.8)
|
|
222
|
-
google-cloud-core (~> 1.2)
|
|
223
|
-
googleauth (~> 0.6.2)
|
|
224
|
-
google-cloud-spanner (1.6.0)
|
|
225
|
-
concurrent-ruby (~> 1.0)
|
|
226
|
-
google-cloud-core (~> 1.2)
|
|
227
|
-
google-gax (~> 1.0)
|
|
228
|
-
grpc-google-iam-v1 (~> 0.6.9)
|
|
229
|
-
google-cloud-speech (0.30.0)
|
|
230
|
-
google-gax (~> 1.0)
|
|
231
|
-
google-cloud-storage (1.12.0)
|
|
232
|
-
digest-crc (~> 0.4)
|
|
233
|
-
google-api-client (~> 0.19.0)
|
|
234
|
-
google-cloud-core (~> 1.2)
|
|
235
|
-
googleauth (~> 0.6.2)
|
|
236
|
-
google-cloud-trace (0.33.1)
|
|
237
|
-
google-cloud-core (~> 1.2)
|
|
238
|
-
google-gax (~> 1.0)
|
|
239
|
-
stackdriver-core (~> 1.3)
|
|
240
|
-
google-cloud-translate (1.2.0)
|
|
241
|
-
faraday (~> 0.13)
|
|
242
|
-
google-cloud-core (~> 1.2)
|
|
243
|
-
googleauth (~> 0.6.2)
|
|
244
|
-
google-cloud-video_intelligence (1.0.0)
|
|
245
|
-
google-gax (~> 1.0)
|
|
246
|
-
google-cloud-vision (0.29.0)
|
|
247
|
-
google-cloud-core (~> 1.2)
|
|
248
|
-
google-gax (~> 1.0)
|
|
249
|
-
google-gax (1.0.1)
|
|
250
|
-
google-protobuf (~> 3.2)
|
|
251
|
-
googleapis-common-protos (>= 1.3.5, < 2.0)
|
|
252
|
-
googleauth (~> 0.6.2)
|
|
253
|
-
grpc (>= 1.7.2, < 2.0)
|
|
254
|
-
rly (~> 0.2.3)
|
|
255
|
-
google-protobuf (3.6.0)
|
|
256
|
-
googleapis-common-protos (1.3.7)
|
|
257
|
-
google-protobuf (~> 3.0)
|
|
258
|
-
googleapis-common-protos-types (~> 1.0)
|
|
259
|
-
grpc (~> 1.0)
|
|
260
|
-
googleapis-common-protos-types (1.0.1)
|
|
261
|
-
google-protobuf (~> 3.0)
|
|
262
|
-
googleauth (0.6.2)
|
|
147
|
+
googleauth (0.6.4)
|
|
263
148
|
faraday (~> 0.12)
|
|
264
149
|
jwt (>= 1.4, < 3.0)
|
|
265
|
-
logging (~> 2.0)
|
|
266
150
|
memoist (~> 0.12)
|
|
267
151
|
multi_json (~> 1.11)
|
|
268
|
-
os (
|
|
152
|
+
os (>= 0.9, < 2.0)
|
|
269
153
|
signet (~> 0.7)
|
|
270
|
-
grpc (1.13.0)
|
|
271
|
-
google-protobuf (~> 3.1)
|
|
272
|
-
googleapis-common-protos-types (~> 1.0.0)
|
|
273
|
-
grpc-google-iam-v1 (0.6.9)
|
|
274
|
-
googleapis-common-protos (>= 1.3.1, < 2.0)
|
|
275
|
-
grpc (~> 1.0)
|
|
276
154
|
gssapi (1.2.0)
|
|
277
155
|
ffi (>= 1.0.1)
|
|
278
156
|
gyoku (1.3.1)
|
|
@@ -307,25 +185,25 @@ GEM
|
|
|
307
185
|
mime-types-data (~> 3.2015)
|
|
308
186
|
mime-types-data (3.2016.0521)
|
|
309
187
|
minitar (0.6.1)
|
|
310
|
-
mixlib-archive (0.4.
|
|
188
|
+
mixlib-archive (0.4.13)
|
|
311
189
|
mixlib-log
|
|
312
190
|
mixlib-authentication (2.1.1)
|
|
313
191
|
mixlib-cli (1.7.0)
|
|
314
192
|
mixlib-config (2.2.13)
|
|
315
193
|
tomlrb
|
|
316
|
-
mixlib-install (3.11.
|
|
194
|
+
mixlib-install (3.11.5)
|
|
317
195
|
mixlib-shellout
|
|
318
196
|
mixlib-versioning
|
|
319
197
|
thor
|
|
320
198
|
mixlib-log (2.0.4)
|
|
321
199
|
mixlib-shellout (2.4.0)
|
|
322
200
|
mixlib-versioning (1.2.2)
|
|
323
|
-
molinillo (0.6.
|
|
201
|
+
molinillo (0.6.6)
|
|
324
202
|
ms_rest (0.7.2)
|
|
325
203
|
concurrent-ruby (~> 1.0)
|
|
326
204
|
faraday (~> 0.9)
|
|
327
205
|
timeliness (~> 0.3)
|
|
328
|
-
ms_rest_azure (0.
|
|
206
|
+
ms_rest_azure (0.11.0)
|
|
329
207
|
concurrent-ruby (~> 1.0)
|
|
330
208
|
faraday (~> 0.9)
|
|
331
209
|
faraday-cookie_jar (~> 0.0.6)
|
|
@@ -344,19 +222,19 @@ GEM
|
|
|
344
222
|
net-ssh-gateway (>= 1.2.0)
|
|
345
223
|
net-telnet (0.2.0)
|
|
346
224
|
nori (2.6.0)
|
|
347
|
-
ohai (14.
|
|
225
|
+
ohai (14.4.0)
|
|
348
226
|
chef-config (>= 12.8, < 15)
|
|
349
227
|
ffi (~> 1.9)
|
|
350
228
|
ffi-yajl (~> 2.2)
|
|
351
229
|
ipaddress
|
|
352
|
-
mixlib-cli
|
|
230
|
+
mixlib-cli (>= 1.7.0)
|
|
353
231
|
mixlib-config (~> 2.0)
|
|
354
232
|
mixlib-log (~> 2.0, >= 2.0.1)
|
|
355
233
|
mixlib-shellout (~> 2.0)
|
|
356
234
|
plist (~> 3.1)
|
|
357
235
|
systemu (~> 2.6.4)
|
|
358
236
|
wmi-lite (~> 1.0)
|
|
359
|
-
os (0.
|
|
237
|
+
os (1.0.0)
|
|
360
238
|
paint (1.0.1)
|
|
361
239
|
parallel (1.12.1)
|
|
362
240
|
parser (2.5.1.2)
|
|
@@ -388,23 +266,22 @@ GEM
|
|
|
388
266
|
declarative-option (< 0.2.0)
|
|
389
267
|
uber (< 0.2.0)
|
|
390
268
|
retriable (3.1.2)
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
rspec-
|
|
394
|
-
rspec-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
rspec-expectations (3.7.0)
|
|
269
|
+
rspec (3.8.0)
|
|
270
|
+
rspec-core (~> 3.8.0)
|
|
271
|
+
rspec-expectations (~> 3.8.0)
|
|
272
|
+
rspec-mocks (~> 3.8.0)
|
|
273
|
+
rspec-core (3.8.0)
|
|
274
|
+
rspec-support (~> 3.8.0)
|
|
275
|
+
rspec-expectations (3.8.1)
|
|
399
276
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
400
|
-
rspec-support (~> 3.
|
|
277
|
+
rspec-support (~> 3.8.0)
|
|
401
278
|
rspec-its (1.2.0)
|
|
402
279
|
rspec-core (>= 3.0.0)
|
|
403
280
|
rspec-expectations (>= 3.0.0)
|
|
404
|
-
rspec-mocks (3.
|
|
281
|
+
rspec-mocks (3.8.0)
|
|
405
282
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
406
|
-
rspec-support (~> 3.
|
|
407
|
-
rspec-support (3.
|
|
283
|
+
rspec-support (~> 3.8.0)
|
|
284
|
+
rspec-support (3.8.0)
|
|
408
285
|
rspec_junit_formatter (0.2.3)
|
|
409
286
|
builder (< 4)
|
|
410
287
|
rspec-core (>= 2, < 4, != 2.12.0)
|
|
@@ -438,13 +315,11 @@ GEM
|
|
|
438
315
|
solve (4.0.0)
|
|
439
316
|
molinillo (~> 0.6)
|
|
440
317
|
semverse (>= 1.1, < 3.0)
|
|
441
|
-
specinfra (2.75.
|
|
318
|
+
specinfra (2.75.1)
|
|
442
319
|
net-scp
|
|
443
320
|
net-ssh (>= 2.7)
|
|
444
321
|
net-telnet
|
|
445
322
|
sfl
|
|
446
|
-
stackdriver-core (1.3.0)
|
|
447
|
-
google-cloud-core (~> 1.2)
|
|
448
323
|
syslog-logger (1.6.8)
|
|
449
324
|
systemu (2.6.5)
|
|
450
325
|
thor (0.20.0)
|
|
@@ -452,12 +327,11 @@ GEM
|
|
|
452
327
|
toml-rb (1.1.1)
|
|
453
328
|
citrus (~> 3.0, > 3.0)
|
|
454
329
|
tomlrb (1.2.7)
|
|
455
|
-
train (1.4.
|
|
330
|
+
train (1.4.25)
|
|
456
331
|
aws-sdk (~> 2)
|
|
457
332
|
azure_mgmt_resources (~> 0.15)
|
|
458
333
|
docker-api (~> 1.26)
|
|
459
334
|
google-api-client (~> 0.19.8)
|
|
460
|
-
google-cloud (~> 0.51.1)
|
|
461
335
|
googleauth (~> 0.6.2)
|
|
462
336
|
inifile
|
|
463
337
|
json (>= 1.8, < 3.0)
|
|
@@ -494,7 +368,6 @@ GEM
|
|
|
494
368
|
rubyzip (~> 1.1)
|
|
495
369
|
winrm (~> 2.0)
|
|
496
370
|
wmi-lite (1.0.0)
|
|
497
|
-
zonefile (1.06)
|
|
498
371
|
|
|
499
372
|
PLATFORMS
|
|
500
373
|
ruby
|
|
@@ -512,4 +385,4 @@ DEPENDENCIES
|
|
|
512
385
|
simplecov
|
|
513
386
|
|
|
514
387
|
BUNDLED WITH
|
|
515
|
-
1.16.
|
|
388
|
+
1.16.3
|
|
@@ -88,19 +88,19 @@ module ChefApply
|
|
|
88
88
|
# Chef 13 on Linux requires full path specifiers for --config and --recipe-url while on Chef 13 and 14 on
|
|
89
89
|
# Windows must use relative specifiers to prevent URI from causing an error
|
|
90
90
|
# (https://github.com/chef/chef/pull/7223/files).
|
|
91
|
-
def run_chef(working_dir,
|
|
91
|
+
def run_chef(working_dir, config_file, policy)
|
|
92
92
|
case family
|
|
93
93
|
when :windows
|
|
94
94
|
"Set-Location -Path #{working_dir}; " +
|
|
95
95
|
# We must 'wait' for chef-client to finish before changing directories and Out-Null does that
|
|
96
|
-
"chef-client -z --config #{
|
|
96
|
+
"chef-client -z --config #{File.join(working_dir, config_file)} --recipe-url #{File.join(working_dir, policy)} | Out-Null; " +
|
|
97
97
|
# We have to leave working dir so we don't hold a lock on it, which allows us to delete this tempdir later
|
|
98
98
|
"Set-Location C:/; " +
|
|
99
99
|
"exit $LASTEXITCODE"
|
|
100
100
|
else
|
|
101
101
|
# cd is shell a builtin, so much call bash. This also means all commands are executed
|
|
102
102
|
# with sudo (as long as we are hardcoding our sudo use)
|
|
103
|
-
"bash -c 'cd #{working_dir}; chef-client -z --config #{File.join(working_dir,
|
|
103
|
+
"bash -c 'cd #{working_dir}; chef-client -z --config #{File.join(working_dir, config_file)} --recipe-url #{File.join(working_dir, policy)}'"
|
|
104
104
|
end
|
|
105
105
|
end
|
|
106
106
|
|
|
@@ -16,15 +16,14 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
require "chef_apply/action/base"
|
|
19
|
+
require "chef_apply/minimum_chef_version"
|
|
19
20
|
require "fileutils"
|
|
20
21
|
|
|
21
22
|
module ChefApply::Action::InstallChef
|
|
22
23
|
class Base < ChefApply::Action::Base
|
|
23
|
-
MIN_14_VERSION = Gem::Version.new("14.1.1")
|
|
24
|
-
MIN_13_VERSION = Gem::Version.new("13.10.0")
|
|
25
24
|
|
|
26
25
|
def perform_action
|
|
27
|
-
if
|
|
26
|
+
if ChefApply::MinimumChefVersion.check!(target_host, config[:check_only]) == :minimum_version_met
|
|
28
27
|
notify(:already_installed)
|
|
29
28
|
else
|
|
30
29
|
perform_local_install
|
|
@@ -107,31 +106,6 @@ module ChefApply::Action::InstallChef
|
|
|
107
106
|
remote_path
|
|
108
107
|
end
|
|
109
108
|
|
|
110
|
-
def check_minimum_chef_version!(target)
|
|
111
|
-
begin
|
|
112
|
-
installed_version = target.installed_chef_version
|
|
113
|
-
rescue ChefApply::TargetHost::ChefNotInstalled
|
|
114
|
-
if config[:check_only]
|
|
115
|
-
raise ClientNotInstalled.new()
|
|
116
|
-
end
|
|
117
|
-
return :client_not_installed
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
case
|
|
121
|
-
when installed_version >= Gem::Version.new("14.0.0") && installed_version < MIN_14_VERSION
|
|
122
|
-
raise Client14Outdated.new(installed_version, MIN_14_VERSION)
|
|
123
|
-
when installed_version >= Gem::Version.new("13.0.0") && installed_version < MIN_13_VERSION
|
|
124
|
-
raise Client13Outdated.new(installed_version, MIN_13_VERSION, MIN_14_VERSION)
|
|
125
|
-
when installed_version < Gem::Version.new("13.0.0")
|
|
126
|
-
# If they have Chef < 13.0.0 installed we want to show them the easiest upgrade path -
|
|
127
|
-
# Chef 13 first and then Chef 14 since most customers cannot make the leap directly
|
|
128
|
-
# to 14.
|
|
129
|
-
raise Client13Outdated.new(installed_version, MIN_13_VERSION, MIN_14_VERSION)
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
:minimum_version_met
|
|
133
|
-
end
|
|
134
|
-
|
|
135
109
|
def setup_remote_temp_path
|
|
136
110
|
raise NotImplementedError
|
|
137
111
|
end
|
|
@@ -140,20 +114,4 @@ module ChefApply::Action::InstallChef
|
|
|
140
114
|
raise NotImplementedError
|
|
141
115
|
end
|
|
142
116
|
end
|
|
143
|
-
|
|
144
|
-
class ClientNotInstalled < ChefApply::ErrorNoLogs
|
|
145
|
-
def initialize(); super("CHEFINS002"); end
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
class Client13Outdated < ChefApply::ErrorNoLogs
|
|
149
|
-
def initialize(current_version, min_13_version, min_14_version)
|
|
150
|
-
super("CHEFINS003", current_version, min_13_version, min_14_version)
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
class Client14Outdated < ChefApply::ErrorNoLogs
|
|
155
|
-
def initialize(current_version, target_version)
|
|
156
|
-
super("CHEFINS004", current_version, target_version)
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
117
|
end
|
data/lib/chef_apply/log.rb
CHANGED
|
@@ -22,7 +22,6 @@ module ChefApply
|
|
|
22
22
|
extend Mixlib::Log
|
|
23
23
|
|
|
24
24
|
def self.setup(location, log_level)
|
|
25
|
-
@location = location
|
|
26
25
|
if location.is_a?(String)
|
|
27
26
|
if location.casecmp("stdout") == 0
|
|
28
27
|
location = $stdout
|
|
@@ -30,6 +29,7 @@ module ChefApply
|
|
|
30
29
|
location = File.open(location, "w+")
|
|
31
30
|
end
|
|
32
31
|
end
|
|
32
|
+
@location = location
|
|
33
33
|
init(location)
|
|
34
34
|
Log.level = log_level
|
|
35
35
|
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2017 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/error"
|
|
19
|
+
|
|
20
|
+
module ChefApply
|
|
21
|
+
class MinimumChefVersion
|
|
22
|
+
|
|
23
|
+
CONSTRAINTS = {
|
|
24
|
+
windows: {
|
|
25
|
+
13 => Gem::Version.new("13.10.4"),
|
|
26
|
+
14 => Gem::Version.new("14.4.22")
|
|
27
|
+
},
|
|
28
|
+
linux: {
|
|
29
|
+
13 => Gem::Version.new("13.10.4"),
|
|
30
|
+
14 => Gem::Version.new("14.1.1")
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
def self.check!(target, check_only)
|
|
35
|
+
begin
|
|
36
|
+
installed_version = target.installed_chef_version
|
|
37
|
+
rescue ChefApply::TargetHost::ChefNotInstalled
|
|
38
|
+
if check_only
|
|
39
|
+
raise ClientNotInstalled.new()
|
|
40
|
+
end
|
|
41
|
+
return :client_not_installed
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
os_constraints = CONSTRAINTS[target.base_os]
|
|
45
|
+
min_14_version = os_constraints[14]
|
|
46
|
+
min_13_version = os_constraints[13]
|
|
47
|
+
|
|
48
|
+
case
|
|
49
|
+
when installed_version >= Gem::Version.new("14.0.0") && installed_version < min_14_version
|
|
50
|
+
raise Client14Outdated.new(installed_version, min_14_version)
|
|
51
|
+
when installed_version >= Gem::Version.new("13.0.0") && installed_version < min_13_version
|
|
52
|
+
raise Client13Outdated.new(installed_version, min_13_version, min_14_version)
|
|
53
|
+
when installed_version < Gem::Version.new("13.0.0")
|
|
54
|
+
# If they have Chef < 13.0.0 installed we want to show them the easiest upgrade path -
|
|
55
|
+
# Chef 13 first and then Chef 14 since most customers cannot make the leap directly
|
|
56
|
+
# to 14.
|
|
57
|
+
raise Client13Outdated.new(installed_version, min_13_version, min_14_version)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
:minimum_version_met
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class ClientNotInstalled < ChefApply::ErrorNoLogs
|
|
64
|
+
def initialize(); super("CHEFINS002"); end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
class Client13Outdated < ChefApply::ErrorNoLogs
|
|
68
|
+
def initialize(current_version, min_13_version, min_14_version)
|
|
69
|
+
super("CHEFINS003", current_version, min_13_version, min_14_version)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
class Client14Outdated < ChefApply::ErrorNoLogs
|
|
74
|
+
def initialize(current_version, target_version)
|
|
75
|
+
super("CHEFINS004", current_version, target_version)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
data/lib/chef_apply/startup.rb
CHANGED
|
@@ -165,7 +165,7 @@ module ChefApply
|
|
|
165
165
|
ChefConfig.logger = ChefApply::Log
|
|
166
166
|
# Setting the config isn't enough, we need to ensure the logger is initialized
|
|
167
167
|
# or automatic initialization will still go to stdout
|
|
168
|
-
Chef::Log.init(ChefApply::Log)
|
|
168
|
+
Chef::Log.init(ChefApply::Log.location)
|
|
169
169
|
Chef::Log.level = ChefApply::Log.level
|
|
170
170
|
end
|
|
171
171
|
|
data/lib/chef_apply/version.rb
CHANGED
|
@@ -70,7 +70,7 @@ RSpec.describe ChefApply::Action::Base do
|
|
|
70
70
|
it "correctly returns chef run string" do
|
|
71
71
|
expect(action.run_chef("a", "b", "c")).to eq(
|
|
72
72
|
"Set-Location -Path a; " \
|
|
73
|
-
"chef-client -z --config b --recipe-url c | Out-Null; " \
|
|
73
|
+
"chef-client -z --config #{File.join("a", "b")} --recipe-url #{File.join("a", "c")} | Out-Null; " \
|
|
74
74
|
"Set-Location C:/; " \
|
|
75
75
|
"exit $LASTEXITCODE"
|
|
76
76
|
)
|
|
@@ -41,7 +41,8 @@ RSpec.describe ChefApply::Action::InstallChef::Base do
|
|
|
41
41
|
|
|
42
42
|
subject(:install) do
|
|
43
43
|
ChefApply::Action::InstallChef::Base.new(target_host: target_host,
|
|
44
|
-
reporter: reporter
|
|
44
|
+
reporter: reporter,
|
|
45
|
+
check_only: false) end
|
|
45
46
|
before do
|
|
46
47
|
target_host.connect!
|
|
47
48
|
target_host.backend.mock_os(mock_opts)
|
|
@@ -50,7 +51,7 @@ RSpec.describe ChefApply::Action::InstallChef::Base do
|
|
|
50
51
|
context "#perform_action" do
|
|
51
52
|
context "when chef is already installed on target" do
|
|
52
53
|
it "notifies of success and takes no further action" do
|
|
53
|
-
expect(
|
|
54
|
+
expect(ChefApply::MinimumChefVersion).to receive(:check!).with(install.target_host, false)
|
|
54
55
|
.and_return(:minimum_version_met)
|
|
55
56
|
expect(install).not_to receive(:perform_local_install)
|
|
56
57
|
install.perform_action
|
|
@@ -59,7 +60,7 @@ RSpec.describe ChefApply::Action::InstallChef::Base do
|
|
|
59
60
|
|
|
60
61
|
context "when chef is not already installed on target" do
|
|
61
62
|
it "should invoke perform_local_install" do
|
|
62
|
-
expect(
|
|
63
|
+
expect(ChefApply::MinimumChefVersion).to receive(:check!).with(install.target_host, false)
|
|
63
64
|
.and_return(:client_not_installed)
|
|
64
65
|
expect(install).to receive(:perform_local_install)
|
|
65
66
|
install.perform_action
|
|
@@ -164,71 +165,4 @@ RSpec.describe ChefApply::Action::InstallChef::Base do
|
|
|
164
165
|
end
|
|
165
166
|
end
|
|
166
167
|
end
|
|
167
|
-
|
|
168
|
-
context "#check_minimum_chef_version!" do
|
|
169
|
-
let(:target) { install.target_host }
|
|
170
|
-
context "when chef is not already installed on target" do
|
|
171
|
-
before do
|
|
172
|
-
expect(target).to receive(:installed_chef_version).
|
|
173
|
-
and_raise ChefApply::TargetHost::ChefNotInstalled.new
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
it "should return :client_not_installed" do
|
|
177
|
-
actual = install.check_minimum_chef_version!(target)
|
|
178
|
-
expect(:client_not_installed).to eq(actual)
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
context "when config is set to check_only" do
|
|
182
|
-
after do
|
|
183
|
-
install.config.clear
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
it "raises ClientNotInstalled" do
|
|
187
|
-
install.config[:check_only] = true
|
|
188
|
-
expect do
|
|
189
|
-
install.check_minimum_chef_version!(target)
|
|
190
|
-
end.to raise_error(ChefApply::Action::InstallChef::ClientNotInstalled)
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
min_14_version = ChefApply::Action::InstallChef::Base::MIN_14_VERSION
|
|
196
|
-
min_13_version = ChefApply::Action::InstallChef::Base::MIN_13_VERSION
|
|
197
|
-
context "when chef is already installed on target at the correct minimum Chef 14 version" do
|
|
198
|
-
before do
|
|
199
|
-
expect(target).to receive(:installed_chef_version).and_return min_14_version
|
|
200
|
-
end
|
|
201
|
-
it "should return :minimum_version_met" do
|
|
202
|
-
actual = install.check_minimum_chef_version!(target)
|
|
203
|
-
expect(:minimum_version_met).to eq(actual)
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
context "when chef is already installed on target at the correct minimum Chef 13 version" do
|
|
208
|
-
before do
|
|
209
|
-
expect(target).to receive(:installed_chef_version).and_return min_13_version
|
|
210
|
-
end
|
|
211
|
-
it "should return :minimum_version_met" do
|
|
212
|
-
actual = install.check_minimum_chef_version!(target)
|
|
213
|
-
expect(:minimum_version_met).to eq(actual)
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
installed_expected = {
|
|
218
|
-
Gem::Version.new("12.1.1") => ChefApply::Action::InstallChef::Client13Outdated,
|
|
219
|
-
Gem::Version.new("13.9.0") => ChefApply::Action::InstallChef::Client13Outdated,
|
|
220
|
-
Gem::Version.new("14.1.0") => ChefApply::Action::InstallChef::Client14Outdated,
|
|
221
|
-
}
|
|
222
|
-
installed_expected.each do |installed, expected|
|
|
223
|
-
context "when chef is already installed on target at version #{installed}" do
|
|
224
|
-
before do
|
|
225
|
-
expect(target).to receive(:installed_chef_version).
|
|
226
|
-
and_return installed
|
|
227
|
-
end
|
|
228
|
-
it "notifies of failure and takes no further action" do
|
|
229
|
-
expect { install.check_minimum_chef_version!(target) }.to raise_error(expected)
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
|
-
end
|
|
234
168
|
end
|
|
@@ -0,0 +1,90 @@
|
|
|
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/minimum_chef_version"
|
|
19
|
+
require "chef_apply/target_host"
|
|
20
|
+
require "spec_helper"
|
|
21
|
+
|
|
22
|
+
RSpec.describe ChefApply::MinimumChefVersion do
|
|
23
|
+
let(:base_os) { :linux }
|
|
24
|
+
let(:version) { 14 }
|
|
25
|
+
let(:target) { instance_double(ChefApply::TargetHost, base_os: base_os, installed_chef_version: version) }
|
|
26
|
+
subject(:klass) { ChefApply::MinimumChefVersion }
|
|
27
|
+
|
|
28
|
+
context "#check!" do
|
|
29
|
+
context "when chef is not already installed on target" do
|
|
30
|
+
before do
|
|
31
|
+
expect(target).to receive(:installed_chef_version).
|
|
32
|
+
and_raise ChefApply::TargetHost::ChefNotInstalled.new
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should return :client_not_installed" do
|
|
36
|
+
actual = klass.check!(target, false)
|
|
37
|
+
expect(:client_not_installed).to eq(actual)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context "when config is set to check_only" do
|
|
41
|
+
it "raises ClientNotInstalled" do
|
|
42
|
+
expect do
|
|
43
|
+
klass.check!(target, true)
|
|
44
|
+
end.to raise_error(ChefApply::MinimumChefVersion::ClientNotInstalled)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
[:windows, :linux].each do |os|
|
|
50
|
+
context "on #{os}" do
|
|
51
|
+
let(:base_os) { os }
|
|
52
|
+
[13, 14].each do |major_version|
|
|
53
|
+
context "when chef is already installed at the correct minimum Chef #{major_version} version" do
|
|
54
|
+
let(:version) { ChefApply::MinimumChefVersion::CONSTRAINTS[os][major_version] }
|
|
55
|
+
it "should return :minimum_version_met" do
|
|
56
|
+
actual = klass.check!(target, false)
|
|
57
|
+
expect(:minimum_version_met).to eq(actual)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
installed_expected = {
|
|
65
|
+
windows: {
|
|
66
|
+
Gem::Version.new("12.1.1") => ChefApply::MinimumChefVersion::Client13Outdated,
|
|
67
|
+
Gem::Version.new("13.9.0") => ChefApply::MinimumChefVersion::Client13Outdated,
|
|
68
|
+
Gem::Version.new("14.3.37") => ChefApply::MinimumChefVersion::Client14Outdated,
|
|
69
|
+
},
|
|
70
|
+
linux: {
|
|
71
|
+
Gem::Version.new("12.1.1") => ChefApply::MinimumChefVersion::Client13Outdated,
|
|
72
|
+
Gem::Version.new("13.9.0") => ChefApply::MinimumChefVersion::Client13Outdated,
|
|
73
|
+
Gem::Version.new("14.1.0") => ChefApply::MinimumChefVersion::Client14Outdated,
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
[:windows, :linux].each do |os|
|
|
77
|
+
context "on #{os}" do
|
|
78
|
+
let(:base_os) { os }
|
|
79
|
+
installed_expected[os].each do |installed, expected|
|
|
80
|
+
context "when chef is already installed on target at version #{installed}" do
|
|
81
|
+
let(:version) { installed }
|
|
82
|
+
it "notifies of failure and takes no further action" do
|
|
83
|
+
expect { klass.check!(target, false) }.to raise_error(expected)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
data/spec/unit/startup_spec.rb
CHANGED
|
@@ -265,7 +265,7 @@ RSpec.describe ChefApply::Startup do
|
|
|
265
265
|
expect(ChefApply::Log).to receive(:setup).
|
|
266
266
|
with(log_path, log_level)
|
|
267
267
|
expect(Chef::Log).to receive(:init).
|
|
268
|
-
with(ChefApply::Log)
|
|
268
|
+
with(ChefApply::Log.location)
|
|
269
269
|
subject.setup_logging
|
|
270
270
|
expect(ChefConfig.logger).to eq(ChefApply::Log)
|
|
271
271
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: chef-apply
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.21
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chef Software, Inc
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-
|
|
11
|
+
date: 2018-08-09 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: mixlib-cli
|
|
@@ -341,6 +341,7 @@ files:
|
|
|
341
341
|
- lib/chef_apply/errors/standard_error_resolver.rb
|
|
342
342
|
- lib/chef_apply/file_fetcher.rb
|
|
343
343
|
- lib/chef_apply/log.rb
|
|
344
|
+
- lib/chef_apply/minimum_chef_version.rb
|
|
344
345
|
- lib/chef_apply/recipe_lookup.rb
|
|
345
346
|
- lib/chef_apply/startup.rb
|
|
346
347
|
- lib/chef_apply/status_reporter.rb
|
|
@@ -377,6 +378,7 @@ files:
|
|
|
377
378
|
- spec/unit/file_fetcher_spec.rb
|
|
378
379
|
- spec/unit/fixtures/multi-error.out
|
|
379
380
|
- spec/unit/log_spec.rb
|
|
381
|
+
- spec/unit/minimum_chef_version_spec.rb
|
|
380
382
|
- spec/unit/recipe_lookup_spec.rb
|
|
381
383
|
- spec/unit/startup_spec.rb
|
|
382
384
|
- spec/unit/target_host_spec.rb
|