chef 16.4.41 → 16.5.64

Sign up to get free protection for your applications and to get access to all the features.
Files changed (268) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Rakefile +2 -2
  4. data/bin/knife +1 -1
  5. data/chef.gemspec +2 -1
  6. data/lib/chef/application.rb +18 -16
  7. data/lib/chef/application/apply.rb +12 -7
  8. data/lib/chef/application/base.rb +26 -23
  9. data/lib/chef/application/client.rb +10 -4
  10. data/lib/chef/application/exit_code.rb +13 -4
  11. data/lib/chef/application/knife.rb +22 -11
  12. data/lib/chef/application/solo.rb +2 -1
  13. data/lib/chef/application/windows_service.rb +14 -14
  14. data/lib/chef/application/windows_service_manager.rb +6 -6
  15. data/lib/chef/chef_fs/knife.rb +2 -2
  16. data/lib/chef/chef_fs/parallelizer.rb +0 -1
  17. data/lib/chef/client.rb +10 -11
  18. data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
  19. data/lib/chef/cookbook/synchronizer.rb +2 -2
  20. data/lib/chef/cookbook_site_streaming_uploader.rb +13 -11
  21. data/lib/chef/cookbook_uploader.rb +1 -1
  22. data/lib/chef/data_collector.rb +6 -5
  23. data/lib/chef/data_collector/config_validation.rb +22 -13
  24. data/lib/chef/data_collector/run_end_message.rb +2 -2
  25. data/lib/chef/data_collector/run_start_message.rb +1 -1
  26. data/lib/chef/deprecated.rb +1 -1
  27. data/lib/chef/deprecation/warnings.rb +2 -2
  28. data/lib/chef/digester.rb +2 -2
  29. data/lib/chef/dsl/chef_vault.rb +1 -1
  30. data/lib/chef/dsl/data_query.rb +2 -2
  31. data/lib/chef/dsl/platform_introspection.rb +1 -1
  32. data/lib/chef/encrypted_data_bag_item.rb +3 -4
  33. data/lib/chef/encrypted_data_bag_item/decryptor.rb +3 -3
  34. data/lib/chef/encrypted_data_bag_item/encryptor.rb +3 -3
  35. data/lib/chef/environment.rb +2 -2
  36. data/lib/chef/event_loggers/windows_eventlog.rb +2 -2
  37. data/lib/chef/exceptions.rb +4 -4
  38. data/lib/chef/file_access_control/windows.rb +5 -1
  39. data/lib/chef/formatters/doc.rb +7 -6
  40. data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +6 -5
  41. data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +3 -3
  42. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +9 -9
  43. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +2 -2
  44. data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +3 -3
  45. data/lib/chef/formatters/minimal.rb +5 -4
  46. data/lib/chef/http.rb +6 -4
  47. data/lib/chef/http/auth_credentials.rb +5 -1
  48. data/lib/chef/http/authenticator.rb +1 -1
  49. data/lib/chef/http/basic_client.rb +4 -2
  50. data/lib/chef/http/decompressor.rb +1 -1
  51. data/lib/chef/http/http_request.rb +7 -5
  52. data/lib/chef/http/socketless_chef_zero_client.rb +5 -2
  53. data/lib/chef/http/ssl_policies.rb +1 -1
  54. data/lib/chef/json_compat.rb +1 -1
  55. data/lib/chef/knife.rb +4 -4
  56. data/lib/chef/knife/bootstrap.rb +16 -14
  57. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
  58. data/lib/chef/knife/bootstrap/templates/chef-full.erb +3 -3
  59. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +7 -7
  60. data/lib/chef/knife/client_create.rb +3 -3
  61. data/lib/chef/knife/config_get.rb +8 -97
  62. data/lib/chef/knife/config_get_profile.rb +9 -9
  63. data/lib/chef/knife/config_list.rb +139 -0
  64. data/lib/chef/knife/config_list_profiles.rb +8 -98
  65. data/lib/chef/knife/config_show.rb +127 -0
  66. data/lib/chef/knife/config_use.rb +61 -0
  67. data/lib/chef/knife/config_use_profile.rb +9 -24
  68. data/lib/chef/knife/configure.rb +2 -2
  69. data/lib/chef/knife/core/bootstrap_context.rb +2 -2
  70. data/lib/chef/knife/core/object_loader.rb +1 -1
  71. data/lib/chef/knife/core/windows_bootstrap_context.rb +11 -11
  72. data/lib/chef/knife/exec.rb +2 -2
  73. data/lib/chef/knife/node_show.rb +2 -2
  74. data/lib/chef/knife/serve.rb +3 -3
  75. data/lib/chef/knife/ssh.rb +16 -1
  76. data/lib/chef/knife/ssl_check.rb +3 -3
  77. data/lib/chef/knife/status.rb +2 -2
  78. data/lib/chef/knife/user_create.rb +2 -2
  79. data/lib/chef/knife/yaml_convert.rb +1 -1
  80. data/lib/chef/local_mode.rb +2 -2
  81. data/lib/chef/log/syslog.rb +2 -2
  82. data/lib/chef/log/winevt.rb +2 -2
  83. data/lib/chef/mixin/deep_merge.rb +0 -12
  84. data/lib/chef/mixin/openssl_helper.rb +1 -4
  85. data/lib/chef/mixin/template.rb +2 -2
  86. data/lib/chef/mixin/uris.rb +2 -2
  87. data/lib/chef/mixin/versioned_api.rb +1 -2
  88. data/lib/chef/monkey_patches/net_http.rb +4 -4
  89. data/lib/chef/node_map.rb +2 -2
  90. data/lib/chef/policy_builder/policyfile.rb +2 -2
  91. data/lib/chef/provider.rb +0 -4
  92. data/lib/chef/provider/file.rb +2 -2
  93. data/lib/chef/provider/ifconfig.rb +1 -1
  94. data/lib/chef/provider/launchd.rb +2 -2
  95. data/lib/chef/provider/mount/linux.rb +63 -0
  96. data/lib/chef/provider/package/rubygems.rb +21 -18
  97. data/lib/chef/provider/package/snap.rb +0 -1
  98. data/lib/chef/provider/package/windows.rb +2 -2
  99. data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +3 -1
  100. data/lib/chef/provider/package/zypper.rb +1 -1
  101. data/lib/chef/provider/remote_file/content.rb +3 -0
  102. data/lib/chef/provider/remote_file/ftp.rb +6 -4
  103. data/lib/chef/provider/remote_file/sftp.rb +6 -4
  104. data/lib/chef/provider/route.rb +2 -6
  105. data/lib/chef/provider/service/macosx.rb +2 -2
  106. data/lib/chef/provider/template_finder.rb +2 -10
  107. data/lib/chef/provider/user/dscl.rb +3 -3
  108. data/lib/chef/provider/user/mac.rb +1 -1
  109. data/lib/chef/provider/windows_task.rb +1 -2
  110. data/lib/chef/provider/zypper_repository.rb +2 -2
  111. data/lib/chef/provider_resolver.rb +1 -1
  112. data/lib/chef/providers.rb +1 -0
  113. data/lib/chef/recipe.rb +2 -2
  114. data/lib/chef/resource.rb +1 -1
  115. data/lib/chef/resource/apt_repository.rb +1 -1
  116. data/lib/chef/resource/bff_package.rb +22 -0
  117. data/lib/chef/resource/breakpoint.rb +57 -2
  118. data/lib/chef/resource/build_essential.rb +1 -1
  119. data/lib/chef/resource/cab_package.rb +29 -0
  120. data/lib/chef/resource/chef_client_cron.rb +32 -25
  121. data/lib/chef/resource/chef_client_launchd.rb +194 -0
  122. data/lib/chef/resource/chef_client_scheduled_task.rb +21 -18
  123. data/lib/chef/resource/chef_client_systemd_timer.rb +24 -17
  124. data/lib/chef/resource/chef_client_trusted_certificate.rb +101 -0
  125. data/lib/chef/resource/chef_gem.rb +10 -10
  126. data/lib/chef/resource/chef_handler.rb +148 -4
  127. data/lib/chef/resource/chef_sleep.rb +2 -2
  128. data/lib/chef/resource/chef_vault_secret.rb +1 -1
  129. data/lib/chef/resource/cookbook_file.rb +2 -2
  130. data/lib/chef/resource/cron/cron_d.rb +0 -1
  131. data/lib/chef/resource/dnf_package.rb +2 -2
  132. data/lib/chef/resource/dsc_resource.rb +0 -1
  133. data/lib/chef/resource/dsc_script.rb +2 -2
  134. data/lib/chef/resource/execute.rb +6 -6
  135. data/lib/chef/resource/file.rb +4 -4
  136. data/lib/chef/resource/gem_package.rb +5 -5
  137. data/lib/chef/resource/homebrew_package.rb +3 -3
  138. data/lib/chef/resource/homebrew_update.rb +5 -5
  139. data/lib/chef/resource/hostname.rb +2 -2
  140. data/lib/chef/resource/launchd.rb +2 -1
  141. data/lib/chef/resource/locale.rb +2 -2
  142. data/lib/chef/resource/macos_userdefaults.rb +3 -3
  143. data/lib/chef/resource/notify_group.rb +0 -1
  144. data/lib/chef/resource/ohai.rb +46 -3
  145. data/lib/chef/resource/ohai_hint.rb +33 -0
  146. data/lib/chef/resource/openssl_dhparam.rb +27 -5
  147. data/lib/chef/resource/openssl_ec_private_key.rb +6 -3
  148. data/lib/chef/resource/openssl_ec_public_key.rb +2 -2
  149. data/lib/chef/resource/openssl_rsa_private_key.rb +6 -3
  150. data/lib/chef/resource/openssl_x509_certificate.rb +14 -14
  151. data/lib/chef/resource/openssl_x509_crl.rb +19 -10
  152. data/lib/chef/resource/openssl_x509_request.rb +14 -16
  153. data/lib/chef/resource/osx_profile.rb +77 -13
  154. data/lib/chef/resource/plist.rb +1 -1
  155. data/lib/chef/resource/powershell_package_source.rb +5 -5
  156. data/lib/chef/resource/reboot.rb +2 -2
  157. data/lib/chef/resource/remote_file.rb +3 -3
  158. data/lib/chef/resource/rhsm_register.rb +22 -10
  159. data/lib/chef/resource/ruby_block.rb +2 -2
  160. data/lib/chef/resource/scm/subversion.rb +2 -2
  161. data/lib/chef/resource/service.rb +3 -3
  162. data/lib/chef/resource/ssh_known_hosts_entry.rb +2 -2
  163. data/lib/chef/resource/support/cron.d.erb +1 -1
  164. data/lib/chef/resource/support/cron_access.erb +1 -1
  165. data/lib/chef/resource/support/sudoer.erb +1 -1
  166. data/lib/chef/resource/support/ulimit.erb +1 -1
  167. data/lib/chef/resource/sysctl.rb +1 -5
  168. data/lib/chef/resource/systemd_unit.rb +2 -2
  169. data/lib/chef/resource/template.rb +2 -2
  170. data/lib/chef/resource/windows_ad_join.rb +10 -3
  171. data/lib/chef/resource/windows_certificate.rb +6 -4
  172. data/lib/chef/resource/windows_firewall_profile.rb +22 -20
  173. data/lib/chef/resource/windows_package.rb +28 -5
  174. data/lib/chef/resource/windows_printer.rb +5 -3
  175. data/lib/chef/resource/windows_printer_port.rb +6 -4
  176. data/lib/chef/resource/windows_user_privilege.rb +53 -54
  177. data/lib/chef/resource/windows_workgroup.rb +3 -3
  178. data/lib/chef/resource/yum_package.rb +2 -2
  179. data/lib/chef/resources.rb +3 -1
  180. data/lib/chef/run_context.rb +2 -2
  181. data/lib/chef/run_context/cookbook_compiler.rb +1 -1
  182. data/lib/chef/run_lock.rb +2 -2
  183. data/lib/chef/search/query.rb +4 -5
  184. data/lib/chef/shell.rb +31 -26
  185. data/lib/chef/shell/ext.rb +11 -11
  186. data/lib/chef/shell/shell_session.rb +2 -2
  187. data/lib/chef/train_transport.rb +5 -104
  188. data/lib/chef/util/diff.rb +3 -3
  189. data/lib/chef/util/powershell/cmdlet.rb +3 -1
  190. data/lib/chef/util/powershell/ps_credential.rb +18 -14
  191. data/lib/chef/util/threaded_job_queue.rb +0 -2
  192. data/lib/chef/version.rb +1 -1
  193. data/lib/chef/win32/crypto.rb +1 -1
  194. data/lib/chef/win32/registry.rb +1 -2
  195. data/spec/data/shef-config.rb +1 -1
  196. data/spec/functional/event_loggers/windows_eventlog_spec.rb +6 -5
  197. data/spec/functional/resource/aix_service_spec.rb +2 -2
  198. data/spec/functional/resource/aixinit_service_spec.rb +1 -1
  199. data/spec/functional/resource/insserv_spec.rb +1 -1
  200. data/spec/functional/resource/user/dscl_spec.rb +1 -1
  201. data/spec/functional/resource/user/mac_user_spec.rb +1 -1
  202. data/spec/functional/resource/windows_task_spec.rb +13 -13
  203. data/spec/functional/version_spec.rb +3 -3
  204. data/spec/integration/client/client_spec.rb +4 -4
  205. data/spec/integration/client/exit_code_spec.rb +3 -2
  206. data/spec/integration/client/ipv6_spec.rb +1 -1
  207. data/spec/integration/knife/{config_list_profiles_spec.rb → config_list_spec.rb} +30 -29
  208. data/spec/integration/knife/{config_get_spec.rb → config_show_spec.rb} +3 -3
  209. data/spec/integration/knife/{config_use_profile_spec.rb → config_use_spec.rb} +53 -10
  210. data/spec/integration/knife/cookbook_api_ipv6_spec.rb +1 -1
  211. data/spec/integration/ohai/ohai_spec.rb +61 -0
  212. data/spec/integration/recipes/remote_directory.rb +1 -1
  213. data/spec/integration/solo/solo_spec.rb +5 -5
  214. data/spec/spec_helper.rb +6 -3
  215. data/spec/stress/win32/file_spec.rb +1 -1
  216. data/spec/support/chef_helpers.rb +2 -2
  217. data/spec/support/matchers/leak.rb +2 -2
  218. data/spec/support/platform_helpers.rb +16 -34
  219. data/spec/support/shared/functional/securable_resource.rb +108 -27
  220. data/spec/support/shared/functional/win32_service.rb +1 -1
  221. data/spec/support/shared/unit/application_dot_d.rb +5 -3
  222. data/spec/tiny_server.rb +0 -1
  223. data/spec/unit/application/client_spec.rb +2 -2
  224. data/spec/unit/application/exit_code_spec.rb +10 -0
  225. data/spec/unit/application_spec.rb +4 -6
  226. data/spec/unit/chef_fs/parallelizer_spec.rb +5 -1
  227. data/spec/unit/chef_fs/path_util_spec.rb +1 -1
  228. data/spec/unit/cookbook/synchronizer_spec.rb +2 -2
  229. data/spec/unit/cookbook_spec.rb +2 -2
  230. data/spec/unit/data_collector/config_validation_spec.rb +208 -0
  231. data/spec/unit/data_collector_spec.rb +0 -113
  232. data/spec/unit/dsl/declare_resource_spec.rb +1 -1
  233. data/spec/unit/file_access_control_spec.rb +1 -1
  234. data/spec/unit/knife/bootstrap_spec.rb +6 -6
  235. data/spec/unit/knife/core/ui_spec.rb +1 -0
  236. data/spec/unit/knife/ssh_spec.rb +2 -2
  237. data/spec/unit/lwrp_spec.rb +3 -3
  238. data/spec/unit/mixin/deep_merge_spec.rb +15 -0
  239. data/spec/unit/mixin/openssl_helper_spec.rb +1 -1
  240. data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
  241. data/spec/unit/mixin/securable_spec.rb +2 -2
  242. data/spec/unit/node/immutable_collections_spec.rb +2 -2
  243. data/spec/unit/provider/mount/linux_spec.rb +97 -0
  244. data/spec/unit/provider/package/chocolatey_spec.rb +1 -1
  245. data/spec/unit/provider/package/powershell_spec.rb +1 -1
  246. data/spec/unit/provider/package/rubygems_spec.rb +4 -1
  247. data/spec/unit/provider/route_spec.rb +0 -2
  248. data/spec/unit/recipe_spec.rb +1 -1
  249. data/spec/unit/resource/chef_client_cron_spec.rb +35 -14
  250. data/spec/unit/resource/chef_client_launchd_spec.rb +127 -0
  251. data/spec/unit/resource/chef_client_systemd_timer_spec.rb +36 -1
  252. data/spec/unit/resource/chef_client_trusted_certificate_spec.rb +54 -0
  253. data/spec/unit/resource/launchd_spec.rb +8 -0
  254. data/spec/unit/resource/osx_profile_spec.rb +67 -1
  255. data/spec/unit/resource/rhsm_register_spec.rb +56 -18
  256. data/spec/unit/resource/windows_uac_spec.rb +1 -1
  257. data/spec/unit/resource/windows_user_privilege_spec.rb +55 -0
  258. data/spec/unit/run_lock_spec.rb +5 -1
  259. data/spec/unit/runner_spec.rb +1 -2
  260. data/spec/unit/shell/shell_ext_spec.rb +46 -3
  261. data/spec/unit/shell/shell_session_spec.rb +35 -64
  262. data/spec/unit/shell_spec.rb +16 -19
  263. data/spec/unit/train_transport_spec.rb +14 -13
  264. data/spec/unit/util/selinux_spec.rb +2 -0
  265. data/tasks/rspec.rb +0 -2
  266. metadata +41 -17
  267. data/lib/chef/dist.rb +0 -68
  268. data/spec/integration/knife/config_get_profile_spec.rb +0 -114
