chef 12.4.0.rc.0 → 12.4.0.rc.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (298) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +12 -1
  3. data/lib/chef/api_client.rb +130 -26
  4. data/lib/chef/application.rb +0 -1
  5. data/lib/chef/application/client.rb +8 -19
  6. data/lib/chef/audit/audit_reporter.rb +12 -7
  7. data/lib/chef/audit/logger.rb +36 -0
  8. data/lib/chef/audit/runner.rb +4 -2
  9. data/lib/chef/chef_class.rb +62 -11
  10. data/lib/chef/client.rb +587 -207
  11. data/lib/chef/config.rb +0 -1
  12. data/lib/chef/dsl/recipe.rb +45 -56
  13. data/lib/chef/dsl/resources.rb +3 -2
  14. data/lib/chef/event_dispatch/base.rb +7 -2
  15. data/lib/chef/exceptions.rb +4 -1
  16. data/lib/chef/file_content_management/deploy/mv_windows.rb +16 -6
  17. data/lib/chef/formatters/doc.rb +15 -7
  18. data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +10 -7
  19. data/lib/chef/guard_interpreter/default_guard_interpreter.rb +2 -0
  20. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +4 -1
  21. data/lib/chef/http/authenticator.rb +7 -2
  22. data/lib/chef/knife.rb +16 -4
  23. data/lib/chef/knife/client_create.rb +55 -31
  24. data/lib/chef/knife/core/generic_presenter.rb +1 -1
  25. data/lib/chef/knife/core/subcommand_loader.rb +1 -1
  26. data/lib/chef/knife/osc_user_create.rb +97 -0
  27. data/lib/chef/knife/osc_user_delete.rb +51 -0
  28. data/lib/chef/knife/osc_user_edit.rb +58 -0
  29. data/lib/chef/knife/osc_user_list.rb +47 -0
  30. data/lib/chef/knife/osc_user_reregister.rb +64 -0
  31. data/lib/chef/knife/osc_user_show.rb +54 -0
  32. data/lib/chef/knife/user_create.rb +95 -36
  33. data/lib/chef/knife/user_delete.rb +52 -2
  34. data/lib/chef/knife/user_edit.rb +37 -7
  35. data/lib/chef/knife/user_list.rb +3 -0
  36. data/lib/chef/knife/user_reregister.rb +39 -8
  37. data/lib/chef/knife/user_show.rb +30 -1
  38. data/lib/chef/mixin/api_version_request_handling.rb +66 -0
  39. data/lib/chef/mixin/convert_to_class_name.rb +10 -4
  40. data/lib/chef/mixin/deprecation.rb +24 -0
  41. data/lib/chef/mixin/powershell_out.rb +98 -0
  42. data/lib/chef/mixin/provides.rb +5 -18
  43. data/lib/chef/mixin/uris.rb +11 -0
  44. data/lib/chef/mixin/windows_architecture_helper.rb +5 -2
  45. data/lib/chef/mixin/windows_env_helper.rb +11 -2
  46. data/lib/chef/node_map.rb +130 -75
  47. data/lib/chef/osc_user.rb +194 -0
  48. data/lib/chef/platform/provider_mapping.rb +2 -269
  49. data/lib/chef/platform/provider_priority_map.rb +6 -69
  50. data/lib/chef/platform/query_helpers.rb +5 -0
  51. data/lib/chef/platform/resource_priority_map.rb +12 -15
  52. data/lib/chef/policy_builder/policyfile.rb +1 -0
  53. data/lib/chef/provider.rb +19 -0
  54. data/lib/chef/provider/directory.rb +3 -0
  55. data/lib/chef/provider/dsc_resource.rb +8 -1
  56. data/lib/chef/provider/file.rb +1 -0
  57. data/lib/chef/provider/group/aix.rb +1 -0
  58. data/lib/chef/provider/group/dscl.rb +1 -1
  59. data/lib/chef/provider/group/gpasswd.rb +1 -0
  60. data/lib/chef/provider/group/groupmod.rb +1 -1
  61. data/lib/chef/provider/group/pw.rb +1 -0
  62. data/lib/chef/provider/group/suse.rb +2 -0
  63. data/lib/chef/provider/group/usermod.rb +2 -1
  64. data/lib/chef/provider/group/windows.rb +1 -1
  65. data/lib/chef/provider/ifconfig.rb +2 -0
  66. data/lib/chef/provider/ifconfig/aix.rb +1 -0
  67. data/lib/chef/provider/ifconfig/debian.rb +2 -0
  68. data/lib/chef/provider/ifconfig/redhat.rb +1 -0
  69. data/lib/chef/provider/lwrp_base.rb +4 -0
  70. data/lib/chef/provider/mount.rb +0 -1
  71. data/lib/chef/provider/mount/aix.rb +1 -0
  72. data/lib/chef/provider/mount/mount.rb +2 -0
  73. data/lib/chef/provider/mount/solaris.rb +2 -0
  74. data/lib/chef/provider/package.rb +55 -0
  75. data/lib/chef/provider/package/aix.rb +7 -7
  76. data/lib/chef/provider/package/apt.rb +3 -3
  77. data/lib/chef/provider/package/dpkg.rb +4 -4
  78. data/lib/chef/provider/package/easy_install.rb +5 -5
  79. data/lib/chef/provider/package/freebsd/base.rb +2 -2
  80. data/lib/chef/provider/package/freebsd/pkg.rb +6 -6
  81. data/lib/chef/provider/package/freebsd/pkgng.rb +5 -5
  82. data/lib/chef/provider/package/freebsd/port.rb +4 -4
  83. data/lib/chef/provider/package/homebrew.rb +2 -2
  84. data/lib/chef/provider/package/ips.rb +4 -4
  85. data/lib/chef/provider/package/macports.rb +5 -6
  86. data/lib/chef/provider/package/openbsd.rb +4 -5
  87. data/lib/chef/provider/package/pacman.rb +4 -4
  88. data/lib/chef/provider/package/portage.rb +2 -0
  89. data/lib/chef/provider/package/rpm.rb +7 -8
  90. data/lib/chef/provider/package/rubygems.rb +5 -12
  91. data/lib/chef/provider/package/smartos.rb +4 -4
  92. data/lib/chef/provider/package/solaris.rb +7 -7
  93. data/lib/chef/provider/package/windows/msi.rb +1 -1
  94. data/lib/chef/provider/package/yum.rb +4 -6
  95. data/lib/chef/provider/package/zypper.rb +16 -14
  96. data/lib/chef/provider/powershell_script.rb +129 -47
  97. data/lib/chef/provider/remote_file/content.rb +4 -1
  98. data/lib/chef/provider/remote_file/local_file.rb +10 -4
  99. data/lib/chef/provider/service.rb +44 -0
  100. data/lib/chef/provider/service/freebsd.rb +1 -1
  101. data/lib/chef/provider/service/init.rb +1 -0
  102. data/lib/chef/provider/service/macosx.rb +1 -1
  103. data/lib/chef/provider/service/windows.rb +0 -1
  104. data/lib/chef/provider/user.rb +1 -1
  105. data/lib/chef/provider/user/aix.rb +3 -2
  106. data/lib/chef/provider/user/pw.rb +1 -0
  107. data/lib/chef/provider/user/solaris.rb +2 -0
  108. data/lib/chef/provider/user/useradd.rb +1 -0
  109. data/lib/chef/provider_resolver.rb +87 -134
  110. data/lib/chef/resource.rb +274 -68
  111. data/lib/chef/resource/apt_package.rb +0 -2
  112. data/lib/chef/resource/bash.rb +0 -2
  113. data/lib/chef/resource/batch.rb +1 -1
  114. data/lib/chef/resource/bff_package.rb +0 -7
  115. data/lib/chef/resource/breakpoint.rb +3 -6
  116. data/lib/chef/resource/chef_gem.rb +0 -3
  117. data/lib/chef/resource/cookbook_file.rb +1 -3
  118. data/lib/chef/resource/cron.rb +2 -4
  119. data/lib/chef/resource/csh.rb +0 -2
  120. data/lib/chef/resource/deploy.rb +9 -6
  121. data/lib/chef/resource/deploy_revision.rb +0 -14
  122. data/lib/chef/resource/directory.rb +2 -4
  123. data/lib/chef/resource/dpkg_package.rb +0 -5
  124. data/lib/chef/resource/dsc_resource.rb +2 -3
  125. data/lib/chef/resource/dsc_script.rb +2 -3
  126. data/lib/chef/resource/easy_install_package.rb +0 -7
  127. data/lib/chef/resource/env.rb +3 -3
  128. data/lib/chef/resource/erl_call.rb +2 -5
  129. data/lib/chef/resource/execute.rb +2 -4
  130. data/lib/chef/resource/file.rb +2 -4
  131. data/lib/chef/resource/freebsd_package.rb +0 -5
  132. data/lib/chef/resource/gem_package.rb +0 -3
  133. data/lib/chef/resource/git.rb +0 -3
  134. data/lib/chef/resource/group.rb +2 -4
  135. data/lib/chef/resource/homebrew_package.rb +0 -2
  136. data/lib/chef/resource/http_request.rb +3 -4
  137. data/lib/chef/resource/ifconfig.rb +3 -4
  138. data/lib/chef/resource/ips_package.rb +2 -2
  139. data/lib/chef/resource/link.rb +3 -5
  140. data/lib/chef/resource/log.rb +2 -4
  141. data/lib/chef/resource/lwrp_base.rb +10 -61
  142. data/lib/chef/resource/macosx_service.rb +1 -2
  143. data/lib/chef/resource/macports_package.rb +0 -7
  144. data/lib/chef/resource/mdadm.rb +2 -5
  145. data/lib/chef/resource/mount.rb +2 -4
  146. data/lib/chef/resource/ohai.rb +2 -4
  147. data/lib/chef/resource/openbsd_package.rb +0 -6
  148. data/lib/chef/resource/package.rb +9 -6
  149. data/lib/chef/resource/pacman_package.rb +0 -7
  150. data/lib/chef/resource/paludis_package.rb +2 -3
  151. data/lib/chef/resource/perl.rb +0 -3
  152. data/lib/chef/resource/portage_package.rb +0 -3
  153. data/lib/chef/resource/powershell_script.rb +1 -2
  154. data/lib/chef/resource/python.rb +0 -3
  155. data/lib/chef/resource/reboot.rb +1 -3
  156. data/lib/chef/resource/registry_key.rb +3 -5
  157. data/lib/chef/resource/remote_directory.rb +3 -5
  158. data/lib/chef/resource/remote_file.rb +4 -5
  159. data/lib/chef/resource/route.rb +3 -5
  160. data/lib/chef/resource/rpm_package.rb +0 -2
  161. data/lib/chef/resource/ruby.rb +0 -4
  162. data/lib/chef/resource/ruby_block.rb +2 -4
  163. data/lib/chef/resource/scm.rb +3 -5
  164. data/lib/chef/resource/script.rb +0 -3
  165. data/lib/chef/resource/service.rb +3 -5
  166. data/lib/chef/resource/smartos_package.rb +0 -9
  167. data/lib/chef/resource/solaris_package.rb +0 -10
  168. data/lib/chef/resource/subversion.rb +1 -3
  169. data/lib/chef/resource/template.rb +0 -4
  170. data/lib/chef/resource/timestamped_deploy.rb +0 -4
  171. data/lib/chef/resource/user.rb +2 -5
  172. data/lib/chef/resource/whyrun_safe_ruby_block.rb +0 -7
  173. data/lib/chef/resource/windows_package.rb +3 -3
  174. data/lib/chef/resource/windows_script.rb +2 -2
  175. data/lib/chef/resource/windows_service.rb +3 -3
  176. data/lib/chef/resource/yum_package.rb +0 -3
  177. data/lib/chef/resource/zypper_package.rb +27 -0
  178. data/lib/chef/resource_builder.rb +7 -0
  179. data/lib/chef/resource_reporter.rb +1 -1
  180. data/lib/chef/resource_resolver.rb +108 -62
  181. data/lib/chef/resources.rb +1 -0
  182. data/lib/chef/rest.rb +1 -0
  183. data/lib/chef/server_api.rb +2 -0
  184. data/lib/chef/user.rb +193 -42
  185. data/lib/chef/util/backup.rb +9 -1
  186. data/lib/chef/util/path_helper.rb +0 -1
  187. data/lib/chef/version.rb +1 -1
  188. data/spec/functional/audit/runner_spec.rb +22 -42
  189. data/spec/functional/mixin/powershell_out_spec.rb +43 -0
  190. data/spec/functional/resource/execute_spec.rb +9 -2
  191. data/spec/functional/resource/file_spec.rb +25 -0
  192. data/spec/functional/resource/group_spec.rb +5 -0
  193. data/spec/functional/resource/link_spec.rb +5 -11
  194. data/spec/functional/resource/powershell_spec.rb +40 -5
  195. data/spec/functional/resource/user/useradd_spec.rb +10 -18
  196. data/spec/integration/recipes/lwrp_spec.rb +57 -0
  197. data/spec/integration/recipes/provider_choice.rb +2 -7
  198. data/spec/integration/recipes/recipe_dsl_spec.rb +517 -19
  199. data/spec/spec_helper.rb +1 -1
  200. data/spec/support/lib/chef/provider/openldap_includer.rb +29 -0
  201. data/spec/support/lib/chef/resource/cat.rb +0 -2
  202. data/spec/support/lib/chef/resource/one_two_three_four.rb +0 -6
  203. data/spec/support/lib/chef/resource/openldap_includer.rb +27 -0
  204. data/spec/support/lib/chef/resource/with_state.rb +0 -9
  205. data/spec/support/lib/chef/resource/zen_follower.rb +0 -6
  206. data/spec/support/lib/chef/resource/zen_master.rb +1 -6
  207. data/spec/support/shared/context/client.rb +277 -0
  208. data/spec/support/shared/examples/client.rb +53 -0
  209. data/spec/support/shared/functional/file_resource.rb +0 -4
  210. data/spec/support/shared/functional/securable_resource.rb +0 -24
  211. data/spec/support/shared/functional/securable_resource_with_reporting.rb +4 -4
  212. data/spec/support/shared/functional/windows_script.rb +1 -1
  213. data/spec/support/shared/unit/api_versioning.rb +77 -0
  214. data/spec/support/shared/unit/knife_shared.rb +40 -0
  215. data/spec/support/shared/unit/user_and_client_shared.rb +115 -0
  216. data/spec/unit/api_client_spec.rb +189 -14
  217. data/spec/unit/application/client_spec.rb +0 -5
  218. data/spec/unit/audit/audit_reporter_spec.rb +58 -14
  219. data/spec/unit/audit/logger_spec.rb +42 -0
  220. data/spec/unit/audit/runner_spec.rb +2 -2
  221. data/spec/unit/chef_fs/file_pattern_spec.rb +3 -15
  222. data/spec/unit/client_spec.rb +58 -374
  223. data/spec/unit/cookbook_spec.rb +0 -9
  224. data/spec/unit/cookbook_version_spec.rb +0 -20
  225. data/spec/unit/deprecation_spec.rb +55 -0
  226. data/spec/unit/dsl/resources_spec.rb +85 -0
  227. data/spec/unit/exceptions_spec.rb +2 -2
  228. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +60 -0
  229. data/spec/unit/formatters/doc_spec.rb +46 -0
  230. data/spec/unit/formatters/error_inspectors/api_error_formatting_spec.rb +12 -10
  231. data/spec/unit/guard_interpreter/resource_guard_interpreter_spec.rb +8 -0
  232. data/spec/unit/http/authenticator_spec.rb +11 -2
  233. data/spec/unit/knife/client_create_spec.rb +122 -51
  234. data/spec/unit/knife/core/subcommand_loader_spec.rb +19 -3
  235. data/spec/unit/knife/core/ui_spec.rb +14 -0
  236. data/spec/unit/knife/osc_user_create_spec.rb +93 -0
  237. data/spec/unit/knife/osc_user_delete_spec.rb +44 -0
  238. data/spec/unit/knife/osc_user_edit_spec.rb +52 -0
  239. data/spec/unit/knife/osc_user_list_spec.rb +37 -0
  240. data/spec/unit/knife/osc_user_reregister_spec.rb +58 -0
  241. data/spec/unit/knife/osc_user_show_spec.rb +46 -0
  242. data/spec/unit/knife/user_create_spec.rb +177 -51
  243. data/spec/unit/knife/user_delete_spec.rb +34 -8
  244. data/spec/unit/knife/user_edit_spec.rb +31 -12
  245. data/spec/unit/knife/user_list_spec.rb +7 -3
  246. data/spec/unit/knife/user_reregister_spec.rb +38 -17
  247. data/spec/unit/knife/user_show_spec.rb +35 -11
  248. data/spec/unit/knife_spec.rb +10 -4
  249. data/spec/unit/lwrp_spec.rb +228 -54
  250. data/spec/unit/mixin/api_version_request_handling_spec.rb +127 -0
  251. data/spec/unit/mixin/command_spec.rb +1 -2
  252. data/spec/unit/mixin/powershell_out_spec.rb +70 -0
  253. data/spec/unit/mixin/uris_spec.rb +23 -11
  254. data/spec/unit/node_map_spec.rb +4 -1
  255. data/spec/unit/osc_user_spec.rb +276 -0
  256. data/spec/unit/platform_spec.rb +0 -60
  257. data/spec/unit/provider/deploy_spec.rb +1 -1
  258. data/spec/unit/provider/directory_spec.rb +199 -135
  259. data/spec/unit/provider/ifconfig/debian_spec.rb +0 -10
  260. data/spec/unit/provider/package/aix_spec.rb +16 -16
  261. data/spec/unit/provider/package/dpkg_spec.rb +2 -2
  262. data/spec/unit/provider/package/freebsd/pkg_spec.rb +13 -13
  263. data/spec/unit/provider/package/freebsd/pkgng_spec.rb +9 -9
  264. data/spec/unit/provider/package/freebsd/port_spec.rb +7 -7
  265. data/spec/unit/provider/package/ips_spec.rb +22 -22
  266. data/spec/unit/provider/package/macports_spec.rb +10 -10
  267. data/spec/unit/provider/package/openbsd_spec.rb +4 -26
  268. data/spec/unit/provider/package/pacman_spec.rb +5 -5
  269. data/spec/unit/provider/package/rpm_spec.rb +14 -14
  270. data/spec/unit/provider/package/rubygems_spec.rb +10 -44
  271. data/spec/unit/provider/package/smartos_spec.rb +4 -4
  272. data/spec/unit/provider/package/solaris_spec.rb +11 -11
  273. data/spec/unit/provider/package/zypper_spec.rb +125 -90
  274. data/spec/unit/provider/package_spec.rb +34 -0
  275. data/spec/unit/provider/powershell_spec.rb +53 -11
  276. data/spec/unit/provider/remote_directory_spec.rb +2 -2
  277. data/spec/unit/provider/remote_file/local_file_spec.rb +25 -6
  278. data/spec/unit/provider/service/freebsd_service_spec.rb +0 -12
  279. data/spec/unit/provider/user_spec.rb +3 -3
  280. data/spec/unit/provider_resolver_spec.rb +463 -327
  281. data/spec/unit/recipe_spec.rb +42 -15
  282. data/spec/unit/resource/breakpoint_spec.rb +1 -1
  283. data/spec/unit/resource/erl_call_spec.rb +1 -1
  284. data/spec/unit/resource/file_spec.rb +1 -1
  285. data/spec/unit/resource/ifconfig_spec.rb +10 -6
  286. data/spec/unit/resource/remote_file_spec.rb +5 -0
  287. data/spec/unit/resource/route_spec.rb +1 -1
  288. data/spec/unit/resource/ruby_block_spec.rb +2 -2
  289. data/spec/unit/resource/template_spec.rb +1 -1
  290. data/spec/unit/resource/timestamped_deploy_spec.rb +1 -2
  291. data/spec/unit/resource/windows_service_spec.rb +1 -1
  292. data/spec/unit/resource_spec.rb +99 -13
  293. data/spec/unit/rest_spec.rb +5 -5
  294. data/spec/unit/run_context_spec.rb +41 -0
  295. data/spec/unit/runner_spec.rb +2 -2
  296. data/spec/unit/user_spec.rb +406 -93
  297. data/tasks/maintainers.rb +69 -0
  298. metadata +37 -4
