chef 15.11.8-universal-mingw32 → 15.16.2-universal-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +12 -13
  3. data/README.md +3 -3
  4. data/Rakefile +11 -17
  5. data/chef-universal-mingw32.gemspec +4 -4
  6. data/chef.gemspec +25 -7
  7. data/distro/powershell/chef/chef.psm1 +3 -3
  8. data/distro/templates/powershell/chef/chef.psm1.erb +3 -3
  9. data/lib/chef/api_client/registration.rb +2 -2
  10. data/lib/chef/application/apply.rb +1 -1
  11. data/lib/chef/chef_fs/file_system/repository/base_file.rb +1 -0
  12. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +2 -2
  13. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +1 -1
  14. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +2 -2
  15. data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
  16. data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +1 -1
  17. data/lib/chef/chef_fs/path_utils.rb +3 -3
  18. data/lib/chef/cookbook/file_system_file_vendor.rb +1 -1
  19. data/lib/chef/data_bag.rb +2 -2
  20. data/lib/chef/data_collector/error_handlers.rb +1 -1
  21. data/lib/chef/deprecated.rb +12 -0
  22. data/lib/chef/dsl/declare_resource.rb +1 -1
  23. data/lib/chef/dsl/platform_introspection.rb +2 -0
  24. data/lib/chef/environment.rb +2 -2
  25. data/lib/chef/exceptions.rb +3 -0
  26. data/lib/chef/http.rb +2 -1
  27. data/lib/chef/knife/bootstrap.rb +6 -9
  28. data/lib/chef/knife/bootstrap/templates/chef-full.erb +9 -9
  29. data/lib/chef/knife/bootstrap/train_connector.rb +1 -0
  30. data/lib/chef/knife/cookbook_download.rb +1 -1
  31. data/lib/chef/knife/cookbook_metadata.rb +1 -1
  32. data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
  33. data/lib/chef/knife/core/hashed_command_loader.rb +3 -2
  34. data/lib/chef/knife/core/subcommand_loader.rb +1 -1
  35. data/lib/chef/knife/exec.rb +2 -2
  36. data/lib/chef/knife/ssh.rb +20 -1
  37. data/lib/chef/log.rb +1 -1
  38. data/lib/chef/mixin/openssl_helper.rb +26 -3
  39. data/lib/chef/mixin/template.rb +1 -0
  40. data/lib/chef/node_map.rb +5 -2
  41. data/lib/chef/provider/mount/solaris.rb +0 -1
  42. data/lib/chef/provider/package/cab.rb +1 -1
  43. data/lib/chef/provider/package/chocolatey.rb +1 -1
  44. data/lib/chef/provider/package/dnf/dnf_helper.py +5 -0
  45. data/lib/chef/provider/package/freebsd/pkgng.rb +3 -1
  46. data/lib/chef/provider/package/msu.rb +1 -0
  47. data/lib/chef/provider/package/powershell.rb +5 -1
  48. data/lib/chef/provider/package/snap.rb +96 -27
  49. data/lib/chef/provider/package/yum/yum_helper.py +4 -0
  50. data/lib/chef/provider/package/zypper.rb +0 -1
  51. data/lib/chef/provider/service/arch.rb +2 -2
  52. data/lib/chef/provider/service/debian.rb +1 -1
  53. data/lib/chef/provider/service/gentoo.rb +2 -2
  54. data/lib/chef/provider/service/macosx.rb +2 -2
  55. data/lib/chef/provider/service/openbsd.rb +1 -1
  56. data/lib/chef/provider/service/redhat.rb +2 -2
  57. data/lib/chef/provider/service/upstart.rb +1 -1
  58. data/lib/chef/provider/yum_repository.rb +1 -1
  59. data/lib/chef/provider/zypper_repository.rb +31 -11
  60. data/lib/chef/resource.rb +2 -0
  61. data/lib/chef/resource/archive_file.rb +28 -8
  62. data/lib/chef/resource/cron_access.rb +13 -5
  63. data/lib/chef/resource/cron_d.rb +2 -1
  64. data/lib/chef/resource/homebrew_cask.rb +3 -3
  65. data/lib/chef/resource/hostname.rb +19 -18
  66. data/lib/chef/resource/locale.rb +1 -1
  67. data/lib/chef/resource/lwrp_base.rb +7 -0
  68. data/lib/chef/resource/msu_package.rb +5 -0
  69. data/lib/chef/resource/ssh_known_hosts_entry.rb +1 -1
  70. data/lib/chef/resource/sudo.rb +2 -2
  71. data/lib/chef/resource/windows_feature_powershell.rb +6 -2
  72. data/lib/chef/resource/windows_font.rb +2 -1
  73. data/lib/chef/role.rb +2 -2
  74. data/lib/chef/shell.rb +32 -1
  75. data/lib/chef/shell/shell_session.rb +2 -0
  76. data/lib/chef/util/diff.rb +1 -1
  77. data/lib/chef/util/dsc/configuration_generator.rb +1 -1
  78. data/lib/chef/util/powershell/cmdlet.rb +1 -1
  79. data/lib/chef/version.rb +2 -2
  80. data/lib/chef/version_string.rb +1 -1
  81. data/lib/chef/win32/file.rb +2 -2
  82. data/spec/functional/knife/ssh_spec.rb +4 -4
  83. data/spec/functional/resource/aix_service_spec.rb +0 -1
  84. data/spec/functional/resource/aixinit_service_spec.rb +7 -8
  85. data/spec/functional/resource/apt_package_spec.rb +0 -1
  86. data/spec/functional/resource/bff_spec.rb +2 -2
  87. data/spec/functional/resource/cookbook_file_spec.rb +1 -1
  88. data/spec/functional/resource/cron_spec.rb +0 -1
  89. data/spec/functional/resource/dsc_resource_spec.rb +1 -1
  90. data/spec/functional/resource/insserv_spec.rb +4 -5
  91. data/spec/functional/resource/link_spec.rb +17 -17
  92. data/spec/functional/resource/msu_package_spec.rb +5 -2
  93. data/spec/functional/resource/rpm_spec.rb +2 -2
  94. data/spec/functional/resource/user/dscl_spec.rb +1 -1
  95. data/spec/functional/resource/user/mac_user_spec.rb +1 -1
  96. data/spec/functional/resource/windows_certificate_spec.rb +3 -3
  97. data/spec/functional/resource/windows_font_spec.rb +49 -0
  98. data/spec/functional/resource/windows_task_spec.rb +8 -8
  99. data/spec/functional/run_lock_spec.rb +2 -1
  100. data/spec/functional/shell_spec.rb +5 -5
  101. data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
  102. data/spec/functional/version_spec.rb +1 -1
  103. data/spec/functional/win32/service_manager_spec.rb +1 -1
  104. data/spec/integration/recipes/accumulator_spec.rb +1 -1
  105. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +2 -2
  106. data/spec/integration/recipes/lwrp_spec.rb +1 -1
  107. data/spec/integration/recipes/notifies_spec.rb +1 -1
  108. data/spec/integration/recipes/notifying_block_spec.rb +1 -1
  109. data/spec/integration/recipes/recipe_dsl_spec.rb +1 -1
  110. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +2 -0
  111. data/spec/integration/recipes/resource_load_spec.rb +1 -0
  112. data/spec/integration/recipes/unified_mode_spec.rb +1 -1
  113. data/spec/scripts/ssl-serve.rb +1 -1
  114. data/spec/spec_helper.rb +10 -8
  115. data/spec/support/platform_helpers.rb +12 -42
  116. data/spec/support/platforms/win32/spec_service.rb +1 -1
  117. data/spec/support/shared/functional/directory_resource.rb +1 -1
  118. data/spec/support/shared/functional/execute_resource.rb +1 -1
  119. data/spec/support/shared/functional/file_resource.rb +2 -2
  120. data/spec/support/shared/functional/win32_service.rb +1 -1
  121. data/spec/support/shared/functional/windows_script.rb +3 -3
  122. data/spec/support/shared/integration/knife_support.rb +2 -5
  123. data/spec/unit/application_spec.rb +7 -0
  124. data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +2 -4
  125. data/spec/unit/cookbook/gem_installer_spec.rb +2 -1
  126. data/spec/unit/data_bag_spec.rb +1 -1
  127. data/spec/unit/dsl/platform_introspection_spec.rb +1 -0
  128. data/spec/unit/environment_spec.rb +7 -7
  129. data/spec/unit/event_dispatch/dispatcher_spec.rb +3 -0
  130. data/spec/unit/knife/bootstrap_spec.rb +16 -16
  131. data/spec/unit/knife/cookbook_download_spec.rb +4 -4
  132. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -1
  133. data/spec/unit/knife/cookbook_upload_spec.rb +5 -6
  134. data/spec/unit/knife/core/hashed_command_loader_spec.rb +3 -3
  135. data/spec/unit/knife/ssh_spec.rb +2 -2
  136. data/spec/unit/knife/supermarket_share_spec.rb +5 -3
  137. data/spec/unit/lwrp_spec.rb +4 -4
  138. data/spec/unit/mixin/securable_spec.rb +0 -1
  139. data/spec/unit/mixin/user_context_spec.rb +1 -9
  140. data/spec/unit/property_spec.rb +6 -6
  141. data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -1
  142. data/spec/unit/provider/package/freebsd/pkgng_spec.rb +1 -1
  143. data/spec/unit/provider/package/powershell_spec.rb +95 -86
  144. data/spec/unit/provider/package/rubygems_spec.rb +5 -10
  145. data/spec/unit/provider/package/snap_spec.rb +1 -1
  146. data/spec/unit/provider/package/windows_spec.rb +30 -53
  147. data/spec/unit/provider/service/arch_service_spec.rb +3 -2
  148. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  149. data/spec/unit/provider/service/gentoo_service_spec.rb +7 -7
  150. data/spec/unit/provider/service/macosx_spec.rb +3 -3
  151. data/spec/unit/provider/service/redhat_spec.rb +2 -2
  152. data/spec/unit/provider/service/upstart_service_spec.rb +3 -3
  153. data/spec/unit/provider/service/windows_spec.rb +2 -6
  154. data/spec/unit/provider/systemd_unit_spec.rb +28 -24
  155. data/spec/unit/provider/zypper_repository_spec.rb +75 -25
  156. data/spec/unit/provider_spec.rb +1 -0
  157. data/spec/unit/resource/archive_file_spec.rb +11 -2
  158. data/spec/unit/resource/msu_package_spec.rb +4 -0
  159. data/spec/unit/resource/windows_dns_record_spec.rb +3 -3
  160. data/spec/unit/resource/windows_dns_zone_spec.rb +2 -2
  161. data/spec/unit/resource/windows_feature_powershell_spec.rb +30 -4
  162. data/spec/unit/resource/windows_package_spec.rb +1 -0
  163. data/spec/unit/resource/windows_task_spec.rb +1 -1
  164. data/spec/unit/resource/windows_uac_spec.rb +2 -2
  165. data/spec/unit/resource/yum_repository_spec.rb +21 -21
  166. data/spec/unit/resource_spec.rb +1 -1
  167. data/spec/unit/role_spec.rb +11 -11
  168. data/spec/unit/run_context/cookbook_compiler_spec.rb +1 -1
  169. data/spec/unit/util/threaded_job_queue_spec.rb +9 -0
  170. data/spec/unit/win32/security_spec.rb +4 -3
  171. metadata +64 -39
