cheffish 0.8 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 427284963b463df3766e864b509ef9744b4495c8
4
- data.tar.gz: 86fa11bb31ad0bf98942c410e18868eb8967e903
3
+ metadata.gz: 338276289ac7fab89d006bc453e20266560948b7
4
+ data.tar.gz: 60ac99761729f96b46b5d12f38101fcf930008cc
5
5
  SHA512:
6
- metadata.gz: c52954a4961bbb4f880a8dc23fa8a3aa8ee2d931d7139eff910081eb3fb0e7f1469b1eb0f700771d865265521abb3bbde41b29b36913c6a8cb054b6732145a92
7
- data.tar.gz: 42b1fda6ca8590848118e253ebc82e43e5ae17abdea2be29882e9f5f120af4a36038a66b2c7add5644bcfeb120157c39dddaa36eb4b270207774e3e5568cd11b
6
+ metadata.gz: d2fbe1a958c572c4c885d8bea5c2453bbd0cfbb9cd0fbba63a15cf47eb7266b946f66a900549b1a9f6b45186f378a01312c573accdadfc84c520b5a288a99753
7
+ data.tar.gz: 0676d6791b22f25d28ce7977b4e905e10bb8ab2cf44059af0b1cc6175ae6dcad98cebc73024dbb352829405a7237575f862559032105d13c4e95a0aa4270d7f7
@@ -12,11 +12,36 @@ class Chef::Provider::ChefMirror < Chef::Provider::LWRPBase
12
12
  end
13
13
 
14
14
  action :upload do
15
- copy_to(local_fs, remote_fs)
15
+ with_modified_config do
16
+ copy_to(local_fs, remote_fs)
17
+ end
16
18
  end
17
19
 
18
20
  action :download do
19
- copy_to(remote_fs, local_fs)
21
+ with_modified_config do
22
+ copy_to(remote_fs, local_fs)
23
+ end
24
+ end
25
+
26
+ def with_modified_config
27
+ # pre-Chef-12 ChefFS reads versioned_cookbooks out of Chef::Config instead of
28
+ # taking it as an input, so we need to modify it for the duration of copy_to
29
+ @old_versioned_cookbooks = Chef::Config.versioned_cookbooks
30
+ # If versioned_cookbooks is explicitly set, set it.
31
+ if !new_resource.versioned_cookbooks.nil?
32
+ Chef::Config.versioned_cookbooks = new_resource.versioned_cookbooks
33
+
34
+ # If new_resource.chef_repo_path is set, versioned_cookbooks defaults to true.
35
+ # Otherwise, it stays at its current Chef::Config value.
36
+ elsif new_resource.chef_repo_path
37
+ Chef::Config.versioned_cookbooks = true
38
+ end
39
+
40
+ begin
41
+ yield
42
+ ensure
43
+ Chef::Config.versioned_cookbooks = @old_versioned_cookbooks
44
+ end
20
45
  end
21
46
 
22
47
  def copy_to(src_root, dest_root)
@@ -84,7 +109,8 @@ class Chef::Provider::ChefMirror < Chef::Provider::LWRPBase
84
109
  :chef_server_url => new_resource.chef_server[:chef_server_url],
85
110
  :node_name => new_resource.chef_server[:options][:client_name],
86
111
  :client_key => new_resource.chef_server[:options][:client_key],
87
- :repo_mode => repo_mode
112
+ :repo_mode => repo_mode,
113
+ :versioned_cookbooks => Chef::Config.versioned_cookbooks
88
114
  }
89
115
  Chef::ChefFS::FileSystem::ChefServerRootDir.new("remote", config)
90
116
  end
@@ -23,8 +23,9 @@ class Chef::Resource::ChefMirror < Chef::Resource::LWRPBase
23
23
  # versioned_cookbooks defaults to true.
24
24
  attribute :chef_repo_path, :kind_of => [ String, Hash ]
25
25
 
26
- # Whether the repo path contains / should contain cookbooks with versioned names,
26
+ # Whether the repo path should contain cookbooks with versioned names,
27
27
  # i.e. cookbooks/mysql-1.0.0, cookbooks/mysql-1.2.0, etc.
28
+ # Defaults to true if chef_repo_path is specified, or to Chef::Config.versioned_cookbooks otherwise.
28
29
  attribute :versioned_cookbooks, :kind_of => [ TrueClass, FalseClass ]