@@ -165,11 +165,6 @@ Enable chef-client interval runs by setting `:client_fork = true` in your config
165
165
  before do
166
166
  allow(Chef::Log).to receive(:warn)
167
167
  end
168
-
169
- it "emits a warning that audit mode is an experimental feature" do
170
- expect(Chef::Log).to receive(:warn).with(/Audit mode is an experimental feature/)
171
- app.reconfigure
172
- end
173
168
  end
174
169
 
175
170
  shared_examples "unrecognized setting" do
@@ -88,6 +88,29 @@ describe Chef::Audit::AuditReporter do
88
88
  reporter.run_completed(node)
89
89
  end
90
90
 
91
+ context "when audit phase failed" do
92
+
93
+ let(:audit_error) { double("AuditError", :class => "Chef::Exceptions::AuditError",
94
+ :message => "Audit phase failed with error message: derpderpderp",
95
+ :backtrace => ["/path/recipe.rb:57", "/path/library.rb:106"]) }
96
+
97
+ before do
98
+ reporter.instance_variable_set(:@audit_phase_error, audit_error)
99
+ end
100
+
101
+ it "reports an error" do
102
+ reporter.run_completed(node)
103
+ expect(run_data).to have_key(:error)
104
+ expect(run_data).to have_key(:error)
105
+ expect(run_data[:error]).to eq <<-EOM.strip!
106
+ Chef::Exceptions::AuditError: Audit phase failed with error message: derpderpderp
107
+ /path/recipe.rb:57
108
+ /path/library.rb:106
109
+ EOM
110
+ end
111
+
112
+ end
113
+
91
114
  context "when unable to post to server" do