@@ -169,7 +169,7 @@ describe Chef::Provider::Package::Snap do
169
169
 
170
170
  it "does not throw an error if installed version not found" do
171
171
  provider.load_current_resource
172
- expect(provider.get_current_versions).to eq([nil])
172
+ expect(provider.get_current_versions).to eq([])
173
173
  end
174
174
  end
175
175
  end
@@ -42,7 +42,7 @@ describe Chef::Provider::Package::Windows, :windows_only do
42
42
  let(:cache_path) { 'c:\\cache\\' }
43
43
 
44
44
  before(:each) do
45
- allow(::File).to receive(:exist?).with(provider.new_resource.source).and_return(true)
45
+ allow(::File).to receive(:exist?).with(new_resource.source).and_return(true)
46
46
  end
47
47
 
48
48
  describe "load_current_resource" do
@@ -66,20 +66,22 @@ describe Chef::Provider::Package::Windows, :windows_only do
66
66
 
67
67
  it "sets the version to be installed" do
68
68
  provider.load_current_resource
69
- expect(provider.new_resource.version).to eql("2.0")
69
+ expect(new_resource.version).to eql("2.0")
70
70
  end
71
71
  end
72
72
 
73
- context "when the source is a uri" do
74
- let(:resource_source) { "https://foo.bar/calculator.msi" }
75
-
76
- context "when the source has not been downloaded" do
73
+ context "when the source is not present it loads from cache" do
74
+ context "when the package is not installed" do
77
75
  before(:each) do
