knife-essentials 0.9.2 → 0.9.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.
- data/lib/chef/knife/raw_essentials.rb +3 -61
- data/lib/chef_fs/data_handler/data_handler_base.rb +2 -1
- data/lib/chef_fs/file_system/base_fs_object.rb +75 -1
- data/lib/chef_fs/file_system/chef_repository_file_system_entry.rb +23 -0
- data/lib/chef_fs/file_system/cookbook_dir.rb +27 -13
- data/lib/chef_fs/file_system/cookbooks_dir.rb +89 -30
- data/lib/chef_fs/file_system/data_bags_dir.rb +5 -1
- data/lib/chef_fs/file_system/nodes_dir.rb +8 -14
- data/lib/chef_fs/file_system/rest_list_dir.rb +6 -2
- data/lib/chef_fs/file_system/rest_list_entry.rb +15 -3
- data/lib/chef_fs/knife.rb +28 -17
- data/lib/chef_fs/version.rb +1 -1
- data/spec/chef_fs/file_system/chef_server_root_dir_spec.rb +26 -12
- data/spec/chef_fs/file_system/cookbook_dir_spec.rb +582 -0
- data/spec/chef_fs/file_system/cookbooks_dir_spec.rb +81 -489
- data/spec/chef_fs/file_system/data_bags_dir_spec.rb +63 -49
- data/spec/integration/deps_spec.rb +32 -32
- data/spec/integration/diff_spec.rb +425 -133
- data/spec/integration/download_spec.rb +743 -211
- data/spec/integration/upload_spec.rb +814 -244
- data/spec/support/integration_helper.rb +33 -6
- data/spec/support/knife_support.rb +4 -2
- metadata +19 -2
@@ -6,26 +6,27 @@ describe 'knife download' do
|
|
6
6
|
extend IntegrationSupport
|
7
7
|
include KnifeSupport
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
knife
|
9
|
+
context 'without versioned cookbooks' do
|
10
|
+
when_the_chef_server "has one of each thing" do
|
11
|
+
client 'x', '{}'
|
12
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
|
13
|
+
data_bag 'x', { 'y' => '{}' }
|
14
|
+
environment 'x', '{}'
|
15
|
+
node 'x', '{}'
|
16
|
+
role 'x', '{}'
|
17
|
+
user 'x', '{}'
|
18
|
+
|
19
|
+
when_the_repository 'has only top-level directories' do
|
20
|
+
directory 'clients'
|
21
|
+
directory 'cookbooks'
|
22
|
+
directory 'data_bags'
|
23
|
+
directory 'environments'
|
24
|
+
directory 'nodes'
|
25
|
+
directory 'roles'
|
26
|
+
directory 'users'
|
27
|
+
|
28
|
+
it 'knife download downloads everything' do
|
29
|
+
knife('download /').should_succeed <<EOM
|
29
30
|
Created /cookbooks/x
|
30
31
|
Created /cookbooks/x/metadata.rb
|
31
32
|
Created /data_bags/x
|
@@ -34,21 +35,21 @@ Created /environments/_default.json
|
|
34
35
|
Created /environments/x.json
|
35
36
|
Created /roles/x.json
|
36
37
|
EOM
|
37
|
-
|
38
|
+
knife('diff --name-status /').should_succeed ''
|
39
|
+
end
|
38
40
|
end
|
39
|
-
end
|
40
41
|
|
41
|
-
|
42
|
-
|
42
|
+
when_the_repository 'has an identical copy of each thing' do
|
43
|
+
file 'clients/x.json', <<EOM
|
43
44
|
{}
|
44
45
|
EOM
|
45
|
-
|
46
|
-
|
46
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
47
|
+
file 'data_bags/x/y.json', <<EOM
|
47
48
|
{
|
48
49
|
"id": "y"
|
49
50
|
}
|
50
51
|
EOM
|
51
|
-
|
52
|
+
file 'environments/_default.json', <<EOM
|
52
53
|
{
|
53
54
|
"name": "_default",
|
54
55
|
"description": "The default Chef environment",
|
@@ -62,7 +63,7 @@ EOM
|
|
62
63
|
}
|
63
64
|
}
|
64
65
|
EOM
|
65
|
-
|
66
|
+
file 'environments/x.json', <<EOM
|
66
67
|
{
|
67
68
|
"chef_type": "environment",
|
68
69
|
"cookbook_versions": {
|
@@ -76,10 +77,10 @@ EOM
|
|
76
77
|
}
|
77
78
|
}
|
78
79
|
EOM
|
79
|
-
|
80
|
+
file 'nodes/x.json', <<EOM
|
80
81
|
{}
|
81
82
|
EOM
|
82
|
-
|
83
|
+
file 'roles/x.json', <<EOM
|
83
84
|
{
|
84
85
|
"chef_type": "role",
|
85
86
|
"default_attributes": {
|
@@ -96,22 +97,22 @@ EOM
|
|
96
97
|
]
|
97
98
|
}
|
98
99
|
EOM
|
99
|
-
|
100
|
+
file 'users/x.json', <<EOM
|
100
101
|
{}
|
101
102
|
EOM
|
102
103
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
104
|
+
it 'knife download makes no changes' do
|
105
|
+
knife('download /').should_succeed ''
|
106
|
+
knife('diff --name-status /').should_succeed ''
|
107
|
+
end
|
107
108
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
109
|
+
it 'knife download --purge makes no changes' do
|
110
|
+
knife('download --purge /').should_succeed ''
|
111
|
+
knife('diff --name-status /').should_succeed ''
|
112
|
+
end
|
112
113
|
|
113
|
-
|
114
|
-
|
114
|
+
context 'except the role file' do
|
115
|
+
file 'roles/x.json', <<EOM
|
115
116
|
{
|
116
117
|
"chef_type": "role",
|
117
118
|
"default_attributes": {
|
@@ -128,14 +129,14 @@ EOM
|
|
128
129
|
]
|
129
130
|
}
|
130
131
|
EOM
|
131
|
-
|
132
|
-
|
133
|
-
|
132
|
+
it 'knife download changes the role' do
|
133
|
+
knife('download /').should_succeed "Updated /roles/x.json\n"
|
134
|
+
knife('diff --name-status /').should_succeed ''
|
135
|
+
end
|
134
136
|
end
|
135
|
-
end
|
136
137
|
|
137
|
-
|
138
|
-
|
138
|
+
context 'except the role file is textually different, but not ACTUALLY different' do
|
139
|
+
file 'roles/x.json', <<EOM
|
139
140
|
{
|
140
141
|
"chef_type": "role",
|
141
142
|
"default_attributes": {
|
@@ -152,27 +153,27 @@ EOM
|
|
152
153
|
]
|
153
154
|
}
|
154
155
|
EOM
|
155
|
-
|
156
|
-
|
157
|
-
|
156
|
+
it 'knife download / does not change anything' do
|
157
|
+
knife('download /').should_succeed ''
|
158
|
+
knife('diff --name-status /').should_succeed ''
|
159
|
+
end
|
158
160
|
end
|
159
|
-
end
|
160
161
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
162
|
+
context 'as well as one extra copy of each thing' do
|
163
|
+
file 'clients/y.json', { 'name' => 'y' }
|
164
|
+
file 'cookbooks/x/blah.rb', ''
|
165
|
+
file 'cookbooks/y/metadata.rb', 'version "1.0.0"'
|
166
|
+
file 'data_bags/x/z.json', <<EOM
|
166
167
|
{
|
167
168
|
"id": "z"
|
168
169
|
}
|
169
170
|
EOM
|
170
|
-
|
171
|
+
file 'data_bags/y/zz.json', <<EOM
|
171
172
|
{
|
172
173
|
"id": "zz"
|
173
174
|
}
|
174
175
|
EOM
|
175
|
-
|
176
|
+
file 'environments/y.json', <<EOM
|
176
177
|
{
|
177
178
|
"chef_type": "environment",
|
178
179
|
"cookbook_versions": {
|
@@ -186,8 +187,8 @@ EOM
|
|
186
187
|
}
|
187
188
|
}
|
188
189
|
EOM
|
189
|
-
|
190
|
-
|
190
|
+
file 'nodes/y.json', { 'name' => 'y' }
|
191
|
+
file 'roles/y.json', <<EOM
|
191
192
|
{
|
192
193
|
"chef_type": "role",
|
193
194
|
"default_attributes": {
|
@@ -204,11 +205,11 @@ EOM
|
|
204
205
|
]
|
205
206
|
}
|
206
207
|
EOM
|
207
|
-
|
208
|
+
file 'users/y.json', { 'name' => 'y' }
|
208
209
|
|
209
|
-
|
210
|
-
|
211
|
-
|
210
|
+
it 'knife download does nothing' do
|
211
|
+
knife('download /').should_succeed ''
|
212
|
+
knife('diff --name-status /').should_succeed <<EOM
|
212
213
|
A\t/cookbooks/x/blah.rb
|
213
214
|
A\t/cookbooks/y
|
214
215
|
A\t/data_bags/x/z.json
|
@@ -216,10 +217,10 @@ A\t/data_bags/y
|
|
216
217
|
A\t/environments/y.json
|
217
218
|
A\t/roles/y.json
|
218
219
|
EOM
|
219
|
-
|
220
|
+
end
|
220
221
|
|
221
|
-
|
222
|
-
|
222
|
+
it 'knife download --purge deletes the extra files' do
|
223
|
+
knife('download --purge /').should_succeed <<EOM
|
223
224
|
Deleted extra entry /cookbooks/x/blah.rb (purge is on)
|
224
225
|
Deleted extra entry /cookbooks/y (purge is on)
|
225
226
|
Deleted extra entry /data_bags/x/z.json (purge is on)
|
@@ -227,14 +228,14 @@ Deleted extra entry /data_bags/y (purge is on)
|
|
227
228
|
Deleted extra entry /environments/y.json (purge is on)
|
228
229
|
Deleted extra entry /roles/y.json (purge is on)
|
229
230
|
EOM
|
230
|
-
|
231
|
+
knife('diff --name-status /').should_succeed ''
|
232
|
+
end
|
231
233
|
end
|
232
234
|
end
|
233
|
-
end
|
234
235
|
|
235
|
-
|
236
|
-
|
237
|
-
|
236
|
+
when_the_repository 'is empty' do
|
237
|
+
it 'knife download creates the extra files' do
|
238
|
+
knife('download /').should_succeed <<EOM
|
238
239
|
Created /cookbooks
|
239
240
|
Created /cookbooks/x
|
240
241
|
Created /cookbooks/x/metadata.rb
|
@@ -247,37 +248,37 @@ Created /environments/x.json
|
|
247
248
|
Created /roles
|
248
249
|
Created /roles/x.json
|
249
250
|
EOM
|
250
|
-
|
251
|
-
|
251
|
+
knife('diff --name-status /').should_succeed ''
|
252
|
+
end
|
252
253
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
254
|
+
context 'when current directory is top level' do
|
255
|
+
cwd '.'
|
256
|
+
it 'knife download with no parameters reports an error' do
|
257
|
+
knife('download').should_fail "FATAL: Must specify at least one argument. If you want to download everything in this directory, type \"knife download .\"\n", :stdout => /USAGE/
|
258
|
+
end
|
257
259
|
end
|
258
260
|
end
|
259
261
|
end
|
260
|
-
end
|
261
262
|
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
263
|
+
# Test download of an item when the other end doesn't even have the container
|
264
|
+
when_the_repository 'is empty' do
|
265
|
+
when_the_chef_server 'has two data bag items' do
|
266
|
+
data_bag 'x', { 'y' => {}, 'z' => {} }
|
266
267
|
|
267
|
-
|
268
|
-
|
268
|
+
it 'knife download of one data bag item itself succeeds' do
|
269
|
+
knife('download /data_bags/x/y.json').should_succeed <<EOM
|
269
270
|
Created /data_bags
|
270
271
|
Created /data_bags/x
|
271
272
|
Created /data_bags/x/y.json
|
272
273
|
EOM
|
273
|
-
|
274
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
274
275
|
D\t/data_bags/x/z.json
|
275
276
|
EOM
|
277
|
+
end
|
276
278
|
end
|
277
279
|
end
|
278
|
-
end
|
279
280
|
|
280
|
-
|
281
|
+
when_the_repository 'has three data bag items' do
|
281
282
|
file 'data_bags/x/deleted.json', <<EOM
|
282
283
|
{
|
283
284
|
"id": "deleted"
|
@@ -294,234 +295,765 @@ EOM
|
|
294
295
|
}
|
295
296
|
EOM
|
296
297
|
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
298
|
+
when_the_chef_server 'has a modified, unmodified, added and deleted data bag item' do
|
299
|
+
data_bag 'x', {
|
300
|
+
'added' => {},
|
301
|
+
'modified' => { 'foo' => 'bar' },
|
302
|
+
'unmodified' => {}
|
303
|
+
}
|
303
304
|
|
304
|
-
|
305
|
-
|
305
|
+
it 'knife download of the modified file succeeds' do
|
306
|
+
knife('download /data_bags/x/modified.json').should_succeed <<EOM
|
306
307
|
Updated /data_bags/x/modified.json
|
307
308
|
EOM
|
308
|
-
|
309
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
309
310
|
D\t/data_bags/x/added.json
|
310
311
|
A\t/data_bags/x/deleted.json
|
311
312
|
EOM
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
313
|
+
end
|
314
|
+
it 'knife download of the unmodified file does nothing' do
|
315
|
+
knife('download /data_bags/x/unmodified.json').should_succeed ''
|
316
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
316
317
|
D\t/data_bags/x/added.json
|
317
318
|
M\t/data_bags/x/modified.json
|
318
319
|
A\t/data_bags/x/deleted.json
|
319
320
|
EOM
|
320
|
-
|
321
|
-
|
322
|
-
|
321
|
+
end
|
322
|
+
it 'knife download of the added file succeeds' do
|
323
|
+
knife('download /data_bags/x/added.json').should_succeed <<EOM
|
323
324
|
Created /data_bags/x/added.json
|
324
325
|
EOM
|
325
|
-
|
326
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
326
327
|
M\t/data_bags/x/modified.json
|
327
328
|
A\t/data_bags/x/deleted.json
|
328
329
|
EOM
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
330
|
+
end
|
331
|
+
it 'knife download of the deleted file does nothing' do
|
332
|
+
knife('download /data_bags/x/deleted.json').should_succeed ''
|
333
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
333
334
|
D\t/data_bags/x/added.json
|
334
335
|
M\t/data_bags/x/modified.json
|
335
336
|
A\t/data_bags/x/deleted.json
|
336
337
|
EOM
|
337
|
-
|
338
|
-
|
339
|
-
|
338
|
+
end
|
339
|
+
it 'knife download --purge of the deleted file deletes it' do
|
340
|
+
knife('download --purge /data_bags/x/deleted.json').should_succeed <<EOM
|
340
341
|
Deleted extra entry /data_bags/x/deleted.json (purge is on)
|
341
342
|
EOM
|
342
|
-
|
343
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
343
344
|
D\t/data_bags/x/added.json
|
344
345
|
M\t/data_bags/x/modified.json
|
345
346
|
EOM
|
346
|
-
|
347
|
-
|
348
|
-
|
347
|
+
end
|
348
|
+
it 'knife download of the entire data bag downloads everything' do
|
349
|
+
knife('download /data_bags/x').should_succeed <<EOM
|
349
350
|
Created /data_bags/x/added.json
|
350
351
|
Updated /data_bags/x/modified.json
|
351
352
|
EOM
|
352
|
-
|
353
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
353
354
|
A\t/data_bags/x/deleted.json
|
354
355
|
EOM
|
355
|
-
|
356
|
-
|
357
|
-
|
356
|
+
end
|
357
|
+
it 'knife download --purge of the entire data bag downloads everything' do
|
358
|
+
knife('download --purge /data_bags/x').should_succeed <<EOM
|
358
359
|
Created /data_bags/x/added.json
|
359
360
|
Updated /data_bags/x/modified.json
|
360
361
|
Deleted extra entry /data_bags/x/deleted.json (purge is on)
|
361
362
|
EOM
|
362
|
-
|
363
|
-
end
|
364
|
-
context 'when cwd is the /data_bags directory' do
|
365
|
-
cwd 'data_bags'
|
366
|
-
it 'knife download fails' do
|
367
|
-
knife('download').should_fail "FATAL: Must specify at least one argument. If you want to download everything in this directory, type \"knife download .\"\n", :stdout => /USAGE/
|
363
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
368
364
|
end
|
369
|
-
|
370
|
-
|
365
|
+
context 'when cwd is the /data_bags directory' do
|
366
|
+
cwd 'data_bags'
|
367
|
+
it 'knife download fails' do
|
368
|
+
knife('download').should_fail "FATAL: Must specify at least one argument. If you want to download everything in this directory, type \"knife download .\"\n", :stdout => /USAGE/
|
369
|
+
end
|
370
|
+
it 'knife download --purge . downloads everything' do
|
371
|
+
knife('download --purge .').should_succeed <<EOM
|
371
372
|
Created x/added.json
|
372
373
|
Updated x/modified.json
|
373
374
|
Deleted extra entry x/deleted.json (purge is on)
|
374
375
|
EOM
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
376
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
377
|
+
end
|
378
|
+
it 'knife download --purge * downloads everything' do
|
379
|
+
knife('download --purge *').should_succeed <<EOM
|
379
380
|
Created x/added.json
|
380
381
|
Updated x/modified.json
|
381
382
|
Deleted extra entry x/deleted.json (purge is on)
|
382
383
|
EOM
|
383
|
-
|
384
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
385
|
+
end
|
384
386
|
end
|
385
387
|
end
|
386
388
|
end
|
387
|
-
end
|
388
389
|
|
389
|
-
|
390
|
-
|
391
|
-
|
390
|
+
when_the_repository 'has a cookbook' do
|
391
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
392
|
+
file 'cookbooks/x/z.rb', ''
|
392
393
|
|
393
|
-
|
394
|
-
|
394
|
+
when_the_chef_server 'has a modified, added and deleted file for the cookbook' do
|
395
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'y.rb' => 'hi' }
|
395
396
|
|
396
|
-
|
397
|
-
|
398
|
-
|
397
|
+
it 'knife download of a modified file succeeds' do
|
398
|
+
knife('download /cookbooks/x/metadata.rb').should_succeed "Updated /cookbooks/x/metadata.rb\n"
|
399
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
399
400
|
D\t/cookbooks/x/y.rb
|
400
401
|
A\t/cookbooks/x/z.rb
|
401
402
|
EOM
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
403
|
+
end
|
404
|
+
it 'knife download of a deleted file does nothing' do
|
405
|
+
knife('download /cookbooks/x/z.rb').should_succeed ''
|
406
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
406
407
|
M\t/cookbooks/x/metadata.rb
|
407
408
|
D\t/cookbooks/x/y.rb
|
408
409
|
A\t/cookbooks/x/z.rb
|
409
410
|
EOM
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
411
|
+
end
|
412
|
+
it 'knife download --purge of a deleted file succeeds' do
|
413
|
+
knife('download --purge /cookbooks/x/z.rb').should_succeed "Deleted extra entry /cookbooks/x/z.rb (purge is on)\n"
|
414
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
414
415
|
M\t/cookbooks/x/metadata.rb
|
415
416
|
D\t/cookbooks/x/y.rb
|
416
417
|
EOM
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
418
|
+
end
|
419
|
+
it 'knife download of an added file succeeds' do
|
420
|
+
knife('download /cookbooks/x/y.rb').should_succeed "Created /cookbooks/x/y.rb\n"
|
421
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
421
422
|
M\t/cookbooks/x/metadata.rb
|
422
423
|
A\t/cookbooks/x/z.rb
|
423
424
|
EOM
|
424
|
-
|
425
|
-
|
426
|
-
|
425
|
+
end
|
426
|
+
it 'knife download of the cookbook itself succeeds' do
|
427
|
+
knife('download /cookbooks/x').should_succeed <<EOM
|
427
428
|
Updated /cookbooks/x/metadata.rb
|
428
429
|
Created /cookbooks/x/y.rb
|
429
430
|
EOM
|
430
|
-
|
431
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
431
432
|
A\t/cookbooks/x/z.rb
|
432
433
|
EOM
|
433
|
-
|
434
|
-
|
435
|
-
|
434
|
+
end
|
435
|
+
it 'knife download --purge of the cookbook itself succeeds' do
|
436
|
+
knife('download --purge /cookbooks/x').should_succeed <<EOM
|
436
437
|
Updated /cookbooks/x/metadata.rb
|
437
438
|
Created /cookbooks/x/y.rb
|
438
439
|
Deleted extra entry /cookbooks/x/z.rb (purge is on)
|
439
440
|
EOM
|
440
|
-
|
441
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
442
|
+
end
|
441
443
|
end
|
442
444
|
end
|
443
|
-
end
|
444
445
|
|
445
|
-
|
446
|
-
|
447
|
-
|
446
|
+
when_the_repository 'has a cookbook' do
|
447
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
448
|
+
file 'cookbooks/x/onlyin1.0.0.rb', 'old_text'
|
448
449
|
|
449
|
-
|
450
|
-
|
451
|
-
|
450
|
+
when_the_chef_server 'has a later version for the cookbook' do
|
451
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
|
452
|
+
cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
|
452
453
|
|
453
|
-
|
454
|
-
|
454
|
+
it 'knife download /cookbooks/x downloads the latest version' do
|
455
|
+
knife('download --purge /cookbooks/x').should_succeed <<EOM
|
455
456
|
Updated /cookbooks/x/metadata.rb
|
456
457
|
Created /cookbooks/x/onlyin1.0.1.rb
|
457
458
|
Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
|
458
459
|
EOM
|
459
|
-
|
460
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
461
|
+
end
|
460
462
|
end
|
461
|
-
end
|
462
463
|
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
464
|
+
when_the_chef_server 'has an earlier version for the cookbook' do
|
465
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
|
466
|
+
cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
|
467
|
+
it 'knife download /cookbooks/x downloads the updated file' do
|
468
|
+
knife('download --purge /cookbooks/x').should_succeed <<EOM
|
468
469
|
Updated /cookbooks/x/onlyin1.0.0.rb
|
469
470
|
EOM
|
470
|
-
|
471
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
472
|
+
end
|
471
473
|
end
|
472
|
-
end
|
473
474
|
|
474
|
-
|
475
|
-
|
475
|
+
when_the_chef_server 'has a later version for the cookbook, and no current version' do
|
476
|
+
cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
|
476
477
|
|
477
|
-
|
478
|
-
|
478
|
+
it 'knife download /cookbooks/x downloads the latest version' do
|
479
|
+
knife('download --purge /cookbooks/x').should_succeed <<EOM
|
479
480
|
Updated /cookbooks/x/metadata.rb
|
480
481
|
Created /cookbooks/x/onlyin1.0.1.rb
|
481
482
|
Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
|
482
483
|
EOM
|
483
|
-
|
484
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
485
|
+
end
|
484
486
|
end
|
485
|
-
end
|
486
487
|
|
487
|
-
|
488
|
-
|
488
|
+
when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
|
489
|
+
cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
|
489
490
|
|
490
|
-
|
491
|
-
|
491
|
+
it 'knife download /cookbooks/x downloads the old version' do
|
492
|
+
knife('download --purge /cookbooks/x').should_succeed <<EOM
|
492
493
|
Updated /cookbooks/x/metadata.rb
|
493
494
|
Created /cookbooks/x/onlyin0.9.9.rb
|
494
495
|
Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
|
495
496
|
EOM
|
496
|
-
|
497
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
498
|
+
end
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
502
|
+
when_the_chef_server 'has an environment' do
|
503
|
+
environment 'x', {}
|
504
|
+
when_the_repository 'has an environment with bad JSON' do
|
505
|
+
file 'environments/x.json', '{'
|
506
|
+
it 'knife download succeeds' do
|
507
|
+
knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n", :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n"
|
508
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
509
|
+
end
|
510
|
+
end
|
511
|
+
|
512
|
+
when_the_repository 'has the same environment with the wrong name in the file' do
|
513
|
+
file 'environments/x.json', { 'name' => 'y' }
|
514
|
+
it 'knife download succeeds' do
|
515
|
+
knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n"
|
516
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
517
|
+
end
|
518
|
+
end
|
519
|
+
|
520
|
+
when_the_repository 'has the same environment with no name in the file' do
|
521
|
+
file 'environments/x.json', { 'description' => 'hi' }
|
522
|
+
it 'knife download succeeds' do
|
523
|
+
knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n"
|
524
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
525
|
+
end
|
526
|
+
end
|
527
|
+
end
|
528
|
+
end # without versioned cookbooks
|
529
|
+
|
530
|
+
with_versioned_cookbooks do
|
531
|
+
when_the_chef_server "has one of each thing" do
|
532
|
+
client 'x', '{}'
|
533
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
|
534
|
+
data_bag 'x', { 'y' => '{}' }
|
535
|
+
environment 'x', '{}'
|
536
|
+
node 'x', '{}'
|
537
|
+
role 'x', '{}'
|
538
|
+
user 'x', '{}'
|
539
|
+
|
540
|
+
when_the_repository 'has only top-level directories' do
|
541
|
+
directory 'clients'
|
542
|
+
directory 'cookbooks'
|
543
|
+
directory 'data_bags'
|
544
|
+
directory 'environments'
|
545
|
+
directory 'nodes'
|
546
|
+
directory 'roles'
|
547
|
+
directory 'users'
|
548
|
+
|
549
|
+
it 'knife download downloads everything' do
|
550
|
+
knife('download /').should_succeed <<EOM
|
551
|
+
Created /cookbooks/x-1.0.0
|
552
|
+
Created /cookbooks/x-1.0.0/metadata.rb
|
553
|
+
Created /data_bags/x
|
554
|
+
Created /data_bags/x/y.json
|
555
|
+
Created /environments/_default.json
|
556
|
+
Created /environments/x.json
|
557
|
+
Created /roles/x.json
|
558
|
+
EOM
|
559
|
+
knife('diff --name-status /').should_succeed ''
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
when_the_repository 'has an identical copy of each thing' do
|
564
|
+
file 'clients/x.json', <<EOM
|
565
|
+
{}
|
566
|
+
EOM
|
567
|
+
file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
|
568
|
+
file 'data_bags/x/y.json', <<EOM
|
569
|
+
{
|
570
|
+
"id": "y"
|
571
|
+
}
|
572
|
+
EOM
|
573
|
+
file 'environments/_default.json', <<EOM
|
574
|
+
{
|
575
|
+
"name": "_default",
|
576
|
+
"description": "The default Chef environment",
|
577
|
+
"cookbook_versions": {
|
578
|
+
},
|
579
|
+
"json_class": "Chef::Environment",
|
580
|
+
"chef_type": "environment",
|
581
|
+
"default_attributes": {
|
582
|
+
},
|
583
|
+
"override_attributes": {
|
584
|
+
}
|
585
|
+
}
|
586
|
+
EOM
|
587
|
+
file 'environments/x.json', <<EOM
|
588
|
+
{
|
589
|
+
"chef_type": "environment",
|
590
|
+
"cookbook_versions": {
|
591
|
+
},
|
592
|
+
"default_attributes": {
|
593
|
+
},
|
594
|
+
"description": "",
|
595
|
+
"json_class": "Chef::Environment",
|
596
|
+
"name": "x",
|
597
|
+
"override_attributes": {
|
598
|
+
}
|
599
|
+
}
|
600
|
+
EOM
|
601
|
+
file 'nodes/x.json', <<EOM
|
602
|
+
{}
|
603
|
+
EOM
|
604
|
+
file 'roles/x.json', <<EOM
|
605
|
+
{
|
606
|
+
"chef_type": "role",
|
607
|
+
"default_attributes": {
|
608
|
+
},
|
609
|
+
"description": "",
|
610
|
+
"env_run_lists": {
|
611
|
+
},
|
612
|
+
"json_class": "Chef::Role",
|
613
|
+
"name": "x",
|
614
|
+
"override_attributes": {
|
615
|
+
},
|
616
|
+
"run_list": [
|
617
|
+
|
618
|
+
]
|
619
|
+
}
|
620
|
+
EOM
|
621
|
+
file 'users/x.json', <<EOM
|
622
|
+
{}
|
623
|
+
EOM
|
624
|
+
|
625
|
+
it 'knife download makes no changes' do
|
626
|
+
knife('download /').should_succeed ''
|
627
|
+
knife('diff --name-status /').should_succeed ''
|
628
|
+
end
|
629
|
+
|
630
|
+
it 'knife download --purge makes no changes' do
|
631
|
+
knife('download --purge /').should_succeed ''
|
632
|
+
knife('diff --name-status /').should_succeed ''
|
633
|
+
end
|
634
|
+
|
635
|
+
context 'except the role file' do
|
636
|
+
file 'roles/x.json', <<EOM
|
637
|
+
{
|
638
|
+
"chef_type": "role",
|
639
|
+
"default_attributes": {
|
640
|
+
},
|
641
|
+
"description": "blarghle",
|
642
|
+
"env_run_lists": {
|
643
|
+
},
|
644
|
+
"json_class": "Chef::Role",
|
645
|
+
"name": "x",
|
646
|
+
"override_attributes": {
|
647
|
+
},
|
648
|
+
"run_list": [
|
649
|
+
|
650
|
+
]
|
651
|
+
}
|
652
|
+
EOM
|
653
|
+
it 'knife download changes the role' do
|
654
|
+
knife('download /').should_succeed "Updated /roles/x.json\n"
|
655
|
+
knife('diff --name-status /').should_succeed ''
|
656
|
+
end
|
657
|
+
end
|
658
|
+
|
659
|
+
context 'except the role file is textually different, but not ACTUALLY different' do
|
660
|
+
file 'roles/x.json', <<EOM
|
661
|
+
{
|
662
|
+
"chef_type": "role",
|
663
|
+
"default_attributes": {
|
664
|
+
},
|
665
|
+
"env_run_lists": {
|
666
|
+
},
|
667
|
+
"json_class": "Chef::Role",
|
668
|
+
"name": "x",
|
669
|
+
"description": "",
|
670
|
+
"override_attributes": {
|
671
|
+
},
|
672
|
+
"run_list": [
|
673
|
+
|
674
|
+
]
|
675
|
+
}
|
676
|
+
EOM
|
677
|
+
it 'knife download / does not change anything' do
|
678
|
+
knife('download /').should_succeed ''
|
679
|
+
knife('diff --name-status /').should_succeed ''
|
680
|
+
end
|
681
|
+
end
|
682
|
+
|
683
|
+
context 'as well as one extra copy of each thing' do
|
684
|
+
file 'clients/y.json', { 'name' => 'y' }
|
685
|
+
file 'cookbooks/x-1.0.0/blah.rb', ''
|
686
|
+
file 'cookbooks/x-2.0.0/metadata.rb', 'version "2.0.0"'
|
687
|
+
file 'cookbooks/y-1.0.0/metadata.rb', 'version "1.0.0"'
|
688
|
+
file 'data_bags/x/z.json', <<EOM
|
689
|
+
{
|
690
|
+
"id": "z"
|
691
|
+
}
|
692
|
+
EOM
|
693
|
+
file 'data_bags/y/zz.json', <<EOM
|
694
|
+
{
|
695
|
+
"id": "zz"
|
696
|
+
}
|
697
|
+
EOM
|
698
|
+
file 'environments/y.json', <<EOM
|
699
|
+
{
|
700
|
+
"chef_type": "environment",
|
701
|
+
"cookbook_versions": {
|
702
|
+
},
|
703
|
+
"default_attributes": {
|
704
|
+
},
|
705
|
+
"description": "",
|
706
|
+
"json_class": "Chef::Environment",
|
707
|
+
"name": "y",
|
708
|
+
"override_attributes": {
|
709
|
+
}
|
710
|
+
}
|
711
|
+
EOM
|
712
|
+
file 'nodes/y.json', { 'name' => 'y' }
|
713
|
+
file 'roles/y.json', <<EOM
|
714
|
+
{
|
715
|
+
"chef_type": "role",
|
716
|
+
"default_attributes": {
|
717
|
+
},
|
718
|
+
"description": "",
|
719
|
+
"env_run_lists": {
|
720
|
+
},
|
721
|
+
"json_class": "Chef::Role",
|
722
|
+
"name": "y",
|
723
|
+
"override_attributes": {
|
724
|
+
},
|
725
|
+
"run_list": [
|
726
|
+
|
727
|
+
]
|
728
|
+
}
|
729
|
+
EOM
|
730
|
+
file 'users/y.json', { 'name' => 'y' }
|
731
|
+
|
732
|
+
it 'knife download does nothing' do
|
733
|
+
knife('download /').should_succeed ''
|
734
|
+
knife('diff --name-status /').should_succeed <<EOM
|
735
|
+
A\t/cookbooks/x-1.0.0/blah.rb
|
736
|
+
A\t/cookbooks/x-2.0.0
|
737
|
+
A\t/cookbooks/y-1.0.0
|
738
|
+
A\t/data_bags/x/z.json
|
739
|
+
A\t/data_bags/y
|
740
|
+
A\t/environments/y.json
|
741
|
+
A\t/roles/y.json
|
742
|
+
EOM
|
743
|
+
end
|
744
|
+
|
745
|
+
it 'knife download --purge deletes the extra files' do
|
746
|
+
knife('download --purge /').should_succeed <<EOM
|
747
|
+
Deleted extra entry /cookbooks/x-1.0.0/blah.rb (purge is on)
|
748
|
+
Deleted extra entry /cookbooks/x-2.0.0 (purge is on)
|
749
|
+
Deleted extra entry /cookbooks/y-1.0.0 (purge is on)
|
750
|
+
Deleted extra entry /data_bags/x/z.json (purge is on)
|
751
|
+
Deleted extra entry /data_bags/y (purge is on)
|
752
|
+
Deleted extra entry /environments/y.json (purge is on)
|
753
|
+
Deleted extra entry /roles/y.json (purge is on)
|
754
|
+
EOM
|
755
|
+
knife('diff --name-status /').should_succeed ''
|
756
|
+
end
|
757
|
+
end
|
758
|
+
end
|
759
|
+
|
760
|
+
when_the_repository 'is empty' do
|
761
|
+
it 'knife download creates the extra files' do
|
762
|
+
knife('download /').should_succeed <<EOM
|
763
|
+
Created /cookbooks
|
764
|
+
Created /cookbooks/x-1.0.0
|
765
|
+
Created /cookbooks/x-1.0.0/metadata.rb
|
766
|
+
Created /data_bags
|
767
|
+
Created /data_bags/x
|
768
|
+
Created /data_bags/x/y.json
|
769
|
+
Created /environments
|
770
|
+
Created /environments/_default.json
|
771
|
+
Created /environments/x.json
|
772
|
+
Created /roles
|
773
|
+
Created /roles/x.json
|
774
|
+
EOM
|
775
|
+
knife('diff --name-status /').should_succeed ''
|
776
|
+
end
|
777
|
+
|
778
|
+
context 'when current directory is top level' do
|
779
|
+
cwd '.'
|
780
|
+
it 'knife download with no parameters reports an error' do
|
781
|
+
knife('download').should_fail "FATAL: Must specify at least one argument. If you want to download everything in this directory, type \"knife download .\"\n", :stdout => /USAGE/
|
782
|
+
end
|
783
|
+
end
|
497
784
|
end
|
498
785
|
end
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
786
|
+
|
787
|
+
# Test download of an item when the other end doesn't even have the container
|
788
|
+
when_the_repository 'is empty' do
|
789
|
+
when_the_chef_server 'has two data bag items' do
|
790
|
+
data_bag 'x', { 'y' => {}, 'z' => {} }
|
791
|
+
|
792
|
+
it 'knife download of one data bag item itself succeeds' do
|
793
|
+
knife('download /data_bags/x/y.json').should_succeed <<EOM
|
794
|
+
Created /data_bags
|
795
|
+
Created /data_bags/x
|
796
|
+
Created /data_bags/x/y.json
|
797
|
+
EOM
|
798
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
799
|
+
D\t/data_bags/x/z.json
|
800
|
+
EOM
|
801
|
+
end
|
508
802
|
end
|
509
803
|
end
|
510
804
|
|
511
|
-
when_the_repository 'has
|
512
|
-
file '
|
513
|
-
|
514
|
-
|
515
|
-
|
805
|
+
when_the_repository 'has three data bag items' do
|
806
|
+
file 'data_bags/x/deleted.json', <<EOM
|
807
|
+
{
|
808
|
+
"id": "deleted"
|
809
|
+
}
|
810
|
+
EOM
|
811
|
+
file 'data_bags/x/modified.json', <<EOM
|
812
|
+
{
|
813
|
+
"id": "modified"
|
814
|
+
}
|
815
|
+
EOM
|
816
|
+
file 'data_bags/x/unmodified.json', <<EOM
|
817
|
+
{
|
818
|
+
"id": "unmodified"
|
819
|
+
}
|
820
|
+
EOM
|
821
|
+
|
822
|
+
when_the_chef_server 'has a modified, unmodified, added and deleted data bag item' do
|
823
|
+
data_bag 'x', {
|
824
|
+
'added' => {},
|
825
|
+
'modified' => { 'foo' => 'bar' },
|
826
|
+
'unmodified' => {}
|
827
|
+
}
|
828
|
+
|
829
|
+
it 'knife download of the modified file succeeds' do
|
830
|
+
knife('download /data_bags/x/modified.json').should_succeed <<EOM
|
831
|
+
Updated /data_bags/x/modified.json
|
832
|
+
EOM
|
833
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
834
|
+
D\t/data_bags/x/added.json
|
835
|
+
A\t/data_bags/x/deleted.json
|
836
|
+
EOM
|
837
|
+
end
|
838
|
+
it 'knife download of the unmodified file does nothing' do
|
839
|
+
knife('download /data_bags/x/unmodified.json').should_succeed ''
|
840
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
841
|
+
D\t/data_bags/x/added.json
|
842
|
+
M\t/data_bags/x/modified.json
|
843
|
+
A\t/data_bags/x/deleted.json
|
844
|
+
EOM
|
845
|
+
end
|
846
|
+
it 'knife download of the added file succeeds' do
|
847
|
+
knife('download /data_bags/x/added.json').should_succeed <<EOM
|
848
|
+
Created /data_bags/x/added.json
|
849
|
+
EOM
|
850
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
851
|
+
M\t/data_bags/x/modified.json
|
852
|
+
A\t/data_bags/x/deleted.json
|
853
|
+
EOM
|
854
|
+
end
|
855
|
+
it 'knife download of the deleted file does nothing' do
|
856
|
+
knife('download /data_bags/x/deleted.json').should_succeed ''
|
857
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
858
|
+
D\t/data_bags/x/added.json
|
859
|
+
M\t/data_bags/x/modified.json
|
860
|
+
A\t/data_bags/x/deleted.json
|
861
|
+
EOM
|
862
|
+
end
|
863
|
+
it 'knife download --purge of the deleted file deletes it' do
|
864
|
+
knife('download --purge /data_bags/x/deleted.json').should_succeed <<EOM
|
865
|
+
Deleted extra entry /data_bags/x/deleted.json (purge is on)
|
866
|
+
EOM
|
867
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
868
|
+
D\t/data_bags/x/added.json
|
869
|
+
M\t/data_bags/x/modified.json
|
870
|
+
EOM
|
871
|
+
end
|
872
|
+
it 'knife download of the entire data bag downloads everything' do
|
873
|
+
knife('download /data_bags/x').should_succeed <<EOM
|
874
|
+
Created /data_bags/x/added.json
|
875
|
+
Updated /data_bags/x/modified.json
|
876
|
+
EOM
|
877
|
+
knife('diff --name-status /data_bags').should_succeed <<EOM
|
878
|
+
A\t/data_bags/x/deleted.json
|
879
|
+
EOM
|
880
|
+
end
|
881
|
+
it 'knife download --purge of the entire data bag downloads everything' do
|
882
|
+
knife('download --purge /data_bags/x').should_succeed <<EOM
|
883
|
+
Created /data_bags/x/added.json
|
884
|
+
Updated /data_bags/x/modified.json
|
885
|
+
Deleted extra entry /data_bags/x/deleted.json (purge is on)
|
886
|
+
EOM
|
887
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
888
|
+
end
|
889
|
+
context 'when cwd is the /data_bags directory' do
|
890
|
+
cwd 'data_bags'
|
891
|
+
it 'knife download fails' do
|
892
|
+
knife('download').should_fail "FATAL: Must specify at least one argument. If you want to download everything in this directory, type \"knife download .\"\n", :stdout => /USAGE/
|
893
|
+
end
|
894
|
+
it 'knife download --purge . downloads everything' do
|
895
|
+
knife('download --purge .').should_succeed <<EOM
|
896
|
+
Created x/added.json
|
897
|
+
Updated x/modified.json
|
898
|
+
Deleted extra entry x/deleted.json (purge is on)
|
899
|
+
EOM
|
900
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
901
|
+
end
|
902
|
+
it 'knife download --purge * downloads everything' do
|
903
|
+
knife('download --purge *').should_succeed <<EOM
|
904
|
+
Created x/added.json
|
905
|
+
Updated x/modified.json
|
906
|
+
Deleted extra entry x/deleted.json (purge is on)
|
907
|
+
EOM
|
908
|
+
knife('diff --name-status /data_bags').should_succeed ''
|
909
|
+
end
|
910
|
+
end
|
911
|
+
end
|
912
|
+
end
|
913
|
+
|
914
|
+
when_the_repository 'has a cookbook' do
|
915
|
+
file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
|
916
|
+
file 'cookbooks/x-1.0.0/z.rb', ''
|
917
|
+
|
918
|
+
when_the_chef_server 'has a modified, added and deleted file for the cookbook' do
|
919
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'y.rb' => 'hi' }
|
920
|
+
|
921
|
+
it 'knife download of a modified file succeeds' do
|
922
|
+
knife('download /cookbooks/x-1.0.0/metadata.rb').should_succeed "Updated /cookbooks/x-1.0.0/metadata.rb\n"
|
923
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
924
|
+
D\t/cookbooks/x-1.0.0/y.rb
|
925
|
+
A\t/cookbooks/x-1.0.0/z.rb
|
926
|
+
EOM
|
927
|
+
end
|
928
|
+
it 'knife download of a deleted file does nothing' do
|
929
|
+
knife('download /cookbooks/x-1.0.0/z.rb').should_succeed ''
|
930
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
931
|
+
M\t/cookbooks/x-1.0.0/metadata.rb
|
932
|
+
D\t/cookbooks/x-1.0.0/y.rb
|
933
|
+
A\t/cookbooks/x-1.0.0/z.rb
|
934
|
+
EOM
|
935
|
+
end
|
936
|
+
it 'knife download --purge of a deleted file succeeds' do
|
937
|
+
knife('download --purge /cookbooks/x-1.0.0/z.rb').should_succeed "Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on)\n"
|
938
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
939
|
+
M\t/cookbooks/x-1.0.0/metadata.rb
|
940
|
+
D\t/cookbooks/x-1.0.0/y.rb
|
941
|
+
EOM
|
942
|
+
end
|
943
|
+
it 'knife download of an added file succeeds' do
|
944
|
+
knife('download /cookbooks/x-1.0.0/y.rb').should_succeed "Created /cookbooks/x-1.0.0/y.rb\n"
|
945
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
946
|
+
M\t/cookbooks/x-1.0.0/metadata.rb
|
947
|
+
A\t/cookbooks/x-1.0.0/z.rb
|
948
|
+
EOM
|
949
|
+
end
|
950
|
+
it 'knife download of the cookbook itself succeeds' do
|
951
|
+
knife('download /cookbooks/x-1.0.0').should_succeed <<EOM
|
952
|
+
Updated /cookbooks/x-1.0.0/metadata.rb
|
953
|
+
Created /cookbooks/x-1.0.0/y.rb
|
954
|
+
EOM
|
955
|
+
knife('diff --name-status /cookbooks').should_succeed <<EOM
|
956
|
+
A\t/cookbooks/x-1.0.0/z.rb
|
957
|
+
EOM
|
958
|
+
end
|
959
|
+
it 'knife download --purge of the cookbook itself succeeds' do
|
960
|
+
knife('download --purge /cookbooks/x-1.0.0').should_succeed <<EOM
|
961
|
+
Updated /cookbooks/x-1.0.0/metadata.rb
|
962
|
+
Created /cookbooks/x-1.0.0/y.rb
|
963
|
+
Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on)
|
964
|
+
EOM
|
965
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
966
|
+
end
|
516
967
|
end
|
517
968
|
end
|
518
969
|
|
519
|
-
when_the_repository 'has
|
520
|
-
file '
|
521
|
-
|
522
|
-
|
523
|
-
|
970
|
+
when_the_repository 'has a cookbook' do
|
971
|
+
file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
|
972
|
+
file 'cookbooks/x-1.0.0/onlyin1.0.0.rb', 'old_text'
|
973
|
+
|
974
|
+
when_the_chef_server 'has a later version for the cookbook' do
|
975
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
|
976
|
+
cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
|
977
|
+
|
978
|
+
it 'knife download /cookbooks/x downloads the latest version' do
|
979
|
+
knife('download --purge /cookbooks').should_succeed <<EOM
|
980
|
+
Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb
|
981
|
+
Created /cookbooks/x-1.0.1
|
982
|
+
Created /cookbooks/x-1.0.1/metadata.rb
|
983
|
+
Created /cookbooks/x-1.0.1/onlyin1.0.1.rb
|
984
|
+
EOM
|
985
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
986
|
+
end
|
987
|
+
end
|
988
|
+
|
989
|
+
when_the_chef_server 'has an earlier version for the cookbook' do
|
990
|
+
cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
|
991
|
+
cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
|
992
|
+
it 'knife download /cookbooks downloads the updated file' do
|
993
|
+
knife('download --purge /cookbooks').should_succeed <<EOM
|
994
|
+
Created /cookbooks/x-0.9.9
|
995
|
+
Created /cookbooks/x-0.9.9/metadata.rb
|
996
|
+
Created /cookbooks/x-0.9.9/onlyin0.9.9.rb
|
997
|
+
Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb
|
998
|
+
EOM
|
999
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
1000
|
+
end
|
1001
|
+
end
|
1002
|
+
|
1003
|
+
when_the_chef_server 'has a later version for the cookbook, and no current version' do
|
1004
|
+
cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
|
1005
|
+
|
1006
|
+
it 'knife download /cookbooks/x downloads the latest version' do
|
1007
|
+
knife('download --purge /cookbooks').should_succeed <<EOM
|
1008
|
+
Created /cookbooks/x-1.0.1
|
1009
|
+
Created /cookbooks/x-1.0.1/metadata.rb
|
1010
|
+
Created /cookbooks/x-1.0.1/onlyin1.0.1.rb
|
1011
|
+
Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
|
1012
|
+
EOM
|
1013
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
1014
|
+
end
|
1015
|
+
end
|
1016
|
+
|
1017
|
+
when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
|
1018
|
+
cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
|
1019
|
+
|
1020
|
+
it 'knife download --purge /cookbooks downloads the old version and deletes the new version' do
|
1021
|
+
knife('download --purge /cookbooks').should_succeed <<EOM
|
1022
|
+
Created /cookbooks/x-0.9.9
|
1023
|
+
Created /cookbooks/x-0.9.9/metadata.rb
|
1024
|
+
Created /cookbooks/x-0.9.9/onlyin0.9.9.rb
|
1025
|
+
Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
|
1026
|
+
EOM
|
1027
|
+
knife('diff --name-status /cookbooks').should_succeed ''
|
1028
|
+
end
|
1029
|
+
end
|
1030
|
+
end
|
1031
|
+
|
1032
|
+
when_the_chef_server 'has an environment' do
|
1033
|
+
environment 'x', {}
|
1034
|
+
when_the_repository 'has an environment with bad JSON' do
|
1035
|
+
file 'environments/x.json', '{'
|
1036
|
+
it 'knife download succeeds' do
|
1037
|
+
knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n", :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n"
|
1038
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
1039
|
+
end
|
1040
|
+
end
|
1041
|
+
|
1042
|
+
when_the_repository 'has the same environment with the wrong name in the file' do
|
1043
|
+
file 'environments/x.json', { 'name' => 'y' }
|
1044
|
+
it 'knife download succeeds' do
|
1045
|
+
knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n"
|
1046
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
1047
|
+
end
|
1048
|
+
end
|
1049
|
+
|
1050
|
+
when_the_repository 'has the same environment with no name in the file' do
|
1051
|
+
file 'environments/x.json', { 'description' => 'hi' }
|
1052
|
+
it 'knife download succeeds' do
|
1053
|
+
knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n"
|
1054
|
+
knife('diff --name-status /environments/x.json').should_succeed ''
|
1055
|
+
end
|
524
1056
|
end
|
525
1057
|
end
|
526
|
-
end
|
1058
|
+
end # with versioned cookbooks
|
527
1059
|
end
|