92
115
 
93
116
  let(:error) do
@@ -215,9 +238,13 @@ describe Chef::Audit::AuditReporter do
215
238
  let(:audit_data) { Chef::Audit::AuditData.new(node.name, run_id) }
216
239
  let(:run_data) { audit_data.to_hash }
217
240
 
218
- let(:error) { double("AuditError", :class => "Chef::Exception::AuditError",
219
- :message => "Well that certainly didn't work",
220
- :backtrace => ["line 0", "line 1", "line 2"]) }
241
+ let(:audit_error) { double("AuditError", :class => "Chef::Exceptions::AuditError",
242
+ :message => "Audit phase failed with error message: derpderpderp",
243
+ :backtrace => ["/path/recipe.rb:57", "/path/library.rb:106"]) }
244
+
245
+ let(:run_error) { double("RunError", :class => "Chef::Exceptions::RunError",
246
+ :message => "This error shouldn't be reported.",
247
+ :backtrace => ["fix it", "fix it", "fix it"]) }
221
248
 
222
249
  before do
223
250
  allow(reporter).to receive(:auditing_enabled?).and_return(true)
@@ -226,15 +253,32 @@ describe Chef::Audit::AuditReporter do
226
253
  allow(audit_data).to receive(:to_hash).and_return(run_data)