78
- allow(provider).to receive(:downloadable_file_missing?).and_return(true)
76
+ allow(provider).to receive(:uri_scheme?).and_return(false)
77
+ allow(provider.package_provider).to receive(:get_product_property).and_return(nil)
78
+ allow(provider.package_provider).to receive(:get_installed_version).and_return(nil)
79
+ allow(provider.package_provider).to receive(:package_version).and_return(nil)
79
80
  end
80
- it "sets the current version to unknown" do
81
+
82
+ it "sets the current version nil" do
81
83
  provider.load_current_resource
82
- expect(provider.current_resource.version).to eql("unknown")
84
+ expect(provider.current_resource.version).to eql(nil)
83
85
  end
84
86
  end
85
87
 
@@ -233,9 +235,9 @@ describe Chef::Provider::Package::Windows, :windows_only do
233
235
  end
234
236
  end
235
237
 
236
- it "returns @installer_type if it is set" do
237
- provider.new_resource.installer_type(:downeaster)
238
- expect(provider.installer_type).to eql(:downeaster)
238
+ it "returns the resource's installer_type if it is set" do
239
+ new_resource.installer_type(:nsis)
240
+ expect(provider.installer_type).to eql(:nsis)
239
241
  end
240
242
 
241
243
  it "sets installer_type to inno if the source contains inno" do
