chef 12.11.18-universal-mingw32 → 12.12.13-universal-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -4
- data/Rakefile +3 -2
- data/VERSION +1 -1
- data/acceptance/Gemfile.lock +22 -23
- data/acceptance/data-collector/test/integration/default/serverspec/default_spec.rb +2 -41
- data/lib/chef/application/solo.rb +7 -0
- data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +1 -1
- data/lib/chef/data_collector.rb +79 -43
- data/lib/chef/data_collector/messages.rb +4 -33
- data/lib/chef/data_collector/messages/helpers.rb +2 -2
- data/lib/chef/data_collector/resource_report.rb +21 -11
- data/lib/chef/decorator/unchain.rb +43 -0
- data/lib/chef/exceptions.rb +5 -0
- data/lib/chef/http.rb +5 -5
- data/lib/chef/knife/cookbook_create.rb +4 -0
- data/lib/chef/knife/cookbook_site_download.rb +8 -1
- data/lib/chef/knife/cookbook_site_install.rb +8 -0
- data/lib/chef/knife/cookbook_site_list.rb +8 -1
- data/lib/chef/knife/cookbook_site_search.rb +8 -1
- data/lib/chef/knife/cookbook_site_share.rb +8 -1
- data/lib/chef/knife/cookbook_site_show.rb +14 -3
- data/lib/chef/knife/cookbook_site_unshare.rb +8 -1
- data/lib/chef/knife/core/bootstrap_context.rb +1 -1
- data/lib/chef/knife/supermarket_download.rb +33 -0
- data/lib/chef/knife/supermarket_install.rb +33 -0
- data/lib/chef/knife/supermarket_list.rb +33 -0
- data/lib/chef/knife/supermarket_search.rb +33 -0
- data/lib/chef/knife/supermarket_share.rb +33 -0
- data/lib/chef/knife/supermarket_show.rb +33 -0
- data/lib/chef/knife/supermarket_unshare.rb +33 -0
- data/lib/chef/node.rb +13 -32
- data/lib/chef/node/attribute.rb +123 -70
- data/lib/chef/node/attribute_collections.rb +9 -130
- data/lib/chef/node/common_api.rb +124 -0
- data/lib/chef/node/immutable_collections.rb +27 -2
- data/lib/chef/property.rb +6 -2
- data/lib/chef/provider.rb +4 -5
- data/lib/chef/provider/batch.rb +1 -1
- data/lib/chef/provider/directory.rb +3 -1
- data/lib/chef/provider/package/openbsd.rb +1 -1
- data/lib/chef/provider/package/rubygems.rb +9 -3
- data/lib/chef/provider/package/windows/exe.rb +2 -5
- data/lib/chef/provider/powershell_script.rb +1 -1
- data/lib/chef/provider/remote_directory.rb +2 -0
- data/lib/chef/resource.rb +22 -17
- data/lib/chef/resource_builder.rb +9 -4
- data/lib/chef/shell.rb +1 -1
- data/lib/chef/version.rb +1 -1
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +2 -4
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +2 -3
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -2
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +2 -3
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +2 -3
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +2 -3
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +2 -3
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +2 -3
- data/spec/functional/assets/chocolatey_feed/test-A.1.0.nupkg +0 -0
- data/spec/functional/assets/chocolatey_feed/test-A.1.5.nupkg +0 -0
- data/spec/functional/assets/chocolatey_feed/test-A.2.0.nupkg +0 -0
- data/spec/functional/assets/chocolatey_feed/test-B.1.0.nupkg +0 -0
- data/spec/functional/resource/dsc_script_spec.rb +1 -0
- data/spec/functional/resource/package_spec.rb +1 -1
- data/spec/functional/resource/template_spec.rb +3 -3
- data/spec/functional/shell_spec.rb +1 -1
- data/spec/integration/knife/client_bulk_delete_spec.rb +130 -0
- data/spec/integration/knife/client_create_spec.rb +69 -0
- data/spec/integration/knife/client_delete_spec.rb +63 -0
- data/spec/integration/knife/client_key_create_spec.rb +65 -0
- data/spec/integration/knife/client_key_delete_spec.rb +42 -0
- data/spec/integration/knife/client_key_list_spec.rb +60 -0
- data/spec/integration/knife/client_key_show_spec.rb +44 -0
- data/spec/integration/knife/client_list_spec.rb +48 -0
- data/spec/integration/knife/client_show_spec.rb +36 -0
- data/spec/integration/knife/cookbook_bulk_delete_spec.rb +64 -0
- data/spec/integration/knife/cookbook_download_spec.rb +95 -0
- data/spec/integration/knife/cookbook_list_spec.rb +54 -0
- data/spec/integration/knife/cookbook_show_spec.rb +159 -0
- data/spec/integration/knife/cookbook_upload_spec.rb +90 -0
- data/spec/integration/knife/data_bag_create_spec.rb +58 -0
- data/spec/integration/knife/data_bag_delete_spec.rb +58 -0
- data/spec/integration/knife/data_bag_from_file_spec.rb +115 -0
- data/spec/integration/knife/data_bag_list_spec.rb +43 -0
- data/spec/integration/knife/data_bag_show_spec.rb +53 -0
- data/spec/integration/knife/environment_compare_spec.rb +74 -0
- data/spec/integration/knife/environment_create_spec.rb +40 -0
- data/spec/integration/knife/environment_delete_spec.rb +36 -0
- data/spec/integration/knife/environment_from_file_spec.rb +115 -0
- data/spec/integration/knife/environment_list_spec.rb +41 -0
- data/spec/integration/knife/environment_show_spec.rb +56 -0
- data/spec/integration/knife/node_bulk_delete_spec.rb +51 -0
- data/spec/integration/knife/node_create_spec.rb +46 -0
- data/spec/integration/knife/node_delete_spec.rb +47 -0
- data/spec/integration/knife/node_environment_set_spec.rb +42 -0
- data/spec/integration/knife/node_from_file_spec.rb +58 -0
- data/spec/integration/knife/node_list_spec.rb +44 -0
- data/spec/integration/knife/node_run_list_add_spec.rb +53 -0
- data/spec/integration/knife/node_run_list_remove_spec.rb +35 -0
- data/spec/integration/knife/node_run_list_set_spec.rb +40 -0
- data/spec/integration/knife/node_show_spec.rb +35 -0
- data/spec/integration/knife/role_bulk_delete_spec.rb +51 -0
- data/spec/integration/knife/role_create_spec.rb +40 -0
- data/spec/integration/knife/role_delete_spec.rb +47 -0
- data/spec/integration/knife/role_from_file_spec.rb +95 -0
- data/spec/integration/knife/role_list_spec.rb +44 -0
- data/spec/integration/knife/role_show_spec.rb +50 -0
- data/spec/support/shared/integration/knife_support.rb +10 -3
- data/spec/unit/application/solo_spec.rb +7 -0
- data/spec/unit/cookbook_version_spec.rb +4 -4
- data/spec/unit/data_collector/messages/helpers_spec.rb +3 -7
- data/spec/unit/data_collector/messages_spec.rb +28 -45
- data/spec/unit/data_collector_spec.rb +40 -47
- data/spec/unit/knife/cookbook_create_spec.rb +1 -0
- data/spec/unit/knife/cookbook_site_download_spec.rb +1 -0
- data/spec/unit/knife/node_environment_set_spec.rb +0 -24
- data/spec/unit/knife/node_run_list_set_spec.rb +0 -25
- data/spec/unit/node/attribute_spec.rb +7 -9
- data/spec/unit/node/immutable_collections_spec.rb +4 -0
- data/spec/unit/node/vivid_mash_spec.rb +344 -0
- data/spec/unit/node_spec.rb +115 -26
- data/spec/unit/provider/directory_spec.rb +11 -1
- data/spec/unit/provider/package/windows/exe_spec.rb +14 -9
- data/spec/unit/provider/powershell_script_spec.rb +4 -4
- data/spec/unit/provider/remote_directory_spec.rb +15 -0
- data/spec/unit/recipe_spec.rb +31 -6
- data/spec/unit/run_context_spec.rb +2 -2
- data/spec/unit/shell/shell_session_spec.rb +1 -1
- data/tasks/dependencies.rb +0 -2
- metadata +55 -786
- data/acceptance/.bundle/config +0 -2
- data/acceptance/basics/.kitchen/logs/chef-current-install-ubuntu-1404.log +0 -2
- data/acceptance/basics/.kitchen/logs/kitchen.log +0 -3
- data/acceptance/fips/.kitchen/logs/fips-integration-centos-6.log +0 -3
- data/acceptance/fips/.kitchen/logs/fips-integration-windows-2012r2.log +0 -3
- data/acceptance/fips/.kitchen/logs/fips-unit-functional-centos-6.log +0 -3
- data/acceptance/fips/.kitchen/logs/fips-unit-functional-windows-2012r2.log +0 -3
- data/acceptance/fips/.kitchen/logs/kitchen.log +0 -6
- data/acceptance/trivial/.kitchen/logs/chef-current-install-windows-2012r2.log +0 -2
- data/acceptance/trivial/.kitchen/logs/kitchen.log +0 -3
- data/acceptance/windows-service/.kitchen/logs/chef-windows-service-windows-2012r2.log +0 -2
- data/acceptance/windows-service/.kitchen/logs/kitchen.log +0 -3
data/spec/unit/node_spec.rb
CHANGED
@@ -233,60 +233,63 @@ describe Chef::Node do
|
|
233
233
|
end
|
234
234
|
|
235
235
|
it "should let you go deep with attribute?" do
|
236
|
-
node.
|
236
|
+
node.normal["battles"]["people"]["wonkey"] = true
|
237
237
|
expect(node["battles"]["people"].attribute?("wonkey")).to eq(true)
|
238
238
|
expect(node["battles"]["people"].attribute?("snozzberry")).to eq(false)
|
239
239
|
end
|
240
240
|
|
241
241
|
it "does not allow you to set an attribute via method_missing" do
|
242
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
242
243
|
expect { node.sunshine = "is bright" }.to raise_error(Chef::Exceptions::ImmutableAttributeModification)
|
243
244
|
end
|
244
245
|
|
245
246
|
it "should allow you get get an attribute via method_missing" do
|
247
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
246
248
|
node.default.sunshine = "is bright"
|
247
249
|
expect(node.sunshine).to eql("is bright")
|
248
250
|
end
|
249
251
|
|
250
252
|
describe "normal attributes" do
|
251
253
|
it "should allow you to set an attribute with set, without pre-declaring a hash" do
|
252
|
-
node.
|
254
|
+
node.normal[:snoopy][:is_a_puppy] = true
|
253
255
|
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
254
256
|
end
|
255
257
|
|
256
258
|
it "should allow you to set an attribute with set_unless" do
|
257
|
-
node.
|
259
|
+
node.normal_unless[:snoopy][:is_a_puppy] = false
|
258
260
|
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
259
261
|
end
|
260
262
|
|
261
263
|
it "should not allow you to set an attribute with set_unless if it already exists" do
|
262
|
-
node.
|
263
|
-
node.
|
264
|
+
node.normal[:snoopy][:is_a_puppy] = true
|
265
|
+
node.normal_unless[:snoopy][:is_a_puppy] = false
|
264
266
|
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
265
267
|
end
|
266
268
|
|
267
269
|
it "should allow you to set an attribute with set_unless if is a nil value" do
|
268
270
|
node.attributes.normal = { snoopy: { is_a_puppy: nil } }
|
269
|
-
node.
|
271
|
+
node.normal_unless[:snoopy][:is_a_puppy] = false
|
270
272
|
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
271
273
|
end
|
272
274
|
|
273
275
|
it "should allow you to set a value after a set_unless" do
|
274
276
|
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
275
|
-
node.
|
276
|
-
node.
|
277
|
+
node.normal_unless[:snoopy][:is_a_puppy] = false
|
278
|
+
node.normal[:snoopy][:is_a_puppy] = true
|
277
279
|
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
278
280
|
end
|
279
281
|
|
280
282
|
it "should let you set a value after a 'dangling' set_unless" do
|
281
283
|
# this tests for set_unless_present state bleeding between statements CHEF-3806
|
282
|
-
node.
|
283
|
-
node.
|
284
|
-
node.
|
284
|
+
node.normal[:snoopy][:is_a_puppy] = "what"
|
285
|
+
node.normal_unless[:snoopy][:is_a_puppy]
|
286
|
+
node.normal[:snoopy][:is_a_puppy] = true
|
285
287
|
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
286
288
|
end
|
287
289
|
|
288
290
|
it "auto-vivifies attributes created via method syntax" do
|
289
|
-
|
291
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
292
|
+
node.normal.fuu.bahrr.baz = "qux"
|
290
293
|
expect(node.fuu.bahrr.baz).to eq("qux")
|
291
294
|
end
|
292
295
|
|
@@ -295,6 +298,20 @@ describe Chef::Node do
|
|
295
298
|
node.tag("three", "four")
|
296
299
|
expect(node["tags"]).to eq(%w{one two three four})
|
297
300
|
end
|
301
|
+
|
302
|
+
it "set is a deprecated alias for normal" do
|
303
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
304
|
+
expect(Chef).to receive(:log_deprecation).with(/set is deprecated/)
|
305
|
+
node.set[:snoopy][:is_a_puppy] = true
|
306
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
307
|
+
end
|
308
|
+
|
309
|
+
it "set_unless is a deprecated alias for normal_unless" do
|
310
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
311
|
+
expect(Chef).to receive(:log_deprecation).with(/set_unless is deprecated/)
|
312
|
+
node.set_unless[:snoopy][:is_a_puppy] = false
|
313
|
+
expect(node[:snoopy][:is_a_puppy]).to eq(false)
|
314
|
+
end
|
298
315
|
end
|
299
316
|
|
300
317
|
describe "default attributes" do
|
@@ -329,7 +346,14 @@ describe Chef::Node do
|
|
329
346
|
expect(node[:snoopy][:is_a_puppy]).to eq(true)
|
330
347
|
end
|
331
348
|
|
349
|
+
it "does not exhibit chef/chef/issues/5005 bug" do
|
350
|
+
node.env_default["a"]["r1"]["g"]["u"] = "u1"
|
351
|
+
node.default_unless["a"]["r1"]["g"]["r"] = "r"
|
352
|
+
expect(node["a"]["r1"]["g"]["u"]).to eql("u1")
|
353
|
+
end
|
354
|
+
|
332
355
|
it "auto-vivifies attributes created via method syntax" do
|
356
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
333
357
|
node.default.fuu.bahrr.baz = "qux"
|
334
358
|
expect(node.fuu.bahrr.baz).to eq("qux")
|
335
359
|
end
|
@@ -368,6 +392,7 @@ describe Chef::Node do
|
|
368
392
|
end
|
369
393
|
|
370
394
|
it "auto-vivifies attributes created via method syntax" do
|
395
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
371
396
|
node.override.fuu.bahrr.baz = "qux"
|
372
397
|
expect(node.fuu.bahrr.baz).to eq("qux")
|
373
398
|
end
|
@@ -453,8 +478,9 @@ describe Chef::Node do
|
|
453
478
|
expect( node["mysql"]["server"][0]["port"] ).to be_nil
|
454
479
|
end
|
455
480
|
|
456
|
-
it "
|
457
|
-
|
481
|
+
it "when mistaking arrays for hashes, it considers the value removed and does nothing" do
|
482
|
+
node.rm("mysql", "server", "port")
|
483
|
+
expect(node["mysql"]["server"][0]["port"]).to eql(3456)
|
458
484
|
end
|
459
485
|
end
|
460
486
|
end
|
@@ -706,6 +732,7 @@ describe Chef::Node do
|
|
706
732
|
#
|
707
733
|
describe "deep merge attribute cache edge conditions" do
|
708
734
|
it "does not error with complicated attribute substitution" do
|
735
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
709
736
|
node.default["chef_attribute_hell"]["attr1"] = "attribute1"
|
710
737
|
node.default["chef_attribute_hell"]["attr2"] = "#{node.chef_attribute_hell.attr1}/attr2"
|
711
738
|
expect { node.default["chef_attribute_hell"]["attr3"] = "#{node.chef_attribute_hell.attr2}/attr3" }.not_to raise_error
|
@@ -720,6 +747,7 @@ describe Chef::Node do
|
|
720
747
|
end
|
721
748
|
|
722
749
|
it "method interpolation syntax also works" do
|
750
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
723
751
|
node.default["passenger"]["version"] = "4.0.57"
|
724
752
|
node.default["passenger"]["root_path"] = "passenger-#{node['passenger']['version']}"
|
725
753
|
node.default["passenger"]["root_path_2"] = "passenger-#{node.passenger['version']}"
|
@@ -729,6 +757,7 @@ describe Chef::Node do
|
|
729
757
|
end
|
730
758
|
|
731
759
|
it "should raise an ArgumentError if you ask for an attribute that doesn't exist via method_missing" do
|
760
|
+
Chef::Config[:treat_deprecation_warnings_as_errors] = false
|
732
761
|
expect { node.sunshine }.to raise_error(NoMethodError)
|
733
762
|
end
|
734
763
|
|
@@ -744,6 +773,51 @@ describe Chef::Node do
|
|
744
773
|
expect(seen_attributes["sunshine"]).to eq("is bright")
|
745
774
|
expect(seen_attributes["canada"]).to eq("is a nice place")
|
746
775
|
end
|
776
|
+
|
777
|
+
describe "functional attribute API" do
|
778
|
+
# deeper functional testing of this API is in the VividMash spec tests
|
779
|
+
it "should have an exist? function" do
|
780
|
+
node.default["foo"]["bar"] = "baz"
|
781
|
+
expect(node.exist?("foo", "bar")).to be true
|
782
|
+
expect(node.exist?("bar", "foo")).to be false
|
783
|
+
end
|
784
|
+
|
785
|
+
it "should have a read function" do
|
786
|
+
node.override["foo"]["bar"] = "baz"
|
787
|
+
expect(node.read("foo", "bar")).to eql("baz")
|
788
|
+
expect(node.read("bar", "foo")).to eql(nil)
|
789
|
+
end
|
790
|
+
|
791
|
+
it "should have a read! function" do
|
792
|
+
node.override["foo"]["bar"] = "baz"
|
793
|
+
expect(node.read!("foo", "bar")).to eql("baz")
|
794
|
+
expect { node.read!("bar", "foo") }.to raise_error(Chef::Exceptions::NoSuchAttribute)
|
795
|
+
end
|
796
|
+
|
797
|
+
it "delegates write(:level) to node.level.write()" do
|
798
|
+
node.write(:default, "foo", "bar", "baz")
|
799
|
+
expect(node.default["foo"]["bar"]).to eql("baz")
|
800
|
+
end
|
801
|
+
|
802
|
+
it "delegates write!(:level) to node.level.write!()" do
|
803
|
+
node.write!(:default, "foo", "bar", "baz")
|
804
|
+
expect(node.default["foo"]["bar"]).to eql("baz")
|
805
|
+
node.default["bar"] = true
|
806
|
+
expect { node.write!(:default, "bar", "foo", "baz") }.to raise_error(Chef::Exceptions::AttributeTypeMismatch)
|
807
|
+
end
|
808
|
+
|
809
|
+
it "delegates unlink(:level) to node.level.unlink()" do
|
810
|
+
node.default["foo"]["bar"] = "baz"
|
811
|
+
expect(node.unlink(:default, "foo", "bar")).to eql("baz")
|
812
|
+
expect(node.unlink(:default, "bar", "foo")).to eql(nil)
|
813
|
+
end
|
814
|
+
|
815
|
+
it "delegates unlink!(:level) to node.level.unlink!()" do
|
816
|
+
node.default["foo"]["bar"] = "baz"
|
817
|
+
expect(node.unlink!(:default, "foo", "bar")).to eql("baz")
|
818
|
+
expect { node.unlink!(:default, "bar", "foo") }.to raise_error(Chef::Exceptions::NoSuchAttribute)
|
819
|
+
end
|
820
|
+
end
|
747
821
|
end
|
748
822
|
|
749
823
|
describe "consuming json" do
|
@@ -789,8 +863,8 @@ describe Chef::Node do
|
|
789
863
|
|
790
864
|
it "should add json attributes to the node" do
|
791
865
|
node.consume_external_attrs(@ohai_data, { "one" => "two", "three" => "four" })
|
792
|
-
expect(node
|
793
|
-
expect(node
|
866
|
+
expect(node["one"]).to eql("two")
|
867
|
+
expect(node["three"]).to eql("four")
|
794
868
|
end
|
795
869
|
|
796
870
|
it "should set the tags attribute to an empty array if it is not already defined" do
|
@@ -824,17 +898,17 @@ describe Chef::Node do
|
|
824
898
|
|
825
899
|
it "deep merges attributes instead of overwriting them" do
|
826
900
|
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
|
827
|
-
expect(node
|
901
|
+
expect(node["one"].to_hash).to eq({ "two" => { "three" => "four" } })
|
828
902
|
node.consume_external_attrs(@ohai_data, "one" => { "abc" => "123" })
|
829
903
|
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "foo" => "bar" } })
|
830
|
-
expect(node
|
904
|
+
expect(node["one"].to_hash).to eq({ "two" => { "three" => "four", "foo" => "bar" }, "abc" => "123" })
|
831
905
|
end
|
832
906
|
|
833
907
|
it "gives attributes from JSON priority when deep merging" do
|
834
908
|
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "four" } })
|
835
|
-
expect(node
|
909
|
+
expect(node["one"].to_hash).to eq({ "two" => { "three" => "four" } })
|
836
910
|
node.consume_external_attrs(@ohai_data, "one" => { "two" => { "three" => "forty-two" } })
|
837
|
-
expect(node
|
911
|
+
expect(node["one"].to_hash).to eq({ "two" => { "three" => "forty-two" } })
|
838
912
|
end
|
839
913
|
|
840
914
|
end
|
@@ -1036,10 +1110,10 @@ describe Chef::Node do
|
|
1036
1110
|
end
|
1037
1111
|
|
1038
1112
|
it "sets attributes from the files" do
|
1039
|
-
expect(node
|
1040
|
-
expect(node
|
1041
|
-
expect(node
|
1042
|
-
expect(node
|
1113
|
+
expect(node["ldap_server"]).to eql("ops1prod")
|
1114
|
+
expect(node["ldap_basedn"]).to eql("dc=hjksolutions,dc=com")
|
1115
|
+
expect(node["ldap_replication_password"]).to eql("forsure")
|
1116
|
+
expect(node["smokey"]).to eql("robinson")
|
1043
1117
|
end
|
1044
1118
|
|
1045
1119
|
it "gives a sensible error when attempting to load a missing attributes file" do
|
@@ -1083,8 +1157,8 @@ describe Chef::Node do
|
|
1083
1157
|
it "should load a node from a ruby file" do
|
1084
1158
|
node.from_file(File.expand_path(File.join(CHEF_SPEC_DATA, "nodes", "test.rb")))
|
1085
1159
|
expect(node.name).to eql("test.example.com-short")
|
1086
|
-
expect(node
|
1087
|
-
expect(node
|
1160
|
+
expect(node["sunshine"]).to eql("in")
|
1161
|
+
expect(node["something"]).to eql("else")
|
1088
1162
|
expect(node.run_list).to eq(["operations-master", "operations-monitoring"])
|
1089
1163
|
end
|
1090
1164
|
|
@@ -1562,4 +1636,19 @@ describe Chef::Node do
|
|
1562
1636
|
end
|
1563
1637
|
end
|
1564
1638
|
|
1639
|
+
describe "method_missing handling" do
|
1640
|
+
it "should have an #empty? method via Chef::Node::Attribute" do
|
1641
|
+
node.default["foo"] = "bar"
|
1642
|
+
expect(node.empty?).to be false
|
1643
|
+
end
|
1644
|
+
|
1645
|
+
it "it should correctly implement #respond_to?" do
|
1646
|
+
expect(node.respond_to?(:empty?)).to be true
|
1647
|
+
end
|
1648
|
+
|
1649
|
+
it "it should correctly retrieve the method with #method" do
|
1650
|
+
expect(node.method(:empty?)).to be_kind_of(Method)
|
1651
|
+
end
|
1652
|
+
end
|
1653
|
+
|
1565
1654
|
end
|
@@ -227,7 +227,7 @@ describe Chef::Provider::Directory do
|
|
227
227
|
end
|
228
228
|
end
|
229
229
|
|
230
|
-
describe "#run_action(:
|
230
|
+
describe "#run_action(:delete)" do
|
231
231
|
describe "when the directory exists" do
|
232
232
|
it "deletes the directory" do
|
233
233
|
directory.run_action(:delete)
|
@@ -238,6 +238,16 @@ describe Chef::Provider::Directory do
|
|
238
238
|
directory.run_action(:delete)
|
239
239
|
expect(new_resource).to be_updated
|
240
240
|
end
|
241
|
+
|
242
|
+
it "does not use rm_rf which silently consumes errors" do
|
243
|
+
expect(FileUtils).not_to receive(:rm_rf)
|
244
|
+
expect(FileUtils).to receive(:rm_r)
|
245
|
+
# set recursive or FileUtils isn't used at all.
|
246
|
+
new_resource.recursive(true)
|
247
|
+
directory.run_action(:delete)
|
248
|
+
# reset back...
|
249
|
+
new_resource.recursive(false)
|
250
|
+
end
|
241
251
|
end
|
242
252
|
|
243
253
|
describe "when the directory does not exist" do
|
@@ -110,23 +110,28 @@ describe Chef::Provider::Package::Windows::Exe do
|
|
110
110
|
end
|
111
111
|
|
112
112
|
describe "remove_package" do
|
113
|
-
|
114
|
-
|
115
|
-
|
113
|
+
before do
|
114
|
+
allow(::File).to receive(:exist?).and_return(false)
|
115
|
+
end
|
116
|
+
|
117
|
+
context "no version given and one package installed with unquoted uninstall string" do
|
118
|
+
it "removes installed package and quotes uninstall string" do
|
119
|
+
allow(::File).to receive(:exist?).with("uninst_dir/uninst_file").and_return(true)
|
120
|
+
expect(provider).to receive(:shell_out!).with(/start \"\" \/wait \"uninst_dir\/uninst_file\" \/S \/NCRC & exit %%%%ERRORLEVEL%%%%/, kind_of(Hash))
|
116
121
|
provider.remove_package
|
117
122
|
end
|
118
123
|
end
|
119
124
|
|
120
|
-
context "several packages installed" do
|
125
|
+
context "several packages installed with quoted uninstall strings" do
|
121
126
|
let(:uninstall_hash) do
|
122
127
|
[
|
123
128
|
{
|
124
129
|
"DisplayVersion" => "v1",
|
125
|
-
"UninstallString" => File.join("uninst_dir1", "uninst_file1"),
|
130
|
+
"UninstallString" => "\"#{File.join("uninst_dir1", "uninst_file1")}\"",
|
126
131
|
},
|
127
132
|
{
|
128
133
|
"DisplayVersion" => "v2",
|
129
|
-
"UninstallString" => File.join("uninst_dir2", "uninst_file2"),
|
134
|
+
"UninstallString" => "\"#{File.join("uninst_dir2", "uninst_file2")}\"",
|
130
135
|
},
|
131
136
|
]
|
132
137
|
end
|
@@ -134,15 +139,15 @@ describe Chef::Provider::Package::Windows::Exe do
|
|
134
139
|
context "version given and installed" do
|
135
140
|
it "removes given version" do
|
136
141
|
new_resource.version("v2")
|
137
|
-
expect(provider).to receive(:shell_out!).with(/start \"\" \/wait
|
142
|
+
expect(provider).to receive(:shell_out!).with(/start \"\" \/wait \"uninst_dir2\/uninst_file2\" \/S \/NCRC & exit %%%%ERRORLEVEL%%%%/, kind_of(Hash))
|
138
143
|
provider.remove_package
|
139
144
|
end
|
140
145
|
end
|
141
146
|
|
142
147
|
context "no version given" do
|
143
148
|
it "removes both versions" do
|
144
|
-
expect(provider).to receive(:shell_out!).with(/start \"\" \/wait
|
145
|
-
expect(provider).to receive(:shell_out!).with(/start \"\" \/wait
|
149
|
+
expect(provider).to receive(:shell_out!).with(/start \"\" \/wait \"uninst_dir1\/uninst_file1\" \/S \/NCRC & exit %%%%ERRORLEVEL%%%%/, kind_of(Hash))
|
150
|
+
expect(provider).to receive(:shell_out!).with(/start \"\" \/wait \"uninst_dir2\/uninst_file2\" \/S \/NCRC & exit %%%%ERRORLEVEL%%%%/, kind_of(Hash))
|
146
151
|
provider.remove_package
|
147
152
|
end
|
148
153
|
end
|
@@ -43,8 +43,8 @@ describe Chef::Provider::PowershellScript, "action_run" do
|
|
43
43
|
allow(Chef::Platform).to receive(:windows_nano_server?).and_return(true)
|
44
44
|
allow(provider).to receive(:is_forced_32bit).and_return(false)
|
45
45
|
os_info_double = double("os_info")
|
46
|
-
allow(provider.run_context.node
|
47
|
-
allow(os_info_double).to receive(:system_directory).and_return("C:\\Windows\\system32")
|
46
|
+
allow(provider.run_context.node["kernel"]).to receive(:[]).with("os_info").and_return(os_info_double)
|
47
|
+
allow(os_info_double).to receive(:[]).with("system_directory").and_return("C:\\Windows\\system32")
|
48
48
|
end
|
49
49
|
|
50
50
|
it "sets the -Command flag as the last flag" do
|
@@ -58,8 +58,8 @@ describe Chef::Provider::PowershellScript, "action_run" do
|
|
58
58
|
allow(Chef::Platform).to receive(:windows_nano_server?).and_return(false)
|
59
59
|
allow(provider).to receive(:is_forced_32bit).and_return(false)
|
60
60
|
os_info_double = double("os_info")
|
61
|
-
allow(provider.run_context.node
|
62
|
-
allow(os_info_double).to receive(:system_directory).and_return("C:\\Windows\\system32")
|
61
|
+
allow(provider.run_context.node["kernel"]).to receive(:[]).with("os_info").and_return(os_info_double)
|
62
|
+
allow(os_info_double).to receive(:[]).with("system_directory").and_return("C:\\Windows\\system32")
|
63
63
|
end
|
64
64
|
|
65
65
|
it "sets the -File flag as the last flag" do
|
@@ -99,6 +99,21 @@ describe Chef::Provider::RemoteDirectory do
|
|
99
99
|
expect(cookbook_file.owner).to eq("toor")
|
100
100
|
expect(cookbook_file.backup).to eq(23)
|
101
101
|
end
|
102
|
+
|
103
|
+
it "respects sensitive flag" do
|
104
|
+
@resource.cookbook "gondola_rides"
|
105
|
+
@resource.sensitive true
|
106
|
+
cookbook_file = @provider.send(:cookbook_file_resource,
|
107
|
+
"/target/destination/path.txt",
|
108
|
+
"relative/source/path.txt")
|
109
|
+
expect(cookbook_file.sensitive).to eq(true)
|
110
|
+
|
111
|
+
@resource.sensitive false
|
112
|
+
cookbook_file = @provider.send(:cookbook_file_resource,
|
113
|
+
"/target/destination/path.txt",
|
114
|
+
"relative/source/path.txt")
|
115
|
+
expect(cookbook_file.sensitive).to eq(false)
|
116
|
+
end
|
102
117
|
end
|
103
118
|
|
104
119
|
describe "when creating the remote directory" do
|
data/spec/unit/recipe_spec.rb
CHANGED
@@ -195,9 +195,7 @@ describe Chef::Recipe do
|
|
195
195
|
|
196
196
|
describe "when cloning resources" do
|
197
197
|
def expect_warning
|
198
|
-
expect(Chef
|
199
|
-
expect(Chef::Log).to receive(:warn).with(/Previous/)
|
200
|
-
expect(Chef::Log).to receive(:warn).with(/Current/)
|
198
|
+
expect(Chef).to receive(:log_deprecation).with(/^Cloning resource attributes for zen_master\[klopp\]/)
|
201
199
|
end
|
202
200
|
|
203
201
|
it "should emit a 3694 warning when attributes change" do
|
@@ -244,7 +242,7 @@ describe Chef::Recipe do
|
|
244
242
|
|
245
243
|
it "should not emit a 3694 warning for completely trivial resource cloning" do
|
246
244
|
recipe.zen_master "klopp"
|
247
|
-
expect(Chef
|
245
|
+
expect(Chef).to_not receive(:log_deprecation)
|
248
246
|
recipe.zen_master "klopp"
|
249
247
|
end
|
250
248
|
|
@@ -252,7 +250,7 @@ describe Chef::Recipe do
|
|
252
250
|
recipe.zen_master "klopp" do
|
253
251
|
action :nothing
|
254
252
|
end
|
255
|
-
expect(Chef
|
253
|
+
expect(Chef).to_not receive(:log_deprecation)
|
256
254
|
recipe.zen_master "klopp" do
|
257
255
|
action :score
|
258
256
|
end
|
@@ -262,12 +260,33 @@ describe Chef::Recipe do
|
|
262
260
|
recipe.zen_master "klopp" do
|
263
261
|
action :score
|
264
262
|
end
|
265
|
-
expect(Chef
|
263
|
+
expect(Chef).to_not receive(:log_deprecation)
|
266
264
|
recipe.zen_master "klopp" do
|
267
265
|
action :nothing
|
268
266
|
end
|
269
267
|
end
|
270
268
|
|
269
|
+
class Coerced < Chef::Resource
|
270
|
+
resource_name :coerced
|
271
|
+
provides :coerced
|
272
|
+
default_action :whatever
|
273
|
+
property :package_name, [String, Array], coerce: proc { |x| [x].flatten }, name_property: true
|
274
|
+
def after_created
|
275
|
+
Array(action).each do |action|
|
276
|
+
run_action(action)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
action :whatever do
|
280
|
+
package_name # unlazy the package_name
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
it "does not emit 3694 when the name_property is unlazied by running it at compile_time" do
|
285
|
+
recipe.coerced "string"
|
286
|
+
expect(Chef).to_not receive(:log_deprecation)
|
287
|
+
recipe.coerced "string"
|
288
|
+
end
|
289
|
+
|
271
290
|
it "validating resources via build_resource" do
|
272
291
|
expect {recipe.build_resource(:remote_file, "klopp") do
|
273
292
|
source Chef::DelayedEvaluator.new { "http://chef.io" }
|
@@ -299,6 +318,7 @@ describe Chef::Recipe do
|
|
299
318
|
end
|
300
319
|
|
301
320
|
it "will insert another resource if create_if_missing is not set (cloned resource as of Chef-12)" do
|
321
|
+
expect(Chef).to receive(:log_deprecation).with(/^Cloning resource attributes for zen_master\[klopp\]/)
|
302
322
|
zm_resource
|
303
323
|
recipe.declare_resource(:zen_master, "klopp")
|
304
324
|
expect(run_context.resource_collection.count).to eql(2)
|
@@ -421,15 +441,18 @@ describe Chef::Recipe do
|
|
421
441
|
end
|
422
442
|
|
423
443
|
it "copies attributes from the first resource" do
|
444
|
+
expect(Chef).to receive(:log_deprecation).with(/^Cloning resource attributes for zen_master\[klopp\]/)
|
424
445
|
expect(duplicated_resource.something).to eq("bvb09")
|
425
446
|
end
|
426
447
|
|
427
448
|
it "does not copy the action from the first resource" do
|
449
|
+
expect(Chef).to receive(:log_deprecation).with(/^Cloning resource attributes for zen_master\[klopp\]/)
|
428
450
|
expect(original_resource.action).to eq([:score])
|
429
451
|
expect(duplicated_resource.action).to eq([:nothing])
|
430
452
|
end
|
431
453
|
|
432
454
|
it "does not copy the source location of the first resource" do
|
455
|
+
expect(Chef).to receive(:log_deprecation).with(/^Cloning resource attributes for zen_master\[klopp\]/)
|
433
456
|
# sanity check source location:
|
434
457
|
expect(original_resource.source_line).to include(__FILE__)
|
435
458
|
expect(duplicated_resource.source_line).to include(__FILE__)
|
@@ -438,10 +461,12 @@ describe Chef::Recipe do
|
|
438
461
|
end
|
439
462
|
|
440
463
|
it "sets the cookbook name on the cloned resource to that resource's cookbook" do
|
464
|
+
expect(Chef).to receive(:log_deprecation).with(/^Cloning resource attributes for zen_master\[klopp\]/)
|
441
465
|
expect(duplicated_resource.cookbook_name).to eq("second_cb")
|
442
466
|
end
|
443
467
|
|
444
468
|
it "sets the recipe name on the cloned resource to that resoure's recipe" do
|
469
|
+
expect(Chef).to receive(:log_deprecation).with(/^Cloning resource attributes for zen_master\[klopp\]/)
|
445
470
|
expect(duplicated_resource.recipe_name).to eq("second_recipe")
|
446
471
|
end
|
447
472
|
|