227
254
  end
228
255
 
229
- it "adds the error information to the reported data" do
230
- expect(rest).to receive(:create_url)
231
- expect(rest).to receive(:post)
232
- reporter.run_failed(error)
233
- expect(run_data).to have_key(:error)
234
- expect(run_data[:error]).to eq "Chef::Exception::AuditError: Well that certainly didn't work\n" +
235
- "line 0\nline 1\nline 2"
256
+ context "when no prior exception is stored" do
257
+ it "reports no error" do
258
+ expect(rest).to receive(:create_url)
259
+ expect(rest).to receive(:post)
260
+ reporter.run_failed(run_error)
261
+ expect(run_data).to_not have_key(:error)
262
+ end
236
263
  end
237
264
 
265
+ context "when some prior exception is stored" do
266
+ before do
267
+ reporter.instance_variable_set(:@audit_phase_error, audit_error)
268
+ end
269
+
270
+ it "reports the prior error" do
271
+ expect(rest).to receive(:create_url)
272
+ expect(rest).to receive(:post)
273
+ reporter.run_failed(run_error)
274
+ expect(run_data).to have_key(:error)
275
+ expect(run_data[:error]).to eq <<-EOM.strip!
276
+ Chef::Exceptions::AuditError: Audit phase failed with error message: derpderpderp
277
+ /path/recipe.rb:57
278
+ /path/library.rb:106
279
+ EOM
280
+ end
281
+ end
238
282
  end
239
283
 
240
284
  shared_context "audit data" do
@@ -270,14 +314,14 @@ describe Chef::Audit::AuditReporter do
270
314
 
271
315
  it "notifies audit phase finished to debug log" do
272
316
  expect(Chef::Log).to receive(:debug).with(/Audit Reporter completed/)
273
- reporter.audit_phase_complete
317
+ reporter.audit_phase_complete("Output from audit mode")
274
318
  end
275
319
 
276
320
  it "collects audit data" do
277
321
  ordered_control_groups.each do |_name, group|
278
322
  expect(audit_data).to receive(:add_control_group).with(group)
279
323
  end
280
- reporter.audit_phase_complete
324
+ reporter.audit_phase_complete("Output from audit mode")
281
325
  end
282
326
  end
283
327
 
@@ -288,14 +332,14 @@ describe Chef::Audit::AuditReporter do
288
332
 
289
333
  it "notifies audit phase failed to debug log" do
290
334
  expect(Chef::Log).to receive(:debug).with(/Audit Reporter failed/)
291
- reporter.audit_phase_failed(error)
335
+ reporter.audit_phase_failed(error, "Output from audit mode")
292
336
  end
293
337
 
294
338
  it "collects audit data" do
295
339
  ordered_control_groups.each do |_name, group|
296
340
  expect(audit_data).to receive(:add_control_group).with(group)