@@ -275,7 +277,7 @@ describe Chef::Provider::Package::Windows, :windows_only do
275
277
 
276
278
  it "raises an error" do
277
279
  allow(::Kernel).to receive(:open).and_yield(StringIO.new(""))
278
- provider.new_resource.installer_type(nil)
280
+ new_resource.installer_type(nil)
279
281
  expect { provider.installer_type }.to raise_error(Chef::Exceptions::CannotDetermineWindowsInstallerType)
280
282
  end
281
283
  end
@@ -312,7 +314,10 @@ describe Chef::Provider::Package::Windows, :windows_only do
312
314
  let(:resource_source) { "https://foo.bar/calculator.exe" }
313
315
 
314
316
  it "downloads the http resource" do
315
- allow(File).to receive(:exist?).with('c:\cache\calculator.exe').and_return(false)
317
+ allow(provider).to receive(:uri_scheme?).and_return(true)
318
+ allow(provider).to receive(:installer_type).and_return(nil)
319
+ allow(File).to receive(:exist?).with("https\\foo.bar\\calculator.exe").and_return(false)
320
+ allow(provider).to receive(:compile_and_converge_action)
316
321
  expect(provider).to receive(:download_source_file)
317
322
  provider.run_action(:install)
318
323
  end
@@ -400,7 +405,7 @@ describe Chef::Provider::Package::Windows, :windows_only do
400
405
  let(:resource_source) { "C:/a_missing_file.exe" }
401
406
  let(:installer_type) { nil }
402
407
  before do
403
- allow(::File).to receive(:exist?).with(provider.new_resource.source).and_return(false)
408
+ allow(::File).to receive(:exist?).with(new_resource.source).and_return(false)
404
409
  provider.load_current_resource
405
410
  end
406
411
 
@@ -414,51 +419,23 @@ describe Chef::Provider::Package::Windows, :windows_only do
414
419
  Chef::Config[:why_run] = false
415
420
  end
416
421
  end
417
- end
418
422
 
419
- shared_context "valid checksum" do
420
- context "checksum is valid" do
421
- before do
422
- allow(provider).to receive(:checksum).and_return("jiie00u3bbs92vsbhvgvklb2lasgh20ah")
423
- end
423
+ it "does not raise an error with a valid checksum" do
424
+ expect(Chef::Digester).to receive(:checksum_for_file).with(new_resource.source).and_return("abcdef1234567890")
425
+ expect(provider).to receive(:install_package)
424
426
 
425
- it "does not raise the checksum mismatch exception" do
426
- expect { provider.send(:validate_content!) }.to_not raise_error
427
- end
428
- end
429
- end
430
-
431
- shared_context "invalid checksum" do
432
- context "checksum is invalid" do
433
- before do
434
- allow(provider).to receive(:checksum).and_return("kiie30u3bbs92vsbhvgvklb2lasgh20ah")
435
- end
427
+ new_resource.checksum("abcdef1234567890")
436
428
 
437
- it "raises the checksum mismatch exception" do
438
- expect { provider.send(:validate_content!) }.to raise_error(
439
- Chef::Exceptions::ChecksumMismatch
440
- )
441
- end
429
+ provider.run_action(:install)
442
430
  end
443
- end
444
431
 
445
- describe "validate_content!" do
446
- before(:each) do
447
- new_resource.checksum("jiie00u3bbs92vsbhvgvklb2lasgh20ah")
448
- end
449
-
450
- context "checksum is in lowercase" do
451
- include_context "valid checksum"
452
- include_context "invalid checksum"
453
- end
432
+ it "raises an error with an invalid checksum" do
433
+ expect(Chef::Digester).to receive(:checksum_for_file).with(new_resource.source).and_return("abcdef1234567890")
434
+ expect(provider).not_to receive(:install_package)
454
435
 
455
- context "checksum is in uppercase" do
456
- before do
457
- new_resource.checksum = new_resource.checksum.upcase
458
- end
436
+ new_resource.checksum("ffffffffffffffff")
459
437
 
460
- include_context "valid checksum"
461
- include_context "invalid checksum"
438
+ expect { provider.run_action(:install) }.to raise_error(Chef::Exceptions::Package)
462
439
  end
463
440
  end
464
441
  end
@@ -37,7 +37,8 @@ describe Chef::Provider::Service::Arch, "load_current_resource" do
37
37
 
38
38
  @provider = Chef::Provider::Service::Arch.new(@new_resource, @run_context)
39
39
 