29
30
 
30
31
  # Chef server
@@ -32,7 +32,7 @@ module Cheffish
32
32
  result = normalize(resource_to_json(new_resource))
33
33
  else
34
34
  # If resource is incomplete, use current json to fill any holes
35
- result = current_json.merge(resource_to_json(new_resource))
35
+ result = Chef::Mixin::DeepMerge.hash_only_merge(current_json, resource_to_json(new_resource))
36
36
  end
37
37
  augment_new_json(result)
38
38
  end
@@ -138,7 +138,7 @@ else
138
138
  class Chef
139
139
  class Util
140
140
  class PathHelper
141
- def join(*args)
141
+ def self.join(*args)
142
142
  Chef::Config.path_join(*args)
143
143
  end
144
144
  end
@@ -1,3 +1,3 @@
1
1
  module Cheffish
2
- VERSION = '0.8'
2
+ VERSION = '0.8.1'
3
3
  end
@@ -8,7 +8,7 @@ repo_path = Dir.mktmpdir('chef_repo')
8
8
  describe Chef::Resource::ChefClient do
9
9
  extend SpecSupport
10
10
 
11
- when_the_chef_server 'is in multi-org mode', :osc_compat => false, :single_org => false do
11
+ when_the_chef_12_server 'is in multi-org mode' do
12
12
  organization 'foo'
13
13
 
14
14
  before :each do
@@ -5,7 +5,7 @@ require 'chef/provider/chef_container'
5
5
  describe Chef::Resource::ChefContainer do
6
6
  extend SpecSupport
7
7
 
8
- when_the_chef_server 'is in multi-org mode', :osc_compat => false, :single_org => false do
8
+ when_the_chef_12_server 'is in multi-org mode' do
9
9
  organization 'foo'
10
10
 
11
11
  before :each do
@@ -5,7 +5,7 @@ require 'chef/provider/chef_group'
5
5
  describe Chef::Resource::ChefGroup do
6
6
  extend SpecSupport
7
7
 
8
- when_the_chef_server 'is in multi-org mode', :osc_compat => false, :single_org => false do
8
+ when_the_chef_12_server 'is in multi-org mode' do
9
9
  organization 'foo'
10
10
 
11
11
  before :each do
@@ -5,17 +5,20 @@ require 'chef/provider/chef_mirror'
5
5
  describe Chef::Resource::ChefMirror do
6
6
  extend SpecSupport
7
7
 
8
- when_the_chef_server 'is in multi-org mode', :osc_compat => false, :single_org => false do
8
+ when_the_chef_12_server 'is in multi-org mode' do
9
9
  organization 'foo'
10
10
 
11
11
  before :each do
12
12
  Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, '/organizations/foo').to_s
13
13
  end
14
14
 
15
- context 'and is empty' do
15
+ describe 'basic download and upload' do
16
16
  when_the_repository 'is full of stuff' do
17
17
  file 'nodes/x.json', {}
18
18
  file 'roles/x.json', {}
19
+ directory 'cookbooks/x' do
20
+ file 'metadata.rb', 'name "x"; version "2.0.0"'
21
+ end
19
22
 
20
23
  it "Download grabs defaults" do
21
24
  run_recipe do
@@ -37,6 +40,7 @@ describe Chef::Resource::ChefMirror do
37
40
  expect(chef_run).to have_updated('chef_mirror[]', :upload)
38
41
  expect { get('nodes/x') }.not_to raise_error
39
42
  expect { get('roles/x') }.not_to raise_error
43
+ expect { get('cookbooks/x/2.0.0') }.not_to raise_error
40
44
  end
41
45
 
42
46
  it 'chef_mirror with concurrency 0 fails with a reasonable message' do
@@ -50,7 +54,96 @@ describe Chef::Resource::ChefMirror do
50
54
  }.to raise_error /chef_mirror.concurrency must be above 0/
51
55
  end
52
56
  end