297
341
  end
298
- reporter.audit_phase_failed(error)
342
+ reporter.audit_phase_failed(error, "Output from audit mode")
299
343
  end
300
344
  end
301
345
 
@@ -0,0 +1,42 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014 Chef Software, Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'spec_helper'
19
+
20
+ describe Chef::Audit::Logger do
21
+
22
+ before(:each) do
23
+ Chef::Audit::Logger.instance_variable_set(:@buffer, nil)
24
+ end
25
+
26
+ it 'calling puts creates @buffer and adds the message' do
27
+ Chef::Audit::Logger.puts("Output message")
28
+ expect(Chef::Audit::Logger.read_buffer).to eq("Output message\n")
29
+ end
30
+
31
+ it 'calling puts multiple times adds to the message' do
32
+ Chef::Audit::Logger.puts("Output message")
33
+ Chef::Audit::Logger.puts("Output message")
34
+ Chef::Audit::Logger.puts("Output message")
35
+ expect(Chef::Audit::Logger.read_buffer).to eq("Output message\nOutput message\nOutput message\n")
36
+ end
37
+
38
+ it 'calling it before @buffer is set returns an empty string' do
39
+ expect(Chef::Audit::Logger.read_buffer).to eq("")
40
+ end
41
+
42
+ end
@@ -68,8 +68,8 @@ describe Chef::Audit::Runner do
68
68
  in_sub_process do
69
69
  runner.send(:setup)
70
70
 
71
- expect(RSpec.configuration.output_stream).to eq(log_location)
72
- expect(RSpec.configuration.error_stream).to eq(log_location)
71
+ expect(RSpec.configuration.output_stream).to eq(Chef::Audit::Logger)
72
+ expect(RSpec.configuration.error_stream).to eq(Chef::Audit::Logger)
73
73
 
74
74
  expect(RSpec.configuration.formatters.size).to eq(2)
75
75
  expect(RSpec.configuration.formatters).to include(instance_of(Chef::Audit::AuditEventProxy))
@@ -157,7 +157,7 @@ describe Chef::ChefFS::FilePattern do
157
157
  end
158
158
  end
159
159
 
160
- context 'with simple pattern "a\*\b"', :pending => (Chef::Platform.windows?) do
160
+ context 'with simple pattern "a\*\b"', :skip => (Chef::Platform.windows?) do
161
161
  let(:pattern) { Chef::ChefFS::FilePattern.new('a\*\b') }
162
162
  it 'match?' do
163
163
  expect(pattern.match?('a*b')).to be_truthy
@@ -264,7 +264,7 @@ describe Chef::ChefFS::FilePattern do
264
264
  end
265
265
  end
266
266
 
267
- context 'with star pattern "/abc/d[a-z][0-9]f/ghi"', :pending => (Chef::Platform.windows?) do
267
+ context 'with star pattern "/abc/d[a-z][0-9]f/ghi"', :skip => (Chef::Platform.windows?) do
268
268
  let(:pattern) { Chef::ChefFS::FilePattern.new('/abc/d[a-z][0-9]f/ghi') }
269
269
  it 'match?' do
270
270
  expect(pattern.match?('/abc/de1f/ghi')).to be_truthy
@@ -352,11 +352,7 @@ describe Chef::ChefFS::FilePattern do
352
352
  expect(pattern.could_match_children?('/abc/def/ghi')).to be_truthy
353
353
  expect(pattern.could_match_children?('abc')).to be_falsey
354
354
  end
355
- it 'could_match_children? /abc** returns false for /xyz' do
356
- pending 'Make could_match_children? more rigorous'
357
- # At the moment, we return false for this, but in the end it would be nice to return true:
358
- expect(pattern.could_match_children?('/xyz')).to be_falsey
359
- end
355
+
360
356
  it 'exact_child_name_under' do
361
357
  expect(pattern.exact_child_name_under('/')).to eq(nil)
362
358
  expect(pattern.exact_child_name_under('/abc')).to eq(nil)
@@ -440,14 +436,6 @@ describe Chef::ChefFS::FilePattern do
440
436
  expect(p('/.').exact_path).to eq('/')
441
437
  expect(p('/.').match?('/')).to be_truthy
442
438
  end
443
- it 'handles dot by itself', :pending => "decide what to do with dot by itself" do
444
- expect(p('.').normalized_pattern).to eq('.')
445
- expect(p('.').exact_path).to eq('.')
446
- expect(p('.').match?('.')).to be_truthy
447
- expect(p('./').normalized_pattern).to eq('.')
448
- expect(p('./').exact_path).to eq('.')
449
- expect(p('./').match?('.')).to be_truthy
450
- end
451
439
  it 'handles dotdot' do
452
440
  expect(p('abc/../def').normalized_pattern).to eq('def')
453
441
  expect(p('abc/../def').exact_path).to eq('def')
@@ -19,6 +19,8 @@
19
19
  #
20
20
 
21
21
  require 'spec_helper'
22
+ require 'spec/support/shared/context/client'
23
+ require 'spec/support/shared/examples/client'
22
24
 
23
25
  require 'chef/run_context'
24
26
  require 'chef/rest'
@@ -28,55 +30,7 @@ class FooError < RuntimeError
28
30
  end
29
31
 
30
32
  describe Chef::Client do
31
-
32
- let(:hostname) { "hostname" }
33
- let(:machinename) { "machinename.example.org" }
34
- let(:fqdn) { "hostname.example.org" }
35
-
36
- let(:ohai_data) do
37
- { :fqdn => fqdn,
38
- :hostname => hostname,
39
- :machinename => machinename,
40
- :platform => 'example-platform',
41
- :platform_version => 'example-platform-1.0',
42
- :data => {}
43
- }
44
- end
45
-
46
- let(:ohai_system) do
47
- ohai_system = double( "Ohai::System",
48
- :all_plugins => true,
49
- :data => ohai_data)
50
- allow(ohai_system).to receive(:[]) do |key|
51
- ohai_data[key]
52
- end
53
- ohai_system
54
- end
55
-
56
- let(:node) do
57
- Chef::Node.new.tap do |n|
58
- n.name(fqdn)
59
- n.chef_environment("_default")
60
- end
61
- end
62
-
63
- let(:json_attribs) { nil }
64
- let(:client_opts) { {} }
65
-
66
- let(:client) do
67
- Chef::Config[:event_loggers] = []
68
- Chef::Client.new(json_attribs, client_opts).tap do |c|
69
- c.node = node
70
- end
71
- end
72
-
73
- before do
74
- Chef::Log.logger = Logger.new(StringIO.new)
75
-
76
- # Node/Ohai data
77
- #Chef::Config[:node_name] = fqdn
78
- allow(Ohai::System).to receive(:new).and_return(ohai_system)
79
- end
33
+ include_context "client"
80
34
 