40
- allow(::File).to receive(:exists?).with("/etc/rc.conf").and_return(true)
40
+ allow(::File).to receive(:exist?).with("/etc/rc.d/chef").and_return(false)
41
+ allow(::File).to receive(:exist?).with("/etc/rc.conf").and_return(true)
41
42
  allow(::File).to receive(:read).with("/etc/rc.conf").and_return("DAEMONS=(network apache sshd)")
42
43
  end
43
44
 
@@ -106,7 +107,7 @@ describe Chef::Provider::Service::Arch, "load_current_resource" do
106
107
  end
107
108
 
108
109
  it "should fail if file /etc/rc.conf does not exist" do
109
- allow(::File).to receive(:exists?).with("/etc/rc.conf").and_return(false)
110
+ allow(::File).to receive(:exist?).with("/etc/rc.conf").and_return(false)
110
111
  expect { @provider.load_current_resource }.to raise_error(Chef::Exceptions::Service)
111
112
  end
112
113
 
@@ -47,7 +47,7 @@ describe Chef::Provider::Service::Debian do
47
47
 
48
48
  describe "load_current_resource" do
49
49
  it "ensures /usr/sbin/update-rc.d is available" do
50
- expect(File).to receive(:exists?).with("/usr/sbin/update-rc.d") .and_return(false)
50
+ expect(File).to receive(:exist?).with("/usr/sbin/update-rc.d").and_return(false)
51
51
 
52
52
  @provider.define_resource_requirements
53
53
  expect do
@@ -32,16 +32,16 @@ describe Chef::Provider::Service::Gentoo do
32
32
  allow(Chef::Resource::Service).to receive(:new).and_return(@current_resource)
33
33
  @status = double("Status", exitstatus: 0, stdout: @stdout)
34
34
  allow(@provider).to receive(:shell_out).and_return(@status)
35
- allow(File).to receive(:exists?).with("/etc/init.d/chef").and_return(true)
36
- allow(File).to receive(:exists?).with("/sbin/rc-update").and_return(true)
37
- allow(File).to receive(:exists?).with("/etc/runlevels/default/chef").and_return(false)
35
+ allow(File).to receive(:exist?).with("/etc/init.d/chef").and_return(true)
36
+ allow(File).to receive(:exist?).with("/sbin/rc-update").and_return(true)
37
+ allow(File).to receive(:exist?).with("/etc/runlevels/default/chef").and_return(false)
38
38
  allow(File).to receive(:readable?).with("/etc/runlevels/default/chef").and_return(false)
39
39
  end
40
40
  # new test: found_enabled state
41
41
  #
42
42
  describe "load_current_resource" do
43
43
  it "should raise Chef::Exceptions::Service if /sbin/rc-update does not exist" do
44
- expect(File).to receive(:exists?).with("/sbin/rc-update").and_return(false)
44
+ expect(File).to receive(:exist?).with("/sbin/rc-update").and_return(false)
45
45
  @provider.define_resource_requirements
46
46
  expect { @provider.process_resource_requirements }.to raise_error(Chef::Exceptions::Service)
47
47
  end
@@ -65,7 +65,7 @@ describe Chef::Provider::Service::Gentoo do
65
65
 
66
66
  describe "and the file exists and is readable" do
67
67
  before do
68
- allow(File).to receive(:exists?).with("/etc/runlevels/default/chef").and_return(true)
68
+ allow(File).to receive(:exist?).with("/etc/runlevels/default/chef").and_return(true)
69
69
  allow(File).to receive(:readable?).with("/etc/runlevels/default/chef").and_return(true)
70
70
  end
71
71
  it "should set enabled to true" do
@@ -76,7 +76,7 @@ describe Chef::Provider::Service::Gentoo do
76
76
 
77
77
  describe "and the file exists but is not readable" do
78
78
  before do
79
- allow(File).to receive(:exists?).with("/etc/runlevels/default/chef").and_return(true)
79
+ allow(File).to receive(:exist?).with("/etc/runlevels/default/chef").and_return(true)
80
80
  allow(File).to receive(:readable?).with("/etc/runlevels/default/chef").and_return(false)
81
81
  end
82
82
 
@@ -88,7 +88,7 @@ describe Chef::Provider::Service::Gentoo do
88
88
 
89
89
  describe "and the file does not exist" do
90
90
  before do
91
- allow(File).to receive(:exists?).with("/etc/runlevels/default/chef").and_return(false)
91
+ allow(File).to receive(:exist?).with("/etc/runlevels/default/chef").and_return(false)
92
92
  allow(File).to receive(:readable?).with("/etc/runlevels/default/chef").and_return("foobarbaz")
93
93
  end
94
94
 