57
+ end
58
+
59
+ context 'and the Chef server has a node and role in it' do
60
+ node 'x', {}
61
+ role 'x', {}
62
+
63
+ when_the_repository 'is empty' do
64
+ it "Download grabs the node and role" do
65
+ run_recipe do
66
+ chef_mirror '' do
67
+ action :download
68
+ end
69
+ end
70
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
71
+ expect(File.exist?(path_to('nodes/x.json'))).to be true
72
+ expect(File.exist?(path_to('roles/x.json'))).to be true
73
+ end
74
+
75
+ it "Upload uploads nothing" do
76
+ run_recipe do
77
+ chef_mirror '' do
78
+ action :upload
79
+ end
80
+ end
81
+ expect(chef_run).not_to have_updated('chef_mirror[]', :upload)
82
+ end
83
+ end
84
+ end
85
+
86
+ context 'and the Chef server has nodes and roles named x' do
87
+ node 'x', {}
88
+ role 'x', {}
89
+
90
+ when_the_repository 'has nodes and roles named y' do
91
+ file 'nodes/y.json', {}
92
+ file 'roles/y.json', {}
93
+
94
+ it "Download grabs the x's" do
95
+ run_recipe do
96
+ chef_mirror '' do
97
+ action :download
98
+ end
99
+ end
100
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
101
+ expect(File.exist?(path_to('nodes/x.json'))).to be true
102
+ expect(File.exist?(path_to('roles/x.json'))).to be true
103
+ expect(File.exist?(path_to('nodes/y.json'))).to be true
104
+ expect(File.exist?(path_to('roles/y.json'))).to be true
105
+ end
106
+
107
+ it "Upload uploads the y's" do
108
+ run_recipe do
109
+ chef_mirror '' do
110
+ action :upload
111
+ end
112
+ end
113
+ expect(chef_run).to have_updated('chef_mirror[]', :upload)
114
+ expect { get('nodes/x') }.not_to raise_error
115
+ expect { get('roles/x') }.not_to raise_error
116
+ expect { get('nodes/y') }.not_to raise_error
117
+ expect { get('roles/y') }.not_to raise_error
118
+ end
119
+
120
+ it "Download with purge grabs the x's and deletes the y's" do
121
+ run_recipe do
122
+ chef_mirror '' do
123
+ purge true
124
+ action :download
125
+ end
126
+ end
127
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
128
+ expect(File.exist?(path_to('nodes/x.json'))).to be true
129
+ expect(File.exist?(path_to('roles/x.json'))).to be true
130
+ end
131
+
132
+ it "Upload with :purge uploads the y's and deletes the x's" do
133
+ run_recipe do
134
+ chef_mirror '*/*.json' do
135
+ purge true
136
+ action :upload
137
+ end
138
+ end
139
+ expect(chef_run).to have_updated('chef_mirror[*/*.json]', :upload)
140
+ expect { get('nodes/y') }.not_to raise_error
141
+ expect { get('roles/y') }.not_to raise_error
142
+ end
143
+ end
144
+ end
53
145
 
146
+ describe "chef_repo_path" do
54
147
  when_the_repository 'has stuff but no chef_repo_path' do
55
148
  file 'repo/nodes/x.json', {}
56
149
  file 'repo/roles/x.json', {}
@@ -153,92 +246,274 @@ describe Chef::Resource::ChefMirror do
153
246
  end
154
247
  end
155
248
 
156
- context 'and has stuff' do
157
- node 'x', {}
158
- role 'x', {}
249
+ describe "cookbook upload, chef_repo_path and versioned_cookbooks" do
250
+ when_the_repository 'has cookbooks in non-versioned format' do
251
+ file 'cookbooks/x-1.0.0/metadata.rb', 'name "x-1.0.0"; version "2.0.0"'
252
+ file 'cookbooks/y-1.0.0/metadata.rb', 'name "y-3.0.0"; version "4.0.0"'
159
253
 
160
- when_the_repository 'is empty' do
161
- it "Download grabs stuff" do
254
+ it "chef_mirror :upload uploads everything" do
162
255
  run_recipe do
163
256
  chef_mirror '' do
164
- action :download
257
+ action :upload
165
258
  end
166
259
  end
167
- expect(chef_run).to have_updated('chef_mirror[]', :download)
168
- expect(File.exist?(path_to('nodes/x.json'))).to be true
169
- expect(File.exist?(path_to('roles/x.json'))).to be true
260
+ expect(chef_run).to have_updated('chef_mirror[]', :upload)
261
+ expect { get('cookbooks/x-1.0.0/2.0.0') }.not_to raise_error
262
+ expect { get('cookbooks/y-3.0.0/4.0.0') }.not_to raise_error
170
263
  end
171
264
 