81
35
  context "when minimal ohai is configured" do
82
36
  before do
@@ -88,7 +42,6 @@ describe Chef::Client do
88
42
  expect(ohai_system).to receive(:all_plugins).with(expected_filter)
89
43
  client.run_ohai
90
44
  end
91
-
92
45
  end
93
46
 
94
47
  describe "authentication protocol selection" do
@@ -117,7 +70,6 @@ describe Chef::Client do
117
70
 
118
71
  describe "configuring output formatters" do
119
72
  context "when no formatter has been configured" do
120
-
121
73
  context "and STDOUT is a TTY" do
122
74
  before do
123
75
  allow(STDOUT).to receive(:tty?).and_return(true)
@@ -203,135 +155,12 @@ describe Chef::Client do
203
155
  end
204
156
 
205
157
  describe "a full client run" do
206
- shared_context "a client run" do
207
- let(:http_node_load) { double("Chef::REST (node)") }
208
- let(:http_cookbook_sync) { double("Chef::REST (cookbook sync)") }
209
- let(:http_node_save) { double("Chef::REST (node save)") }
210
- let(:runner) { double("Chef::Runner") }
211
- let(:audit_runner) { instance_double("Chef::Audit::Runner", :failed? => false) }
212
-
213
- let(:api_client_exists?) { false }
214
-
215
- let(:stdout) { StringIO.new }
216
- let(:stderr) { StringIO.new }
217
-
218
- let(:enable_fork) { false }
219
-
220
- def stub_for_register
221
- # --Client.register
222
- # Make sure Client#register thinks the client key doesn't
223
- # exist, so it tries to register and create one.
224
- allow(File).to receive(:exists?).and_call_original
225
- expect(File).to receive(:exists?).
226
- with(Chef::Config[:client_key]).
227
- exactly(:once).
228
- and_return(api_client_exists?)
229
-
230
- unless api_client_exists?
231
- # Client.register will register with the validation client name.
232
- expect_any_instance_of(Chef::ApiClient::Registration).to receive(:run)
233
- end
234
- end
235
-
236
- def stub_for_node_load
237
- # Client.register will then turn around create another
238
- # Chef::REST object, this time with the client key it got from the
239
- # previous step.
240
- expect(Chef::REST).to receive(:new).
241
- with(Chef::Config[:chef_server_url], fqdn, Chef::Config[:client_key]).
242
- exactly(:once).
243
- and_return(http_node_load)
244
-
245
- # --Client#build_node
246
- # looks up the node, which we will return, then later saves it.
247
- expect(Chef::Node).to receive(:find_or_create).with(fqdn).and_return(node)
248
-
249
- # --ResourceReporter#node_load_completed
250
- # gets a run id from the server for storing resource history
251
- # (has its own tests, so stubbing it here.)
252
- expect_any_instance_of(Chef::ResourceReporter).to receive(:node_load_completed)
253
- end
254
-
255
- def stub_for_sync_cookbooks
256
- # --Client#setup_run_context
257
- # ---Client#sync_cookbooks -- downloads the list of cookbooks to sync
258
- #
259
- expect_any_instance_of(Chef::CookbookSynchronizer).to receive(:sync_cookbooks)
260
- expect(Chef::REST).to receive(:new).with(Chef::Config[:chef_server_url]).and_return(http_cookbook_sync)
261
- expect(http_cookbook_sync).to receive(:post).
262
- with("environments/_default/cookbook_versions", {:run_list => []}).
263
- and_return({})
264
- end
265
-
266
- def stub_for_converge
267
- # --Client#converge
268
- expect(Chef::Runner).to receive(:new).and_return(runner)
269
- expect(runner).to receive(:converge).and_return(true)
270
- end
271
-
272
- def stub_for_audit
273
- # -- Client#run_audits
274
- expect(Chef::Audit::Runner).to receive(:new).and_return(audit_runner)
275
- expect(audit_runner).to receive(:run).and_return(true)
276
- end
277
-
278
- def stub_for_node_save
279
- allow(node).to receive(:data_for_save).and_return(node.for_json)
280
-
281
- # --Client#save_updated_node
282
- expect(Chef::REST).to receive(:new).with(Chef::Config[:chef_server_url], fqdn, Chef::Config[:client_key], validate_utf8: false).and_return(http_node_save)
283
- expect(http_node_save).to receive(:put_rest).with("nodes/#{fqdn}", node.for_json).and_return(true)
284
- end
285
-
286
- def stub_for_run
287
- expect_any_instance_of(Chef::RunLock).to receive(:acquire)
288
- expect_any_instance_of(Chef::RunLock).to receive(:save_pid)
289
- expect_any_instance_of(Chef::RunLock).to receive(:release)
290
-
291
- # Post conditions: check that node has been filled in correctly
292
- expect(client).to receive(:run_started)
293
- expect(client).to receive(:run_completed_successfully)
294
-
295
- # --ResourceReporter#run_completed
296
- # updates the server with the resource history
297
- # (has its own tests, so stubbing it here.)
298
- expect_any_instance_of(Chef::ResourceReporter).to receive(:run_completed)
299
- # --AuditReporter#run_completed
300
- # posts the audit data to server.
301
- # (has its own tests, so stubbing it here.)
302
- expect_any_instance_of(Chef::Audit::AuditReporter).to receive(:run_completed)
303
- end
304
-
305
- before do
306
- Chef::Config[:client_fork] = enable_fork
307
- Chef::Config[:cache_path] = windows? ? 'C:\chef' : '/var/chef'
308
- Chef::Config[:why_run] = false
309
- Chef::Config[:audit_mode] = :enabled
310
-
311
- stub_const("Chef::Client::STDOUT_FD", stdout)
312
- stub_const("Chef::Client::STDERR_FD", stderr)
313
-
314
- stub_for_register
315
- stub_for_node_load
316
- stub_for_sync_cookbooks
317
- stub_for_converge
318
- stub_for_audit
319
- stub_for_node_save
320
- stub_for_run
321
- end
322
- end
323
-
324
158
  shared_examples_for "a successful client run" do
325
159
  include_context "a client run"
160
+ include_context "converge completed"
161
+ include_context "audit phase completed"
326
162
 
327
- it "runs ohai, sets up authentication, loads node state, synchronizes policy, converges, and runs audits" do
328
- # This is what we're testing.
329
- client.run
330
-
331
- # fork is stubbed, so we can see the outcome of the run
332
- expect(node.automatic_attrs[:platform]).to eq("example-platform")
333
- expect(node.automatic_attrs[:platform_version]).to eq("example-platform-1.0")
334
- end
163
+ include_examples "a completed run"
335
164
  end