@@ -17,7 +17,7 @@ require "spec_helper"
17
17
  require "support/shared/integration/integration_helper"
18
18
  require "support/shared/context/config"
19
19
 
20
- describe "knife config get", :workstation do
20
+ describe "knife config show", :workstation do
21
21
  include IntegrationSupport
22
22
  include KnifeSupport
23
23
 
@@ -27,7 +27,7 @@ describe "knife config get", :workstation do
27
27
 
28
28
  when_the_repository("has a custom env") do
29
29
  subject do
30
- cmd = knife("config", "get", *cmd_args, instance_filter: lambda { |instance|
30
+ cmd = knife("config", "show", *cmd_args, instance_filter: lambda { |instance|
31
31
  # Clear the stub set up in KnifeSupport.
32
32
  allow(File).to receive(:file?).and_call_original
33
33
  # Lies, damn lies, and config files. We need to allow normal config loading
@@ -47,7 +47,7 @@ describe "knife config get", :workstation do
47
47
  ChefConfig::PathHelper.per_tool_home_environment = "KNIFE_HOME"
48
48
  # Clear these out because they are cached permanently.
49
49
  ChefConfig::PathHelper.class_exec { remove_class_variable(:@@home_dir) }
50
- Chef::Knife::ConfigGet.reset_config_loader!
50
+ Chef::Knife::ConfigShow.reset_config_loader!
51
51
  begin
52
52
  ex.run
53
53
  ensure
@@ -17,7 +17,7 @@ require "spec_helper"
17
17
  require "support/shared/integration/integration_helper"
18
18
  require "support/shared/context/config"
19
19
 
20
- describe "knife config use-profile", :workstation do
20
+ describe "knife config use", :workstation do
21
21
  include IntegrationSupport
22
22
  include KnifeSupport
23
23
 
@@ -26,15 +26,15 @@ describe "knife config use-profile", :workstation do
26
26
  let(:cmd_args) { [] }
27
27
 
28
28
  when_the_repository("has a custom env") do
29
- let(:knife_use_profile) do
30
- knife("config", "use-profile", *cmd_args, instance_filter: lambda { |instance|
29
+ let(:knife_use) do
30
+ knife("config", "use", *cmd_args, instance_filter: lambda { |instance|
31
31
  # Fake the failsafe check because this command doesn't actually process knife.rb.
32
32
  $__KNIFE_INTEGRATION_FAILSAFE_CHECK << " ole"
33
33
  allow(File).to receive(:file?).and_call_original
34
34
  })
35
35
  end
36
36
 
37
- subject { knife_use_profile.stdout }
37
+ subject { knife_use.stdout }
38
38
 
39
39
  around do |ex|
40
40
  # Store and reset the value of some env vars.
@@ -45,7 +45,7 @@ describe "knife config use-profile", :workstation do
45
45
  ChefConfig::PathHelper.per_tool_home_environment = "KNIFE_HOME"
46
46
  # Clear these out because they are cached permanently.
47
47
  ChefConfig::PathHelper.class_exec { remove_class_variable(:@@home_dir) }
48
- Chef::Knife::ConfigUseProfile.reset_config_loader!
48
+ Chef::Knife::ConfigUse.reset_config_loader!
49
49
  begin
50
50
  ex.run
51
51
  ensure
@@ -68,8 +68,51 @@ describe "knife config use-profile", :workstation do
68
68
  end
69
69
 
70
70
  context "with no argument" do
71
- subject { knife_use_profile.stderr }
72
- it { is_expected.to eq "FATAL: You must specify a profile\n" }
71
+ context "with no configuration" do
72
+ it { is_expected.to eq "default\n" }
73
+ end
74
+
75
+ context "with --profile" do
76
+ let(:cmd_args) { %w{--profile production} }
77
+ it { is_expected.to eq "production\n" }
78
+ end
79
+
80
+ context "with an environment variable" do
81
+ around do |ex|
82
+ old_chef_profile = ENV["CHEF_PROFILE"]
83
+ begin
84
+ ENV["CHEF_PROFILE"] = "staging"
85
+ ex.run
86
+ ensure
87
+ ENV["CHEF_PROFILE"] = old_chef_profile
88
+ end
89
+ end
90
+
91
+ it { is_expected.to eq "staging\n" }
92
+ end
93
+
94
+ context "with a context file" do
95
+ before { file(".chef/context", "development\n") }
96
+ it { is_expected.to eq "development\n" }
97
+ end
98
+
99
+ context "with a context file under $CHEF_HOME" do
100
+ before do
101
+ file("chefhome/.chef/context", "other\n")
102
+ ENV["CHEF_HOME"] = path_to("chefhome")
103
+ end
104
+
105
+ it { is_expected.to eq "other\n" }
106
+ end
107
+
108
+ context "with a context file under $KNIFE_HOME" do
109
+ before do
110
+ file("knifehome/.chef/context", "other\n")
111
+ ENV["KNIFE_HOME"] = path_to("knifehome")
112
+ end
113
+
114
+ it { is_expected.to eq "other\n" }
115
+ end
73
116
  end
74
117
 
75
118
  context "with an argument" do
@@ -88,14 +131,14 @@ describe "knife config use-profile", :workstation do
88
131
 
89
132
  context "with no credentials file" do
90
133
  let(:cmd_args) { %w{production} }
91
- subject { knife_use_profile.stderr }
134
+ subject { knife_use.stderr }
92
135
  it { is_expected.to eq "FATAL: No profiles found, #{path_to(".chef/credentials")} does not exist or is empty\n" }
93
136
  end
94
137
 
95
138
  context "with an empty credentials file" do
96
139
  let(:cmd_args) { %w{production} }
97
140
  before { file(".chef/credentials", "") }
98
- subject { knife_use_profile.stderr }
141
+ subject { knife_use.stderr }
99
142
  it { is_expected.to eq "FATAL: No profiles found, #{path_to(".chef/credentials")} does not exist or is empty\n" }
100
143
  end
101
144
 
@@ -107,7 +150,7 @@ describe "knife config use-profile", :workstation do
107
150
  client_key = "testkey.pem"
108
151
  chef_server_url = "https://example.com/organizations/testorg"
109
152
  EOH
110
- subject { knife_use_profile }
153
+ subject { knife_use }
111
154
  it { expect { subject }.to raise_error ChefConfig::ConfigurationError, "Profile staging doesn't exist. Please add it to #{path_to(".chef/credentials")} and if it is profile with DNS name check that you are not missing single quotes around it as per docs https://docs.chef.io/workstation/knife_setup/#knife-profiles." }
112
155
  end
113
156
 
@@ -62,7 +62,7 @@ describe "Knife cookbook API integration with IPv6", :workstation, :not_supporte
62
62
  Dir.mktmpdir
63
63
  end
64
64
 
65
- let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..", "bin") }
65
+ let(:chef_dir) { File.join(__dir__, "..", "..", "..", "bin") }
66
66
  let(:knife) { "ruby '#{chef_dir}/knife'" }
67
67
 
68
68
  let(:knife_config_flag) { "-c '#{path_to("config/knife.rb")}'" }
@@ -0,0 +1,61 @@
1
+ require "spec_helper"
2
+ require "chef/mixin/shell_out"
3
+ require "benchmark" unless defined?(Benchmark)
4
+
5
+ describe "ohai" do
6
+ include Chef::Mixin::ShellOut
7
+
8
+ let(:ohai) { "bundle exec ohai" }
9
+
10
+ describe "testing ohai performance" do
11
+ # The purpose of this test is to generally find misconfigured DNS on
12
+ # CI testers. If this fails, it is probably because the forward+reverse
13
+ # DNS lookup that node[:hostname] needs is timing out and failing.
14
+ #
15
+ # If it is failing spuriously, it may mean DNS is failing spuriously, the
16
+ # best solution will be to make sure that `hostname -f`-like behavior hits
17
+ # /etc/hosts and not DNS.
18
+ #
19
+ # If it still fails supriously, it is possible that the server has high
20
+ # CPU load (e.g. due to background processes) which are contending with the
21
+ # running tests (disable the screensaver on servers, stop playing Fortnite
22
+ # while you're running tests, etc).
23
+ #
24
+ # If this just fails due to I/O being very slow and ruby being very slow to
25
+ # startup then that still indicates that the tester configuration needs
26
+ # fixing. The fact that this will fail on a windows box on a virt that doesn't
27
+ # use an SSD is because we have a higher bar for the tests to run successfully
28
+ # and that configuration is broken, so this test is red for a reason.
29
+ #
30
+ # This will probably fail on raspberry pi's or something like that as well. That
31
+ # is not a bug. We will never accept a raspberry pi as a CI tester for our
32
+ # software. Feel free to manually delete and thereby skip this file in your
33
+ # own testing harness, but that is not our concern, we are testing behavior
34
+ # that is critical to our infrastructure and must run in our tests.
35
+ #
36
+ # XXX: unfortunately this is so slow on our windows testers (~9 seconds on one
37
+ # tester) that we can't enable it for windows unless we get some better perf there.
38
+ #
39
+ it "the hostname plugin must return in under 4 seconds (see comments in code)" do
40
+ # unfortunately this doesn't look stable enough to enable
41
+ skip "we need to do more performance work on windows and s390x testers before this can be enabled"
42
+ delta = Benchmark.realtime do
43
+ shell_out!("#{ohai} hostname")
44
+ end
45
+ expect(delta).to be < 4
46
+ end
47
+
48
+ # The purpose of this is to give some indication of if shell_out is slow or
49
+ # if the hostname plugin itself is slow. If this test is also failing that we
50
+ # almost certainly have some kind of issue with DNS timeouts, etc. If this
51
+ # test succeeds and the other one fails, then it can be some kind of shelling-out
52
+ # issue or poor performance due to I/O on starting up ruby to run ohai, etc.
53
+ #
54
+ it "the hostname plugin must return in under 2 seconds when called from pure ruby" do
55
+ delta = Benchmark.realtime do
56
+ Ohai::System.new.all_plugins(["hostname"])
57
+ end
58
+ expect(delta).to be < 2
59
+ end
60
+ end
61
+ end
@@ -5,7 +5,7 @@ describe Chef::Resource::RemoteDirectory do
5
5
  include Chef::Mixin::ShellOut
6
6
 
7
7
  # Until Cheffish::RSpec has cookbook support, we have to run the whole client
8
- let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..", "bin") }
8
+ let(:chef_dir) { File.join(__dir__, "..", "..", "..", "bin") }
9
9
 
10
10
  # Invoke `chef-client` as `ruby PATH/TO/chef-client`. This ensures the
11
11
  # following constraints are satisfied:
@@ -5,20 +5,20 @@ require "chef/run_lock"
5
5
  require "chef/config"
6
6
  require "timeout"
7
7
  require "fileutils"
8
+ require "chef-utils"
8
9
  require "chef/win32/security" if ChefUtils.windows?
9
- require "chef/dist"
10
10
 
11
- describe Chef::Dist::SOLOEXEC do
11
+ describe ChefUtils::Dist::Solo::EXEC do
12
12
  include IntegrationSupport
13
13
  include Chef::Mixin::ShellOut
14
14
 
15
- let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..") }
15
+ let(:chef_dir) { File.join(__dir__, "..", "..", "..") }
16
16
 
17
17
  let(:cookbook_x_100_metadata_rb) { cb_metadata("x", "1.0.0") }
18
18
 
19
19
  let(:cookbook_ancient_100_metadata_rb) { cb_metadata("ancient", "1.0.0") }
20
20
 
21
- let(:chef_solo) { "bundle exec #{Chef::Dist::SOLOEXEC} --legacy-mode --minimal-ohai" }
21
+ let(:chef_solo) { "bundle exec #{ChefUtils::Dist::Solo::EXEC} --legacy-mode --minimal-ohai" }
22
22
 
23
23
  when_the_repository "creates nodes" do
24
24
  let(:nodes_dir) { File.join(@repository_dir, "nodes") }
@@ -183,7 +183,7 @@ describe Chef::Dist::SOLOEXEC do
183
183
  # run_lock gets stuck we can discover it.
184
184
  expect do
185
185
  Timeout.timeout(120) do
186
- chef_dir = File.join(File.dirname(__FILE__), "..", "..", "..")
186
+ chef_dir = File.join(__dir__, "..", "..", "..")
187
187
 
188
188
  threads = []
189
189
 
@@ -141,9 +141,10 @@ RSpec.configure do |config|
141
141
 
142
142
  config.filter_run_excluding windows_only: true unless windows?
143
143
  config.filter_run_excluding not_supported_on_windows: true if windows?
144
- config.filter_run_excluding not_supported_on_macos: true if mac_osx?
145
- config.filter_run_excluding macos_only: true unless mac_osx?
146
- config.filter_run_excluding macos_1014: true unless mac_osx_1014?
144
+ config.filter_run_excluding not_supported_on_macos: true if macos?
145
+ config.filter_run_excluding macos_only: true unless macos?
146
+ config.filter_run_excluding macos_1013: true unless macos_1013?
147
+ config.filter_run_excluding macos_gte_1014: true unless macos_gte_1014?
147
148
  config.filter_run_excluding not_supported_on_aix: true if aix?
148
149
  config.filter_run_excluding not_supported_on_solaris: true if solaris?
149
150
  config.filter_run_excluding not_supported_on_gce: true if gce?
@@ -242,6 +243,8 @@ RSpec.configure do |config|
242
243
 
243
244
  Chef::Log.setup!
244
245
 
246
+ Chef::ServerAPIVersions.instance.reset!
247
+
245
248
  Chef::Config[:log_level] = :fatal
246
249
  Chef::Log.level(Chef::Config[:log_level])
247
250
 
@@ -21,7 +21,7 @@ require "chef/win32/file" if windows?
21
21
 
22
22
  describe "Chef::ReservedNames::Win32::File", :windows_only do
23
23
  before(:each) do
24
- @path = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "data", "old_home_dir", "my-dot-emacs"))
24
+ @path = File.expand_path(File.join(__dir__, "..", "..", "data", "old_home_dir", "my-dot-emacs"))
25
25
  end
26
26
 
27
27
  it "should not leak significant memory", :volatile do
@@ -14,8 +14,8 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- CHEF_SPEC_DATA = File.expand_path(File.dirname(__FILE__) + "/../data/")
18
- CHEF_SPEC_ASSETS = File.expand_path(File.dirname(__FILE__) + "/../functional/assets/")
17
+ CHEF_SPEC_DATA = File.expand_path(__dir__ + "/../data/")
18
+ CHEF_SPEC_ASSETS = File.expand_path(__dir__ + "/../functional/assets/")
19
19
  CHEF_SPEC_BACKUP_PATH = File.join(Dir.tmpdir, "test-backup-path")
20
20
 
21
21
  def sha256_checksum(path)
@@ -61,10 +61,10 @@ module Matchers
61
61
  def profiler
62
62
  @profiler ||= begin
63
63
  if ChefUtils.windows?
64
- require File.join(File.dirname(__FILE__), "..", "platforms", "prof", "win32")
64
+ require File.join(__dir__, "..", "platforms", "prof", "win32")
65
65
  RSpec::Prof::Win32::Profiler.new
66
66
  else
67
- require File.join(File.dirname(__FILE__), "..", "prof", "gc")
67
+ require File.join(__dir__, "..", "prof", "gc")
68
68
  RSpec::Prof::GC::Profiler.new
69
69
  end
70
70
  end
@@ -3,7 +3,6 @@ require "chef/mixin/shell_out"
3
3
  require "ohai/mixin/http_helper"
4
4
  require "ohai/mixin/gce_metadata"
5
5
  require "chef/mixin/powershell_out"
6
- require "chef/version_class"
7
6
 
8
7
  class ShellHelpers
9
8
  extend Chef::Mixin::ShellOut
@@ -27,11 +26,11 @@ class DependencyProc < Proc
27
26
  end
28
27
 
29
28
  def ruby_64bit?
30
- !!(RbConfig::CONFIG["host_cpu"] =~ /x86_64/)
29
+ RbConfig::CONFIG["host_cpu"].include?("x86_64")
31
30
  end
32
31
 
33
32
  def ruby_32bit?
34
- !!(RbConfig::CONFIG["host_cpu"] =~ /i686/)
33
+ RbConfig::CONFIG["host_cpu"].include?("i686")
35
34
  end
36
35
 
37
36
  def windows?
@@ -58,17 +57,17 @@ end
58
57
  def windows_2012r2?
59
58
  return false unless windows?
60
59
 
61
- (host_version && host_version.start_with?("6.3"))
60
+ (win32_os_version && win32_os_version.start_with?("6.3"))
62
61
  end
63
62
 
64
63
  def windows_gte_10?
65
64
  return false unless windows?
66
65
 
67
- Gem::Requirement.new(">= 10").satisfied_by?(Gem::Version.new(host_version))
66
+ Gem::Requirement.new(">= 10").satisfied_by?(Gem::Version.new(win32_os_version))
68
67
  end
69
68
 
70
- def host_version
71
- @host_version ||= begin
69
+ def win32_os_version
70
+ @win32_os_version ||= begin
72
71
  wmi = WmiLite::Wmi.new
73
72
  host = wmi.first_of("Win32_OperatingSystem")
74
73
  host["version"]
@@ -95,26 +94,12 @@ def windows_user_right?(right)
95
94
  Chef::ReservedNames::Win32::Security.get_account_right(ENV["USERNAME"]).include?(right)
96
95
  end
97
96
 
98
- def mac_osx_1014?
99
- if mac_osx?
100
- ver = Chef::Version.new(ohai[:platform_version])
101
- return ver.major == 10 && ver.minor == 14
102
- end
103
-
104
- false
97
+ def macos_1013?
98
+ macos? && Gem::Requirement.new("~> 10.13.0").satisfied_by?(Gem::Version.new(ohai[:platform_version]))
105
99
  end
106
100
 
107
- def mac_osx?
108
- if File.exist? "/usr/bin/sw_vers"
109
- result = ShellHelpers.shell_out("/usr/bin/sw_vers")
110
- result.stdout.each_line do |line|
111
- if /^ProductName:\sMac OS X.*$/.match?(line)
112
- return true
113
- end
114
- end
115
- end
116
-
117
- false
101
+ def macos_gte_1014?
102
+ macos? && Gem::Requirement.new(">= 10.14").satisfied_by?(Gem::Version.new(ohai[:platform_version]))
118
103
  end
119
104
 
120
105
  # detects if the hardware is 64-bit (evaluates to true in "WOW64" mode in a 32-bit app on a 64-bit system)
@@ -127,26 +112,24 @@ def windows32?
127
112
  windows? && !windows64?
128
113
  end
129
114
 
130
- # def jruby?
131
-
132
115
  def unix?
133
116
  !windows?
134
117
  end
135
118
 
136
119
  def linux?
137
- RUBY_PLATFORM.match?(/linux/)
120
+ RUBY_PLATFORM.include?("linux")
138
121
  end
139
122
 
140
123
  def macos?
141
- RUBY_PLATFORM.match?(/darwin/)
124
+ RUBY_PLATFORM.include?("darwin")
142
125
  end
143
126
 
144
127
  def solaris?
145
- RUBY_PLATFORM.match?(/solaris/)
128
+ RUBY_PLATFORM.include?("solaris")
146
129
  end
147
130
 
148
131
  def freebsd?
149
- RUBY_PLATFORM.match?(/freebsd/)
132
+ RUBY_PLATFORM.include?("freebsd")
150
133
  end
151
134
 
152
135
  def intel_64bit?
@@ -182,7 +165,7 @@ def debian_family?
182
165
  end
183
166
 
184
167
  def aix?
185
- RUBY_PLATFORM.match?(/aix/)
168
+ RUBY_PLATFORM.include?("aix")
186
169
  end
187
170
 
188
171
  def wpar?
@@ -216,8 +199,7 @@ def selinux_enabled?
216
199
  end
217
200
 
218
201
  def suse?
219
- ::File.exist?("/etc/SuSE-release") ||
220
- ( ::File.exist?("/etc/os-release") && /sles|suse/.match?(File.read("/etc/os-release")) )
202
+ !!(ohai[:platform_family] == "suse")
221
203
  end
222
204
 
223
205
  def root?
@@ -242,48 +242,100 @@ shared_examples_for "a securable resource with existing target" do
242
242
  include_context "use Windows permissions"
243
243
 
244
244
  describe "when setting owner" do
245
- before do
246
- resource.owner(SID.admin_account_name)
247
- resource.run_action(:create)
248
- end
245
+ context "with user name" do
246
+ before do
247
+ resource.owner(SID.admin_account_name)
248
+ resource.run_action(:create)
249
+ end
249
250
 
250
- it "should set the owner" do
251
- expect(descriptor.owner).to eq(SID.Administrator)
251
+ it "should set the owner" do
252
+ expect(descriptor.owner).to eq(SID.Administrator)
253
+ end
254
+
255
+ it "is marked as updated only if changes are made" do
256
+ expect(resource.updated_by_last_action?).to eq(expect_updated?)
257
+ end
252
258
  end
253
259
 
254
- it "is marked as updated only if changes are made" do
255
- expect(resource.updated_by_last_action?).to eq(expect_updated?)
260
+ context "with SID" do
261
+ before do
262
+ resource.owner(SID.Administrator.to_s)
263
+ resource.run_action(:create)
264
+ end
265
+
266
+ it "should set the owner" do
267
+ expect(descriptor.owner).to eq(SID.Administrator)
268
+ end
269
+
270
+ it "is marked as updated only if changes are made" do
271
+ expect(resource.updated_by_last_action?).to eq(expect_updated?)
272
+ end
256
273
  end
257
274
  end
258
275
 
259
276
  describe "when setting group" do
260
- before do
261
- resource.group("Administrators")
262
- resource.run_action(:create)
263
- end
277
+ context "with group name" do
278
+ before do
279
+ resource.group("Administrators")
280
+ resource.run_action(:create)
281
+ end
282
+
283
+ it "should set the group" do
284
+ expect(descriptor.group).to eq(SID.Administrators)
285
+ end
264
286
 
265
- it "should set the group" do
266
- expect(descriptor.group).to eq(SID.Administrators)
287
+ it "is marked as updated only if changes are made" do
288
+ expect(resource.updated_by_last_action?).to eq(expect_updated?)
289
+ end
267
290
  end
268
291
 
269
- it "is marked as updated only if changes are made" do
270
- expect(resource.updated_by_last_action?).to eq(expect_updated?)
292
+ context "with group SID" do
293
+ before do
294
+ resource.group(SID.Administrators.to_s)
295
+ resource.run_action(:create)
296
+ end
297
+
298
+ it "should set the group" do
299
+ expect(descriptor.group).to eq(SID.Administrators)
300
+ end
301
+
302
+ it "is marked as updated only if changes are made" do
303
+ expect(resource.updated_by_last_action?).to eq(expect_updated?)
304
+ end
271
305
  end
272
306
  end
273
307
 
274
308
  describe "when setting rights and deny_rights" do
275
- before do
276
- resource.deny_rights(:modify, "Guest")
277
- resource.rights(:read, "Guest")
278
- resource.run_action(:create)
279
- end
309
+ context "with user name" do
310
+ before do
311
+ resource.deny_rights(:modify, "Guest")
312
+ resource.rights(:read, "Guest")
313
+ resource.run_action(:create)
314
+ end
280
315
 
281
- it "should set the rights and deny_rights" do
282
- expect(explicit_aces).to eq(denied_acl(SID.Guest, expected_modify_perms) + allowed_acl(SID.Guest, expected_read_perms))
316
+ it "should set the rights and deny_rights" do
317
+ expect(explicit_aces).to eq(denied_acl(SID.Guest, expected_modify_perms) + allowed_acl(SID.Guest, expected_read_perms))
318
+ end
319
+
320
+ it "is marked as updated only if changes are made" do
321
+ expect(resource.updated_by_last_action?).to eq(expect_updated?)
322
+ end
283
323
  end
284
324
 
285
- it "is marked as updated only if changes are made" do
286
- expect(resource.updated_by_last_action?).to eq(expect_updated?)
325
+ context "with SID" do
326
+ before do
327
+ resource.deny_rights(:modify, SID.Guest.to_s)
328
+ resource.rights(:read, SID.Guest.to_s)
329
+ resource.run_action(:create)
330
+ end
331
+
332
+ it "should set the rights and deny_rights" do
333
+ expect(explicit_aces).to eq(denied_acl(SID.Guest, expected_modify_perms) + allowed_acl(SID.Guest, expected_read_perms))
334
+ end
335
+
336
+ it "is marked as updated only if changes are made" do
337
+ expect(resource.updated_by_last_action?).to eq(expect_updated?)
338
+ end
287
339
  end
288
340
  end
289
341
  end
@@ -302,12 +354,18 @@ shared_examples_for "a securable resource without existing target" do
302
354
  expect(descriptor.owner).to eq(SID.default_security_object_owner)
303
355
  end
304
356
 
305
- it "sets owner when owner is specified" do
357
+ it "sets owner when owner is specified by name" do
306
358
  resource.owner "Guest"
307
359
  resource.run_action(:create)
308
360
  expect(descriptor.owner).to eq(SID.Guest)
309
361
  end
310
362
 
363
+ it "sets owner when owner is specified by SID" do
364
+ resource.owner SID.Guest.to_s
365
+ resource.run_action(:create)
366
+ expect(descriptor.owner).to eq(SID.Guest)
367
+ end
368
+
311
369
  it "fails to set owner when owner has invalid characters" do
312
370
  expect { resource.owner 'Lance "The Nose" Glindenberry III' }.to raise_error(Chef::Exceptions::ValidationFailed)
313
371
  end
@@ -339,12 +397,18 @@ shared_examples_for "a securable resource without existing target" do
339
397
  expect(descriptor.group).to eq(SID.default_security_object_group)
340
398
  end
341
399
 
342
- it "sets group when group is specified" do
400
+ it "sets group when group is specified by name" do
343
401
  resource.group "Everyone"
344
402
  resource.run_action(:create)
345
403
  expect(descriptor.group).to eq(SID.Everyone)
346
404
  end
347
405
 
406
+ it "sets group when group is specified by SID" do
407
+ resource.group SID.Everyone.to_s
408
+ resource.run_action(:create)
409
+ expect(descriptor.group).to eq(SID.Everyone)
410
+ end
411
+
348
412
  it "fails to set group when group has invalid characters" do
349
413
  expect { resource.group 'Lance "The Nose" Glindenberry III' }.to raise_error(Chef::Exceptions::ValidationFailed)
350
414
  end
@@ -406,6 +470,17 @@ shared_examples_for "a securable resource without existing target" do
406
470
  allowed_acl(SID.Guest, expected_modify_perms)
407
471
  )
408
472
  end
473
+
474
+ it "multiple rights with SID" do
475
+ resource.rights(:read, SID.Everyone.to_s)
476
+ resource.rights(:modify, SID.Guest.to_s)
477
+ resource.run_action(:create)
478
+
479
+ expect(explicit_aces).to eq(
480
+ allowed_acl(SID.Everyone, expected_read_perms) +
481
+ allowed_acl(SID.Guest, expected_modify_perms)
482
+ )
483
+ end
409
484
  end
410
485
  end
411
486
 
@@ -443,6 +518,12 @@ shared_examples_for "a securable resource without existing target" do
443
518
  expect(explicit_aces).to eq(denied_acl(SID.Guest, expected_full_control_perms))
444
519
  end
445
520
 
521
+ it "using SID" do
522
+ resource.deny_rights(:full_control, SID.Guest.to_s)
523
+ resource.run_action(:create)
524
+ expect(explicit_aces).to eq(denied_acl(SID.Guest, expected_full_control_perms))
525
+ end
526
+
446
527
  it "deny_rights ahead of rights" do
447
528
  resource.rights(:read, "Everyone")
448
529
  resource.deny_rights(:modify, "Guest")