172
- it "Upload uploads nothing" do
173
- run_recipe do
174
- chef_mirror '' do
175
- action :upload
265
+ context 'and Chef::Config.versioned_cookbooks is false' do
266
+ before do
267
+ Chef::Config.versioned_cookbooks false
268
+ end
269
+ it "chef_mirror :upload uploads everything" do
270
+ run_recipe do
271
+ chef_mirror '' do
272
+ action :upload
273
+ end
176
274
  end
275
+ expect(chef_run).to have_updated('chef_mirror[]', :upload)
276
+ expect { get('cookbooks/x-1.0.0/2.0.0') }.not_to raise_error
277
+ expect { get('cookbooks/y-3.0.0/4.0.0') }.not_to raise_error
177
278
  end
178
- expect(chef_run).not_to have_updated('chef_mirror[]', :upload)
179
279
  end
180
- end
181
- end
182
280
 
183
- context 'and has nodes and roles named x' do
184
- node 'x', {}
185
- role 'x', {}
281
+ context 'and Chef::Config.chef_repo_path is not set but versioned_cookbooks is false' do
282
+ before do
283
+ Chef::Config.delete(:chef_repo_path)
284
+ Chef::Config.versioned_cookbooks false
285
+ end
186
286
 
187
- when_the_repository 'has nodes and roles named y' do
188
- file 'nodes/y.json', {}
189
- file 'roles/y.json', {}
287
+ it "chef_mirror :upload with chef_repo_path and versioned_cookbooks false uploads cookbooks with name including version" do
288
+ repository_dir = @repository_dir
289
+ run_recipe do
290
+ chef_mirror '' do
291
+ chef_repo_path repository_dir
292
+ versioned_cookbooks false
293
+ action :upload
294
+ end
295
+ end
296
+ expect(chef_run).to have_updated('chef_mirror[]', :upload)
297
+ expect { get('cookbooks/x-1.0.0/2.0.0') }.not_to raise_error
298
+ expect { get('cookbooks/y-3.0.0/4.0.0') }.not_to raise_error
299
+ end
300
+ end
301
+ end
190
302
 
191
- it "Download grabs the x's" do
192
- run_recipe do
193
- chef_mirror '' do
194
- action :download
303
+ when_the_repository 'has cookbooks in versioned_cookbook format' do
304
+ file 'cookbooks/x-1.0.0/metadata.rb', 'name "x"; version "1.0.0"'
305
+ file 'cookbooks/x-2.0.0/metadata.rb', 'name "x"; version "2.0.0"'
306
+
307
+ context 'and Chef::Config.versioned_cookbooks is true' do
308
+ before do
309
+ Chef::Config.versioned_cookbooks true
310
+ end
311
+ it "chef_mirror :upload uploads everything" do
312
+ run_recipe do
313
+ chef_mirror '' do
314
+ action :upload
315
+ end
195
316
  end
317
+ expect(chef_run).to have_updated('chef_mirror[]', :upload)
318
+ expect { get('cookbooks/x/1.0.0') }.not_to raise_error
319
+ expect { get('cookbooks/x/2.0.0') }.not_to raise_error
196
320
  end
197
- expect(chef_run).to have_updated('chef_mirror[]', :download)
198
- expect(File.exist?(path_to('nodes/x.json'))).to be true
199
- expect(File.exist?(path_to('roles/x.json'))).to be true
200
- expect(File.exist?(path_to('nodes/y.json'))).to be true
201
- expect(File.exist?(path_to('roles/y.json'))).to be true
202
321
  end
203
322
 
204
- it "Upload uploads the y's" do
205
- run_recipe do
206
- chef_mirror '' do
207
- action :upload
323
+ context 'and Chef::Config.chef_repo_path set somewhere else' do
324
+ before do
325
+ Chef::Config.chef_repo_path = '/x/y/z'
326
+ end
327
+ it "chef_mirror :upload with chef_repo_path uploads cookbooks" do
328
+ repository_dir = @repository_dir
329
+ run_recipe do
330
+ chef_mirror '' do
331
+ chef_repo_path repository_dir
332
+ action :upload
333
+ end
208
334
  end
335
+ expect(chef_run).to have_updated('chef_mirror[]', :upload)
336
+ expect { get('cookbooks/x/1.0.0') }.not_to raise_error
337
+ expect { get('cookbooks/x/2.0.0') }.not_to raise_error
209
338
  end