336
165
 
337
166
  describe "when running chef-client without fork" do
@@ -339,24 +168,19 @@ describe Chef::Client do
339
168
  end
340
169
 
341
170
  describe "when the client key already exists" do
342
- let(:api_client_exists?) { true }
343
- include_examples "a successful client run"
171
+ include_examples "a successful client run" do
172
+ let(:api_client_exists?) { true }
173
+ end
344
174
  end
345
175
 
346
- describe "when an override run list is given" do
347
- let(:client_opts) { {:override_runlist => "recipe[override_recipe]"} }
348
-
349
- it "should permit spaces in overriding run list" do
176
+ context "when an override run list is given" do
177
+ it "permits spaces in overriding run list" do
350
178
  Chef::Client.new(nil, :override_runlist => 'role[a], role[b]')
351
179
  end
352
180
 
353
- describe "when running the client" do
181
+ describe "calling run" do
354
182
  include_examples "a successful client run" do
355
-
356
- before do
357
- # Client will try to compile and run override_recipe
358
- expect_any_instance_of(Chef::RunContext::CookbookCompiler).to receive(:compile)
359
- end
183
+ let(:client_opts) { {:override_runlist => "recipe[override_recipe]"} }
360
184
 
361
185
  def stub_for_sync_cookbooks
362
186
  # --Client#setup_run_context
@@ -373,13 +197,22 @@ describe Chef::Client do
373
197
  # Expect NO node save
374
198
  expect(node).not_to receive(:save)
375
199
  end
200
+
201
+ before do
202
+ # Client will try to compile and run override_recipe
203
+ expect_any_instance_of(Chef::RunContext::CookbookCompiler).to receive(:compile)
204
+ end
376
205
  end
377
206
  end
378
207
  end
379
208
 
380
209
  describe "when a permanent run list is passed as an option" do
381
- include_examples "a successful client run" do
210
+ it "sets the new run list on the node" do
211
+ client.run
212
+ expect(node.run_list).to eq(Chef::RunList.new(new_runlist))
213
+ end
382
214
 
215
+ include_examples "a successful client run" do
383
216
  let(:new_runlist) { "recipe[new_run_list_recipe]" }
384
217
  let(:client_opts) { {:runlist => new_runlist} }
385
218
 
@@ -399,214 +232,61 @@ describe Chef::Client do
399
232
  # do not create a fixture for this.
400
233
  expect_any_instance_of(Chef::RunContext::CookbookCompiler).to receive(:compile)
401
234
  end
402
-
403
- it "sets the new run list on the node" do
404
- client.run
405
- expect(node.run_list).to eq(Chef::RunList.new(new_runlist))
406
- end
407
235
  end
408
236
  end
409
237
 
410
- describe "when converge fails" do
411
- include_context "a client run" do
412
- let(:e) { Exception.new }
413
- def stub_for_converge
414
- expect(Chef::Runner).to receive(:new).and_return(runner)
415
- expect(runner).to receive(:converge).and_raise(e)
416
- expect(Chef::Application).to receive(:debug_stacktrace).with an_instance_of(Chef::Exceptions::RunFailedWrappingError)
417
- end
418
-
419
- def stub_for_node_save
420
- expect(client).to_not receive(:save_updated_node)
421
- end
422
-
423
- def stub_for_run
424
- expect_any_instance_of(Chef::RunLock).to receive(:acquire)
425
- expect_any_instance_of(Chef::RunLock).to receive(:save_pid)
426
- expect_any_instance_of(Chef::RunLock).to receive(:release)
427
-
428
- # Post conditions: check that node has been filled in correctly
429
- expect(client).to receive(:run_started)
430
- expect(client).to receive(:run_failed)
431
-
432
- expect_any_instance_of(Chef::ResourceReporter).to receive(:run_failed)
433
- expect_any_instance_of(Chef::Audit::AuditReporter).to receive(:run_failed)
434
- end
435
- end
238
+ describe "when converge completes successfully" do
239
+ include_context "a client run"
240
+ include_context "converge completed"
436
241
 
437
- it "runs the audits and raises the error" do
438
- expect{ client.run }.to raise_error(Chef::Exceptions::RunFailedWrappingError) do |error|
439
- expect(error.wrapped_errors.size).to eq(1)
440
- expect(error.wrapped_errors[0]).to eq(e)
242
+ describe "when audit phase errors" do
243
+ include_context "audit phase failed with error"
244
+ include_examples "a completed run with audit failure" do
245
+ let(:run_errors) { [audit_error] }
441
246
  end
442
247
  end
443
- end
444
-
445
- describe "when the audit phase fails" do
446
- context "with an exception" do
447
- context "when audit mode is enabled" do
448
- include_context "a client run" do
449
- let(:e) { Exception.new }
450
- def stub_for_audit
451
- expect(Chef::Audit::Runner).to receive(:new).and_return(audit_runner)
452
- expect(audit_runner).to receive(:run).and_raise(e)
453
- expect(Chef::Application).to receive(:debug_stacktrace).with an_instance_of(Chef::Exceptions::RunFailedWrappingError)
454
- end
455
-
456
- def stub_for_run
457
- expect_any_instance_of(Chef::RunLock).to receive(:acquire)
458
- expect_any_instance_of(Chef::RunLock).to receive(:save_pid)
459
- expect_any_instance_of(Chef::RunLock).to receive(:release)
460
-
461
- # Post conditions: check that node has been filled in correctly
462
- expect(client).to receive(:run_started)
463
- expect(client).to receive(:run_failed)
464
-
465
- expect_any_instance_of(Chef::ResourceReporter).to receive(:run_failed)
466
- expect_any_instance_of(Chef::Audit::AuditReporter).to receive(:run_failed)
467
- end
468
- end
469
-
470
- it "should save the node after converge and raise exception" do
471
- expect{ client.run }.to raise_error(Chef::Exceptions::RunFailedWrappingError) do |error|
472
- expect(error.wrapped_errors.size).to eq(1)
473
- expect(error.wrapped_errors[0]).to eq(e)
474
- end
475
- end
476
- end
477
-
478
- context "when audit mode is disabled" do
479
- include_context "a client run" do
480
- before do
481
- Chef::Config[:audit_mode] = :disabled
482
- end
483
-
484
- let(:e) { FooError.new }
485
-
486
- def stub_for_audit
487
- expect(Chef::Audit::Runner).to_not receive(:new)
488
- end
489
-
490
- def stub_for_converge
491
- expect(Chef::Runner).to receive(:new).and_return(runner)
492
- expect(runner).to receive(:converge).and_raise(e)
493
- expect(Chef::Application).to receive(:debug_stacktrace).with an_instance_of(FooError)
494
- end
495
-
496
- def stub_for_node_save
497
- expect(client).to_not receive(:save_updated_node)
498
- end
499
-
500
- def stub_for_run
501
- expect_any_instance_of(Chef::RunLock).to receive(:acquire)
502
- expect_any_instance_of(Chef::RunLock).to receive(:save_pid)
503
- expect_any_instance_of(Chef::RunLock).to receive(:release)
504
-
505
-
506
- # Post conditions: check that node has been filled in correctly
507
- expect(client).to receive(:run_started)
508
- expect(client).to receive(:run_failed)
509
-
510
- expect_any_instance_of(Chef::ResourceReporter).to receive(:run_failed)
511
-
512
- end
513
-
514
- it "re-raises an unwrapped exception" do
515
- expect { client.run }.to raise_error(FooError)
516
- end
517
- end
518
- end
519
-
520
248
 