@@ -86,7 +86,7 @@ describe Chef::Provider::Service::Macosx do
86
86
  .with(/(#{su_cmd} '#{cmd}'|#{cmd})/, default_env: false)
87
87
  .and_return(double("Status",
88
88
  stdout: launchctl_stdout, exitstatus: 0))
89
- allow(File).to receive(:exists?).and_return([true], [])
89
+ allow(File).to receive(:exist?).and_return([true], [])
90
90
  allow(provider).to receive(:shell_out!)
91
91
  .with(/plutil -convert xml1 -o/, default_env: false)
92
92
  .and_return(double("Status", stdout: plutil_stdout))
@@ -112,7 +112,7 @@ describe Chef::Provider::Service::Macosx do
112
112
 
113
113
  before do
114
114
  allow(Dir).to receive(:glob).and_return([])
115
- allow(File).to receive(:exists?).and_return([true], [])
115
+ allow(File).to receive(:exist?).and_return([true], [])
116
116
  allow(provider).to receive(:shell_out!)
117
117
  .with(/plutil -convert xml1 -o/)
118
118
  .and_raise(Mixlib::ShellOut::ShellCommandFailed)
@@ -168,7 +168,7 @@ describe Chef::Provider::Service::Macosx do
168
168
  describe "running unsupported actions" do
169
169
  before do
170
170
  allow(Dir).to receive(:glob).and_return([(plist).to_s], [])
171
- allow(File).to receive(:exists?).and_return([true], [])
171
+ allow(File).to receive(:exist?).and_return([true], [])
172
172
  end
173
173
  it "should throw an exception when reload action is attempted" do
174
174
  expect { provider.run_action(:reload) }.to raise_error(Chef::Exceptions::UnsupportedAction)
@@ -21,7 +21,7 @@ require "ostruct"
21
21
 
22
22
  shared_examples_for "define_resource_requirements_common" do
23
23
  it "should raise an error if /sbin/chkconfig does not exist" do
24
- allow(File).to receive(:exists?).with("/sbin/chkconfig").and_return(false)
24
+ allow(File).to receive(:exist?).with("/sbin/chkconfig").and_return(false)
25
25
  allow(@provider).to receive(:shell_out).with("/sbin/service chef status").and_raise(Errno::ENOENT)
26
26
  allow(@provider).to receive(:shell_out!).with("/sbin/chkconfig --list chef", returns: [0, 1]).and_raise(Errno::ENOENT)
27
27
  @provider.load_current_resource
@@ -55,7 +55,7 @@ describe "Chef::Provider::Service::Redhat" do
55
55
  @provider = Chef::Provider::Service::Redhat.new(@new_resource, @run_context)
56
56
  @provider.action = :start
57
57
  allow(Chef::Resource::Service).to receive(:new).and_return(@current_resource)
58
- allow(File).to receive(:exists?).with("/sbin/chkconfig").and_return(true)
58
+ allow(File).to receive(:exist?).with("/sbin/chkconfig").and_return(true)
59
59
  end
60
60
 
61
61
  describe "while not in why run mode" do
@@ -74,7 +74,7 @@ describe Chef::Provider::Service::Upstart do
74
74
  @status = double("Status", exitstatus: 0, stdout: "", stderr: "")
75
75
  allow(@provider).to receive(:shell_out).and_return(@status)
76
76
 
77
- allow(::File).to receive(:exists?).and_return(true)
77
+ allow(::File).to receive(:exist?).and_return(true)
78
78
  allow(::File).to receive(:open).and_return(true)
79
79
  end
80
80
 
@@ -181,13 +181,13 @@ describe Chef::Provider::Service::Upstart do
181
181
  end
182
182
 
183
183
  it "should assume disable when no job configuration file is found" do
184
- allow(::File).to receive(:exists?).and_return(false)
184
+ allow(::File).to receive(:exist?).and_return(false)
185
185
  expect(@current_resource).to receive(:running).with(false)
186
186
  @provider.load_current_resource
187
187
  end
188
188
 
189
189
  it "should track state when the upstart configuration file fails to load" do
190
- expect(File).to receive(:exists?).and_return false
190
+ expect(File).to receive(:exist?).and_return false
191
191
  @provider.load_current_resource
192
192
  expect(@provider.instance_variable_get("@config_file_found")).to eq(false)
193
193
  end
@@ -22,12 +22,8 @@ require "spec_helper"
22
22
  describe Chef::Provider::Service::Windows, "load_current_resource" do
23
23
  include_context "Win32"
24
24
 
25
- before(:all) do
26
- Chef::ReservedNames::Win32::Security = Class.new unless windows?
27
- end
28
-
29
- after(:all) do
30
- Chef::ReservedNames::Win32.send(:remove_const, :Security) unless windows?
25
+ before do
26
+ stub_const("Chef::ReservedNames::Win32::Security", Class.new) unless windows?
31
27
  end
32
28
 
33
29
  let(:logger) { double("Mixlib::Log::Child").as_null_object }
@@ -220,31 +220,35 @@ describe Chef::Provider::SystemdUnit do
220
220
  expect(current_resource.content).to eq(nil)
221
221
  end
222
222
 
223
- it "loads the user unit content if the file exists and user is set" do
224
- new_resource.user("joe")
225
- allow(File).to receive(:exist?)
226
- .with(unit_path_user)
227
- .and_return(true)
228
- allow(File).to receive(:read)
229
- .with(unit_path_user)
230
- .and_return(unit_content_string)
231
- expect(File).to receive(:exist?)
232
- .with(unit_path_user)
233
- expect(File).to receive(:read)
234
- .with(unit_path_user)
235
- provider.load_current_resource
236
- expect(current_resource.content).to eq(unit_content_string)
237
- end
223
+ # A password is required when specifying a user on Windows. Since systemd resources
224
+ # won't actually run on Windows, skip these tests rather than code a workaround.
225
+ unless windows?
226
+ it "loads the user unit content if the file exists and user is set" do
227
+ new_resource.user("joe")
228
+ allow(File).to receive(:exist?)
229
+ .with(unit_path_user)
230
+ .and_return(true)
231
+ allow(File).to receive(:read)
232
+ .with(unit_path_user)
233
+ .and_return(unit_content_string)
234
+ expect(File).to receive(:exist?)
235
+ .with(unit_path_user)
236
+ expect(File).to receive(:read)
237
+ .with(unit_path_user)
238
+ provider.load_current_resource
239
+ expect(current_resource.content).to eq(unit_content_string)
240
+ end
238
241
 
239
- it "does not load the user unit if the file does not exist and user is set" do
240
- new_resource.user("joe")
241
- allow(File).to receive(:exist?)
242
- .with(unit_path_user)
243
- .and_return(false)
244
- expect(File).to_not receive(:read)
245
- .with(unit_path_user)
246
- provider.load_current_resource
247
- expect(current_resource.content).to eq(nil)
242
+ it "does not load the user unit if the file does not exist and user is set" do
243
+ new_resource.user("joe")
244
+ allow(File).to receive(:exist?)
245
+ .with(unit_path_user)
246
+ .and_return(false)
247
+ expect(File).to_not receive(:read)
248
+ .with(unit_path_user)
249
+ provider.load_current_resource
250
+ expect(current_resource.content).to eq(nil)
251
+ end
248
252
  end
249
253
  end
250
254
 
@@ -18,22 +18,50 @@
18
18
 
19
19
  require "spec_helper"
20
20
 
21
- # Output of the command:
22
- # => rpm -qa gpg-pubkey*
23
- RPM_KEYS = <<~EOF.freeze
24
- gpg-pubkey-307e3d54-4be01a65
25
- gpg-pubkey-3dbdc284-53674dd4
26
- EOF
27
-
28
- # Output of the command:
29
- # => gpg --with-fingerprint [FILE]
30
- ZYPPER_GPG_FINGER = <<~EOF.freeze
31
- pub 2048R/3DBDC284 2011-08-19 [expires: 2024-06-14]
32
- Key fingerprint = 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
33
- uid nginx signing key <signing-key@nginx.com>
34
- EOF
35
-
36
21
  describe Chef::Provider::ZypperRepository do
22
+ # Output of the command:
23
+ # => rpm -qa gpg-pubkey*
24
+ ZYPPER_RPM_KEYS = <<~EOF.freeze
25
+ gpg-pubkey-307e3d54-4be01a65
26
+ gpg-pubkey-3dbdc284-53674dd4
27
+ EOF
28
+
29
+ # Output of the command:
30
+ # => gpg --with-fingerprint [FILE]
31
+ ZYPPER_GPG_20 = <<~EOF.freeze
32
+ pub 2048R/3DBDC284 2011-08-19 [expires: 2024-06-14]
33
+ Key fingerprint = 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
34
+ uid nginx signing key <signing-key@nginx.com>
35
+ EOF
36
+
37
+ # Output of the command:
38
+ # => gpg --import-options import-show --dry-run --import --with-colons [FILE]
39
+ ZYPPER_GPG_22 = <<~EOF.freeze
40
+ pub:-:2048:1:ABF5BD827BD9BF62:1313747554:1718374819::-:::scSC::::::23::0:
41
+ fpr:::::::::573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62:
42
+ uid:-::::1466086904::F18C4DBBFCB45099ABB59088DB6B252FA7E9FB41::nginx signing key <signing-key@nginx.com>::::::::::0:
43
+ gpg: Total number processed: 1
44
+ EOF
45
+
46
+ # Output of the command:
47
+ # -> gpg --version
48
+ ZYPPER_GPG_VERSION = <<~EOF.freeze
49
+ gpg (GnuPG) 2.2.20
50
+ libgcrypt 1.8.5
51
+ Copyright (C) 2020 Free Software Foundation, Inc.
52
+ License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
53
+ This is free software: you are free to change and redistribute it.
54
+ There is NO WARRANTY, to the extent permitted by law.
55
+
56
+ Home: /Users/tsmith/.gnupg
57
+ Supported algorithms:
58
+ Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
59
+ Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
60
+ CAMELLIA128, CAMELLIA192, CAMELLIA256
61
+ Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
62
+ Compression: Uncompressed, ZIP, ZLIB, BZIP2
63
+ EOF
64
+
37
65
  let(:new_resource) { Chef::Resource::ZypperRepository.new("Nginx Repository") }
38
66
  let(:logger) { double("Mixlib::Log::Child").as_null_object }
39
67
  let(:provider) do
@@ -45,11 +73,19 @@ describe Chef::Provider::ZypperRepository do
45
73
  end
46
74
 
47
75
  let(:rpm_key_finger) do
48
- double("shell_out", stdout: RPM_KEYS, exitstatus: 0, error?: false)
76
+ double("shell_out", stdout: ZYPPER_RPM_KEYS, exitstatus: 0, error?: false)
77
+ end
78
+
79
+ let(:gpg_20) do
80
+ double("shell_out", stdout: ZYPPER_GPG_20, exitstatus: 0, error?: false)
81
+ end
82
+
83
+ let(:gpg_22) do
84
+ double("shell_out", stdout: ZYPPER_GPG_22, exitstatus: 0, error?: false)
49
85
  end
50
86
 
51
- let(:gpg_finger) do
52
- double("shell_out", stdout: ZYPPER_GPG_FINGER, exitstatus: 0, error?: false)
87
+ let(:gpg_ver) do
88
+ double("shell_out", stdout: ZYPPER_GPG_VERSION, exitstatus: 0, error?: false)
53
89
  end
54
90
 
55
91
  it "responds to load_current_resource" do
@@ -96,24 +132,38 @@ describe Chef::Provider::ZypperRepository do
96
132
 
97
133
  describe "#key_installed?" do
98
134
  before do
99
- expect(provider).to receive(:shell_out).with("rpm -qa gpg-pubkey*").and_return(rpm_key_finger)
135
+ expect(provider).to receive(:shell_out).with("/bin/rpm -qa gpg-pubkey*").and_return(rpm_key_finger)
100
136
  end
101
137
 
102
138
  it "returns true if the key is installed" do
103
- expect(provider).to receive(:key_fingerprint).and_return("3dbdc284")
139
+ expect(provider).to receive(:short_key_id).and_return("3dbdc284")
104
140
  expect(provider.key_installed?("/foo/nginx.key")).to be_truthy
105
141
  end
106
142
 
107
143
  it "returns false if the key is not installed" do
108
- expect(provider).to receive(:key_fingerprint).and_return("BOGUS")
144
+ expect(provider).to receive(:short_key_id).and_return("BOGUS")
109
145
  expect(provider.key_installed?("/foo/nginx.key")).to be_falsey
110
146
  end
111
147
  end
112
148
 
113
- describe "#key_fingerprint" do
114
- it "returns the key's fingerprint" do
115
- expect(provider).to receive(:shell_out!).with("gpg --with-fingerprint /foo/nginx.key").and_return(gpg_finger)
116
- expect(provider.key_fingerprint("/foo/nginx.key")).to eq("3dbdc284")
149
+ describe "#gpg_version" do
150
+ it "returns the gpg version by shelling out to gpg" do
151
+ expect(provider).to receive(:shell_out!).with("gpg --version").and_return(gpg_ver)
152
+ expect(provider.gpg_version).to eq(Gem::Version.new("2.2.20"))
153
+ end
154
+ end
155
+
156
+ describe "#short_key_id" do
157
+ it "returns the short key ID via running a dry-run import on gpg 2.2+" do
158
+ expect(provider).to receive(:gpg_version).and_return(Gem::Version.new("2.2"))
159
+ expect(provider).to receive(:shell_out!).with("gpg --import-options import-show --dry-run --import --with-colons /foo/nginx.key").and_return(gpg_22)
160
+ expect(provider.short_key_id("/foo/nginx.key")).to eq("7bd9bf62")
161
+ end
162
+
163
+ it "returns the short key ID via --with-fingerpint on gpg < 2.2" do
164
+ expect(provider).to receive(:gpg_version).and_return(Gem::Version.new("2.0"))
165
+ expect(provider).to receive(:shell_out!).with("gpg --with-fingerprint /foo/nginx.key").and_return(gpg_20)
166
+ expect(provider.short_key_id("/foo/nginx.key")).to eq("3dbdc284")
117
167
  end
118
168
  end
119
169