210
- expect(chef_run).to have_updated('chef_mirror[]', :upload)
211
- expect { get('nodes/x') }.not_to raise_error
212
- expect { get('roles/x') }.not_to raise_error
213
- expect { get('nodes/y') }.not_to raise_error
214
- expect { get('roles/y') }.not_to raise_error
215
339
  end
216
340
 
217
- it "Download with purge grabs the x's and deletes the y's" do
218
- run_recipe do
219
- chef_mirror '' do
220
- purge true
221
- action :download
341
+ context 'and Chef::Config.chef_repo_path is not set but versioned_cookbooks is false' do
342
+ before do
343
+ Chef::Config.delete(:chef_repo_path)
344
+ Chef::Config.versioned_cookbooks false
345
+ end
346
+
347
+ it "chef_mirror :upload with chef_repo_path uploads cookbooks with name split from version" do
348
+ repository_dir = @repository_dir
349
+ run_recipe do
350
+ chef_mirror '' do
351
+ chef_repo_path repository_dir
352
+ action :upload
353
+ end
222
354
  end
355
+ expect(chef_run).to have_updated('chef_mirror[]', :upload)
356
+ expect { get('cookbooks/x/1.0.0') }.not_to raise_error
357
+ expect { get('cookbooks/x/2.0.0') }.not_to raise_error
358
+ end
359
+
360
+ it "chef_mirror :upload with chef_repo_path and versioned_cookbooks uploads cookbooks with name split from version" do
361
+ repository_dir = @repository_dir
362
+ run_recipe do
363
+ chef_mirror '' do
364
+ chef_repo_path repository_dir
365
+ versioned_cookbooks true
366
+ action :upload
367
+ end
368
+ end
369
+ expect(chef_run).to have_updated('chef_mirror[]', :upload)
370
+ expect { get('cookbooks/x/1.0.0') }.not_to raise_error
371
+ expect { get('cookbooks/x/2.0.0') }.not_to raise_error
223
372
  end
224
- expect(chef_run).to have_updated('chef_mirror[]', :download)
225
- expect(File.exist?(path_to('nodes/x.json'))).to be true
226
- expect(File.exist?(path_to('roles/x.json'))).to be true
227
373
  end
228
374
 
229
- it "Upload with :purge uploads the y's and deletes the x's" do
230
- run_recipe do
231
- chef_mirror '*/*.json' do
232
- purge true
233
- action :upload
375
+ context 'and Chef::Config.chef_repo_path is not set but versioned_cookbooks is true' do
376
+ before do
377
+ Chef::Config.delete(:chef_repo_path)
378
+ Chef::Config.versioned_cookbooks true
379
+ end
380
+ it "chef_mirror :upload with chef_repo_path uploads cookbooks with name split from version" do
381
+ repository_dir = @repository_dir
382
+ run_recipe do
383
+ chef_mirror '' do
384
+ chef_repo_path repository_dir
385
+ action :upload
386
+ end
234
387
  end
388
+ expect(chef_run).to have_updated('chef_mirror[]', :upload)
389
+ expect { get('cookbooks/x/1.0.0') }.not_to raise_error
390
+ expect { get('cookbooks/x/2.0.0') }.not_to raise_error
235
391
  end
236
- expect(chef_run).to have_updated('chef_mirror[*/*.json]', :upload)
237
- expect { get('nodes/y') }.not_to raise_error
238
- expect { get('roles/y') }.not_to raise_error
239
392
  end
240
393
  end
241
394
  end
242
395
 