249
+ describe "when audit phase completed" do
250
+ include_context "audit phase completed"
251
+ include_examples "a completed run"
521
252
  end
522
253
 
523
- context "with failed audits" do
524
- include_context "a client run" do
525
- let(:audit_runner) do
526
- instance_double("Chef::Audit::Runner", :run => true, :failed? => true, :num_failed => 1, :num_total => 1)
527
- end
528
-
529
- def stub_for_audit
530
- expect(Chef::Audit::Runner).to receive(:new).and_return(audit_runner)
531
- expect(Chef::Application).to receive(:debug_stacktrace).with an_instance_of(Chef::Exceptions::RunFailedWrappingError)
532
- end
533
-
534
- def stub_for_run
535
- expect_any_instance_of(Chef::RunLock).to receive(:acquire)
536
- expect_any_instance_of(Chef::RunLock).to receive(:save_pid)
537
- expect_any_instance_of(Chef::RunLock).to receive(:release)
538
-
539
- # Post conditions: check that node has been filled in correctly
540
- expect(client).to receive(:run_started)
541
- expect(client).to receive(:run_failed)
542
-
543
- expect_any_instance_of(Chef::ResourceReporter).to receive(:run_failed)
544
- expect_any_instance_of(Chef::Audit::AuditReporter).to receive(:run_failed)
545
- end
546
- end
547
-
548
- it "should save the node after converge and raise exception" do
549
- expect{ client.run }.to raise_error(Chef::Exceptions::RunFailedWrappingError) do |error|
550
- expect(error.wrapped_errors.size).to eq(1)
551
- expect(error.wrapped_errors[0]).to be_instance_of(Chef::Exceptions::AuditsFailed)
552
- end
254
+ describe "when audit phase completed with failed controls" do
255
+ include_context "audit phase completed with failed controls"
256
+ include_examples "a completed run with audit failure" do
257
+ let(:run_errors) { [audit_error] }
553
258
  end
554
259
  end
555
260
  end
556
261
 
557
- describe "when why_run mode is enabled" do
558
- include_context "a client run" do
559
-
560
- before do
561
- Chef::Config[:why_run] = true
562
- end
563
-
564
- def stub_for_audit
565
- expect(Chef::Audit::Runner).to_not receive(:new)
566
- end
567
-
568
- def stub_for_node_save
569
- # This is how we should be mocking external calls - not letting it fall all the way through to the
570
- # REST call
571
- expect(node).to receive(:save)
572
- end
573
-
574
- it "runs successfully without enabling the audit runner" do
575
- client.run
262
+ describe "when converge errors" do
263
+ include_context "a client run"
264
+ include_context "converge failed"
576
265
 
577
- # fork is stubbed, so we can see the outcome of the run
578
- expect(node.automatic_attrs[:platform]).to eq("example-platform")
579
- expect(node.automatic_attrs[:platform_version]).to eq("example-platform-1.0")
266
+ describe "when audit phase errors" do
267
+ include_context "audit phase failed with error"
268
+ include_examples "a failed run" do
269
+ let(:run_errors) { [converge_error, audit_error] }
580
270
  end
581
271
  end
582
- end
583
-
584
- describe "when audits are disabled" do
585
- include_context "a client run" do
586
-
587
- before do
588
- Chef::Config[:audit_mode] = :disabled
589
- end
590
272
 
591
- def stub_for_audit
592
- expect(Chef::Audit::Runner).to_not receive(:new)
273
+ describe "when audit phase completed" do
274
+ include_context "audit phase completed"
275
+ include_examples "a failed run" do
276
+ let(:run_errors) { [converge_error] }
593
277
  end
278
+ end
594
279
 
595
- it "runs successfully without enabling the audit runner" do
596
- client.run
597
-
598
- # fork is stubbed, so we can see the outcome of the run
599
- expect(node.automatic_attrs[:platform]).to eq("example-platform")
600
- expect(node.automatic_attrs[:platform_version]).to eq("example-platform-1.0")
280
+ describe "when audit phase completed with failed controls" do
281
+ include_context "audit phase completed with failed controls"
282
+ include_examples "a failed run" do
283
+ let(:run_errors) { [converge_error, audit_error] }
601
284
  end
602
285
  end
603
286
  end
604
-
605
287
  end
606
288
 
607
-
608
289
  describe "when handling run failures" do
609
-
610
290
  it "should remove the run_lock on failure of #load_node" do
611
291
  @run_lock = double("Chef::RunLock", :acquire => true)
612
292
  allow(Chef::RunLock).to receive(:new).and_return(@run_lock)
@@ -779,6 +459,7 @@ describe Chef::Client do
779
459
  Chef::Config[:solo] = true
780
460
  Chef::Config[:cookbook_path] = ["/path/to/invalid/cookbook_path"]
781
461
  end
462
+
782
463
  context "when any directory of cookbook_path contains no cookbook" do
783
464
  it "raises CookbookNotFound error" do
784
465
  expect do
@@ -833,7 +514,10 @@ describe Chef::Client do
833
514
 
834
515
  it "should run exception handlers on early fail" do
835
516
  expect(subject).to receive(:run_failed)
836
- expect { subject.run }.to raise_error(NoMethodError)
517
+ expect { subject.run }.to raise_error(Chef::Exceptions::RunFailedWrappingError) do |error|
518
+ expect(error.wrapped_errors.size).to eq 1
519
+ expect(error.wrapped_errors).to include(NoMethodError)
520
+ end
837
521
  end
838
522
  end
839
523
  end