396
+ describe 'cookbook download, chef_repo_path, and versioned_cookbooks' do
397
+ context 'when the Chef server has a cookbook with multiple versions' do
398
+ cookbook 'x', '1.0.0', 'metadata.rb' => 'name "x"; version "1.0.0"'
399
+ cookbook 'x', '2.0.0', 'metadata.rb' => 'name "x"; version "2.0.0"'
400
+
401
+ when_the_repository 'is empty' do
402
+ it 'chef_mirror :download downloads the latest version of the cookbook' do
403
+ run_recipe do
404
+ chef_mirror '' do
405
+ action :download
406
+ end
407
+ end
408
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
409
+ expect(File.read(path_to('cookbooks/x/metadata.rb'))).to eq('name "x"; version "2.0.0"')
410
+ end
411
+
412
+ it 'chef_mirror :download with versioned_cookbooks = true downloads all versions of the cookbook' do
413
+ run_recipe do
414
+ chef_mirror '' do
415
+ versioned_cookbooks true
416
+ action :download
417
+ end
418
+ end
419
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
420
+ expect(File.read(path_to('cookbooks/x-1.0.0/metadata.rb'))).to eq('name "x"; version "1.0.0"')
421
+ expect(File.read(path_to('cookbooks/x-2.0.0/metadata.rb'))).to eq('name "x"; version "2.0.0"')
422
+ end
423
+
424
+ context 'and Chef::Config.chef_repo_path is set elsewhere' do
425
+ before do
426
+ Chef::Config.chef_repo_path = '/x/y/z'
427
+ end
428
+
429
+ it 'chef_mirror :download with chef_repo_path downloads all versions of the cookbook' do
430
+ repository_dir = @repository_dir
431
+ run_recipe do
432
+ chef_mirror '' do
433
+ chef_repo_path repository_dir
434
+ action :download
435
+ end
436
+ end
437
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
438
+ expect(File.read(path_to('cookbooks/x-1.0.0/metadata.rb'))).to eq('name "x"; version "1.0.0"')
439
+ expect(File.read(path_to('cookbooks/x-2.0.0/metadata.rb'))).to eq('name "x"; version "2.0.0"')
440
+ end
441
+
442
+ it 'chef_mirror :download with chef_repo_path and versioned_cookbooks = false downloads the latest version of the cookbook' do
443
+ repository_dir = @repository_dir
444
+ run_recipe do
445
+ chef_mirror '' do
446
+ chef_repo_path repository_dir
447
+ versioned_cookbooks false
448
+ action :download
449
+ end
450
+ end
451
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
452
+ expect(File.read(path_to('cookbooks/x/metadata.rb'))).to eq('name "x"; version "2.0.0"')
453
+ end
454
+ end
455
+
456
+ context 'and Chef::Config.versioned_cookbooks is true' do
457
+ before do
458
+ Chef::Config.versioned_cookbooks = true
459
+ end
460
+
461
+ it 'chef_mirror :download downloads all versions of the cookbook' do
462
+ run_recipe do
463
+ chef_mirror '' do
464
+ action :download
465
+ end
466
+ end
467
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
468
+ expect(File.read(path_to('cookbooks/x-1.0.0/metadata.rb'))).to eq('name "x"; version "1.0.0"')
469
+ expect(File.read(path_to('cookbooks/x-2.0.0/metadata.rb'))).to eq('name "x"; version "2.0.0"')
470
+ end
471
+
472
+ it 'chef_mirror :download with versioned_cookbooks = false downloads the latest version of the cookbook' do
473
+ run_recipe do
474
+ chef_mirror '' do
475
+ versioned_cookbooks false
476
+ action :download
477
+ end
478
+ end
479
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
480
+ expect(File.read(path_to('cookbooks/x/metadata.rb'))).to eq('name "x"; version "2.0.0"')
481
+ end
482
+
483
+ context 'and Chef::Config.chef_repo_path is set elsewhere' do
484
+ before do
485
+ Chef::Config.chef_repo_path = '/x/y/z'
486
+ end
487
+
488
+ it 'chef_mirror :download with chef_repo_path downloads all versions of the cookbook' do
489
+ repository_dir = @repository_dir
490
+ run_recipe do
491
+ chef_mirror '' do
492
+ chef_repo_path repository_dir
493
+ action :download
494
+ end
495
+ end
496
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
497
+ expect(File.read(path_to('cookbooks/x-1.0.0/metadata.rb'))).to eq('name "x"; version "1.0.0"')
498
+ expect(File.read(path_to('cookbooks/x-2.0.0/metadata.rb'))).to eq('name "x"; version "2.0.0"')
499
+ end
500
+
501
+ it 'chef_mirror :download with chef_repo_path and versioned_cookbooks = false downloads the latest version of the cookbook' do
502
+ repository_dir = @repository_dir
503
+ run_recipe do
504
+ chef_mirror '' do
505
+ chef_repo_path repository_dir
506
+ versioned_cookbooks false
507
+ action :download
508
+ end
509
+ end
510
+ expect(chef_run).to have_updated('chef_mirror[]', :download)
511
+ expect(File.read(path_to('cookbooks/x/metadata.rb'))).to eq('name "x"; version "2.0.0"')
512
+ end
513
+ end
514
+ end
515
+ end
516
+ end
517
+ end
243
518
  end
244
519
  end
@@ -5,7 +5,7 @@ require 'chef/provider/chef_node'
5
5
  describe Chef::Resource::ChefNode do
6
6
  extend SpecSupport
7
7
 
8
- when_the_chef_server 'is in multi-org mode', :osc_compat => false, :single_org => false do
8
+ when_the_chef_12_server 'is in multi-org mode' do
9
9
  organization 'foo'
10
10
 
11
11
  before :each do
@@ -129,6 +129,34 @@ describe Chef::Resource::ChefNode do
129
129
  end
130
130
  end
131
131
 
132
+ context 'with chef_node "blah" and an updated normal attribute value' do
133
+ with_converge do
134
+ chef_node 'blah' do
135
+ attributes 'foo' => 'fum'
136
+ end
137
+ end
138
+
139
+ it 'new normal attribute is added' do
140
+ expect(chef_run).to have_updated 'chef_node[blah]', :create
141
+ node = get('nodes/blah')
142
+ expect(node['normal']).to eq({ 'foo' => 'fum', 'tags' => [ 'a', 'b' ] })
143
+ end
144
+ end
145
+
146
+ context 'with chef_node "blah" and a new normal attribute' do
147
+ with_converge do
148
+ chef_node 'blah' do
149
+ attributes 'foe' => 'fum'
150
+ end
151
+ end
152
+
153
+ it 'new normal attribute is added' do
154
+ expect(chef_run).to have_updated 'chef_node[blah]', :create
155
+ node = get('nodes/blah')
156
+ expect(node['normal']).to eq({ 'foe' => 'fum', 'foo' => 'bar', 'tags' => [ 'a', 'b' ] })
157
+ end
158
+ end
159
+
132
160
  context 'with chef_node "blah" with complete true' do
133
161
  with_converge do
134
162
  chef_node 'blah' do
@@ -147,6 +175,22 @@ describe Chef::Resource::ChefNode do
147
175
  expect(node['override']).to eq({ 'foo4' => 'bar4' })
148
176
  end
149
177
  end
178
+
179
+ context 'with chef_node "blah", complete true and a new normal attribute' do
180
+ with_converge do
181
+ chef_node 'blah' do
182
+ attributes 'foe' => 'fum'
183
+ complete true
184
+ end
185
+ end
186
+
187
+ it 'normal foo attribute is replaced with new attribute' do
188
+ expect(chef_run).to have_updated 'chef_node[blah]', :create
189
+ node = get('nodes/blah')
190
+ expect(node['normal']).to eq({ 'foe' => 'fum', 'tags' => [ 'a', 'b' ] })
191
+ end
192
+ end
193
+
150
194
  end
151
195
  end
152
196
 
@@ -5,7 +5,7 @@ require 'chef/provider/chef_organization'
5
5
  describe Chef::Resource::ChefOrganization do
6
6
  extend SpecSupport
7
7
 
8
- when_the_chef_server 'is in multi-org mode', :osc_compat => false, :single_org => false do
8
+ when_the_chef_12_server 'is in multi-org mode' do
9
9
  context 'and chef_server_url is pointed at the top level' do
10
10
  user 'u', {}
11
11
  user 'u2', {}
@@ -44,7 +44,7 @@ describe Chef::Resource::ChefUser do
44
44
  end
45
45
  end
46
46
 
47
- when_the_chef_server 'is multitenant', :osc_compat => false, :single_org => false do
47
+ when_the_chef_12_server 'is in multi-org mode' do
48
48
  context 'and chef_server_url is pointed at the top level' do
49
49
  context 'and we run a recipe that creates user "blah"'do
50
50
  with_converge do
@@ -9,6 +9,12 @@ require 'support/repository_support'
9
9
  module SpecSupport
10
10
  include ChefZero::RSpec
11
11
 
12
+ def when_the_chef_12_server(*args, &block)
13
+ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new('3.1')
14
+ when_the_chef_server(*args, :osc_compat => false, :single_org => false, &block)
15
+ end
16
+ end
17
+
12
18
  def self.extended(klass)
13
19
  klass.class_eval do
14
20
  extend RepositorySupport
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cheffish
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.8'
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Keiser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-05 00:00:00.000000000 Z
11
+ date: 2014-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef