chef 12.4.3-universal-mingw32 → 12.5.1-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 (320) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +21 -25
  3. data/Gemfile +46 -0
  4. data/README.md +4 -4
  5. data/Rakefile +4 -110
  6. data/bin/chef-service-manager +3 -1
  7. data/distro/common/html/knife_cookbook_site.html +18 -18
  8. data/distro/common/man/man1/knife-cookbook-site.1 +11 -11
  9. data/lib/chef.rb +1 -1
  10. data/lib/chef/application.rb +1 -1
  11. data/lib/chef/application/apply.rb +19 -1
  12. data/lib/chef/application/client.rb +11 -5
  13. data/lib/chef/application/knife.rb +2 -2
  14. data/lib/chef/application/solo.rb +1 -1
  15. data/lib/chef/application/windows_service_manager.rb +19 -12
  16. data/lib/chef/chef_class.rb +46 -0
  17. data/lib/chef/chef_fs/config.rb +22 -24
  18. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +3 -1
  19. data/lib/chef/chef_fs/file_pattern.rb +4 -15
  20. data/lib/chef/chef_fs/file_system/acl_dir.rb +3 -4
  21. data/lib/chef/chef_fs/file_system/acls_dir.rb +5 -1
  22. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +0 -5
  23. data/lib/chef/chef_fs/file_system/base_fs_object.rb +5 -2
  24. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +2 -9
  25. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +2 -9
  26. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +10 -17
  27. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +1 -12
  28. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +15 -11
  29. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +8 -2
  30. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +4 -4
  31. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +1 -1
  32. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +3 -11
  33. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +3 -5
  34. data/lib/chef/chef_fs/file_system/environments_dir.rb +1 -1
  35. data/lib/chef/chef_fs/file_system/file_system_entry.rb +7 -4
  36. data/lib/chef/chef_fs/file_system/memory_dir.rb +2 -3
  37. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +15 -0
  38. data/lib/chef/chef_fs/file_system/nodes_dir.rb +1 -1
  39. data/lib/chef/chef_fs/file_system/organization_members_entry.rb +2 -2
  40. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +4 -9
  41. data/lib/chef/chef_fs/knife.rb +35 -7
  42. data/lib/chef/chef_fs/path_utils.rb +65 -34
  43. data/lib/chef/client.rb +2 -3
  44. data/lib/chef/config.rb +34 -2
  45. data/lib/chef/{mixin/wstring.rb → constants.rb} +9 -13
  46. data/lib/chef/cookbook/metadata.rb +25 -3
  47. data/lib/chef/cookbook/synchronizer.rb +1 -1
  48. data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
  49. data/lib/chef/cookbook_version.rb +3 -3
  50. data/lib/chef/delayed_evaluator.rb +21 -0
  51. data/lib/chef/deprecation/mixin/template.rb +1 -2
  52. data/lib/chef/deprecation/provider/cookbook_file.rb +1 -1
  53. data/lib/chef/deprecation/provider/file.rb +1 -1
  54. data/lib/chef/deprecation/provider/remote_directory.rb +52 -0
  55. data/lib/chef/deprecation/provider/remote_file.rb +1 -2
  56. data/lib/chef/deprecation/provider/template.rb +1 -1
  57. data/lib/chef/deprecation/warnings.rb +3 -4
  58. data/lib/chef/dsl/reboot_pending.rb +3 -2
  59. data/lib/chef/dsl/recipe.rb +26 -7
  60. data/lib/chef/dsl/resources.rb +2 -2
  61. data/lib/chef/event_dispatch/base.rb +51 -22
  62. data/lib/chef/event_dispatch/dispatcher.rb +21 -6
  63. data/lib/chef/event_dispatch/dsl.rb +64 -0
  64. data/lib/chef/exceptions.rb +28 -1
  65. data/lib/chef/file_content_management/tempfile.rb +1 -1
  66. data/lib/chef/formatters/base.rb +3 -0
  67. data/lib/chef/formatters/doc.rb +56 -6
  68. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +36 -0
  69. data/lib/chef/formatters/minimal.rb +2 -2
  70. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +3 -1
  71. data/lib/chef/http/http_request.rb +1 -1
  72. data/lib/chef/knife.rb +35 -55
  73. data/lib/chef/knife/bootstrap.rb +41 -0
  74. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -0
  75. data/lib/chef/knife/bootstrap/client_builder.rb +16 -0
  76. data/lib/chef/knife/bootstrap/templates/README.md +3 -4
  77. data/lib/chef/knife/bootstrap/templates/chef-full.erb +1 -1
  78. data/lib/chef/knife/cookbook_create.rb +1 -1
  79. data/lib/chef/knife/cookbook_site_download.rb +1 -1
  80. data/lib/chef/knife/cookbook_site_install.rb +1 -1
  81. data/lib/chef/knife/cookbook_site_share.rb +6 -6
  82. data/lib/chef/knife/cookbook_site_unshare.rb +2 -2
  83. data/lib/chef/knife/core/bootstrap_context.rb +12 -4
  84. data/lib/chef/knife/core/custom_manifest_loader.rb +69 -0
  85. data/lib/chef/knife/core/gem_glob_loader.rb +138 -0
  86. data/lib/chef/knife/core/hashed_command_loader.rb +80 -0
  87. data/lib/chef/knife/core/node_presenter.rb +24 -1
  88. data/lib/chef/knife/core/object_loader.rb +1 -0
  89. data/lib/chef/knife/core/subcommand_loader.rb +131 -146
  90. data/lib/chef/knife/node_run_list_remove.rb +12 -1
  91. data/lib/chef/knife/null.rb +10 -0
  92. data/lib/chef/knife/rehash.rb +62 -0
  93. data/lib/chef/knife/search.rb +3 -3
  94. data/lib/chef/knife/ssh.rb +52 -30
  95. data/lib/chef/knife/ssl_check.rb +3 -2
  96. data/lib/chef/knife/user_edit.rb +1 -2
  97. data/lib/chef/local_mode.rb +5 -0
  98. data/lib/chef/log.rb +5 -1
  99. data/lib/chef/mixin/deprecation.rb +8 -8
  100. data/lib/chef/mixin/params_validate.rb +362 -135
  101. data/lib/chef/mixin/template.rb +48 -0
  102. data/lib/chef/mixin/which.rb +1 -1
  103. data/lib/chef/mixin/wide_string.rb +72 -0
  104. data/lib/chef/mixin/windows_architecture_helper.rb +15 -39
  105. data/lib/chef/mixin/windows_env_helper.rb +4 -1
  106. data/lib/chef/monkey_patches/webrick-utils.rb +51 -0
  107. data/lib/chef/monkey_patches/win32/registry.rb +72 -0
  108. data/lib/chef/node.rb +116 -3
  109. data/lib/chef/node_map.rb +2 -2
  110. data/lib/chef/platform/handler_map.rb +0 -5
  111. data/lib/chef/platform/provider_mapping.rb +5 -6
  112. data/lib/chef/platform/query_helpers.rb +46 -4
  113. data/lib/chef/platform/rebooter.rb +1 -1
  114. data/lib/chef/platform/service_helpers.rb +30 -32
  115. data/lib/chef/policy_builder.rb +1 -8
  116. data/lib/chef/policy_builder/dynamic.rb +186 -0
  117. data/lib/chef/policy_builder/expand_node_object.rb +30 -15
  118. data/lib/chef/policy_builder/policyfile.rb +155 -18
  119. data/lib/chef/property.rb +568 -0
  120. data/lib/chef/provider.rb +222 -13
  121. data/lib/chef/provider/batch.rb +8 -0
  122. data/lib/chef/provider/deploy.rb +5 -7
  123. data/lib/chef/provider/directory.rb +14 -2
  124. data/lib/chef/provider/dsc_resource.rb +5 -9
  125. data/lib/chef/provider/group/pw.rb +1 -1
  126. data/lib/chef/provider/ifconfig.rb +2 -2
  127. data/lib/chef/provider/lwrp_base.rb +1 -75
  128. data/lib/chef/provider/mount.rb +7 -3
  129. data/lib/chef/provider/package.rb +1 -1
  130. data/lib/chef/provider/package/dpkg.rb +5 -11
  131. data/lib/chef/provider/package/rpm.rb +2 -2
  132. data/lib/chef/provider/package/rubygems.rb +1 -1
  133. data/lib/chef/provider/package/windows/msi.rb +2 -2
  134. data/lib/chef/provider/package/yum.rb +17 -5
  135. data/lib/chef/provider/powershell_script.rb +59 -23
  136. data/lib/chef/provider/registry_key.rb +5 -5
  137. data/lib/chef/provider/remote_directory.rb +190 -102
  138. data/lib/chef/provider/service.rb +12 -2
  139. data/lib/chef/provider/service/aix.rb +1 -1
  140. data/lib/chef/provider/service/debian.rb +3 -5
  141. data/lib/chef/provider/service/freebsd.rb +1 -1
  142. data/lib/chef/provider/service/gentoo.rb +3 -3
  143. data/lib/chef/provider/service/init.rb +3 -3
  144. data/lib/chef/provider/service/insserv.rb +2 -4
  145. data/lib/chef/provider/service/invokercd.rb +2 -4
  146. data/lib/chef/provider/service/macosx.rb +5 -1
  147. data/lib/chef/provider/service/openbsd.rb +2 -1
  148. data/lib/chef/provider/service/redhat.rb +52 -16
  149. data/lib/chef/provider/service/simple.rb +2 -2
  150. data/lib/chef/provider/service/systemd.rb +3 -5
  151. data/lib/chef/provider/service/upstart.rb +4 -6
  152. data/lib/chef/provider/subversion.rb +13 -7
  153. data/lib/chef/provider/template/content.rb +16 -6
  154. data/lib/chef/provider/user/solaris.rb +32 -4
  155. data/lib/chef/provider/windows_script.rb +3 -5
  156. data/lib/chef/provider_resolver.rb +2 -2
  157. data/lib/chef/recipe.rb +1 -8
  158. data/lib/chef/resource.rb +563 -90
  159. data/lib/chef/resource/action_class.rb +83 -0
  160. data/lib/chef/resource/chef_gem.rb +3 -3
  161. data/lib/chef/resource/deploy.rb +8 -2
  162. data/lib/chef/resource/dsc_script.rb +2 -0
  163. data/lib/chef/resource/file/verification.rb +7 -1
  164. data/lib/chef/resource/lwrp_base.rb +1 -7
  165. data/lib/chef/resource/registry_key.rb +1 -1
  166. data/lib/chef/resource/service.rb +10 -2
  167. data/lib/chef/resource/subversion.rb +5 -0
  168. data/lib/chef/resource/windows_script.rb +6 -2
  169. data/lib/chef/resource/yum_package.rb +10 -1
  170. data/lib/chef/resource_resolver.rb +3 -3
  171. data/lib/chef/run_context.rb +402 -83
  172. data/lib/chef/run_list/versioned_recipe_list.rb +15 -0
  173. data/lib/chef/run_lock.rb +30 -21
  174. data/lib/chef/util/powershell/ps_credential.rb +4 -0
  175. data/lib/chef/util/windows.rb +0 -32
  176. data/lib/chef/util/windows/net_group.rb +85 -106
  177. data/lib/chef/util/windows/net_use.rb +35 -71
  178. data/lib/chef/util/windows/net_user.rb +0 -1
  179. data/lib/chef/util/windows/volume.rb +19 -19
  180. data/lib/chef/version.rb +3 -3
  181. data/lib/chef/win32/api.rb +1 -0
  182. data/lib/chef/win32/api/file.rb +20 -0
  183. data/lib/chef/win32/api/net.rb +163 -43
  184. data/lib/chef/win32/api/registry.rb +51 -0
  185. data/lib/chef/win32/api/system.rb +23 -0
  186. data/lib/chef/win32/api/unicode.rb +0 -43
  187. data/lib/chef/win32/crypto.rb +2 -1
  188. data/lib/chef/win32/file.rb +28 -3
  189. data/lib/chef/win32/mutex.rb +1 -2
  190. data/lib/chef/win32/net.rb +162 -8
  191. data/lib/chef/win32/process.rb +13 -0
  192. data/lib/chef/win32/registry.rb +35 -30
  193. data/lib/chef/win32/security.rb +1 -1
  194. data/lib/chef/win32/security/token.rb +1 -1
  195. data/lib/chef/win32/system.rb +62 -0
  196. data/lib/chef/win32/unicode.rb +7 -2
  197. data/lib/chef/win32/version.rb +0 -4
  198. data/lib/chef/workstation_config_loader.rb +3 -158
  199. data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -0
  200. data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -0
  201. data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -0
  202. data/spec/data/dsc_lcm.pfx +0 -0
  203. data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -0
  204. data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -0
  205. data/spec/functional/dsl/reboot_pending_spec.rb +33 -43
  206. data/spec/functional/knife/cookbook_delete_spec.rb +17 -7
  207. data/spec/functional/knife/ssh_spec.rb +16 -0
  208. data/spec/functional/rebooter_spec.rb +1 -1
  209. data/spec/functional/resource/deploy_revision_spec.rb +1 -1
  210. data/spec/functional/resource/dsc_resource_spec.rb +2 -0
  211. data/spec/functional/resource/dsc_script_spec.rb +91 -2
  212. data/spec/functional/resource/group_spec.rb +67 -44
  213. data/spec/functional/resource/{powershell_spec.rb → powershell_script_spec.rb} +107 -18
  214. data/spec/functional/resource/windows_service_spec.rb +1 -1
  215. data/spec/functional/run_lock_spec.rb +368 -189
  216. data/spec/functional/win32/{registry_helper_spec.rb → registry_spec.rb} +16 -23
  217. data/spec/functional/win32/service_manager_spec.rb +2 -2
  218. data/spec/integration/client/client_spec.rb +51 -0
  219. data/spec/integration/knife/chef_repo_path_spec.rb +13 -11
  220. data/spec/integration/knife/download_spec.rb +4 -0
  221. data/spec/integration/knife/list_spec.rb +8 -0
  222. data/spec/integration/knife/upload_spec.rb +1 -1
  223. data/spec/integration/recipes/recipe_dsl_spec.rb +1 -16
  224. data/spec/integration/recipes/remote_directory.rb +74 -0
  225. data/spec/integration/recipes/resource_action_spec.rb +363 -0
  226. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +423 -0
  227. data/spec/integration/recipes/resource_load_spec.rb +206 -0
  228. data/spec/spec_helper.rb +9 -0
  229. data/spec/support/platform_helpers.rb +13 -0
  230. data/spec/support/shared/context/win32.rb +34 -0
  231. data/spec/support/shared/functional/win32_service.rb +2 -1
  232. data/spec/support/shared/functional/windows_script.rb +63 -26
  233. data/spec/support/shared/unit/mock_shellout.rb +46 -0
  234. data/spec/support/shared/unit/provider/file.rb +10 -4
  235. data/spec/unit/application/client_spec.rb +16 -3
  236. data/spec/unit/application/knife_spec.rb +2 -2
  237. data/spec/unit/application/solo_spec.rb +4 -3
  238. data/spec/unit/chef_class_spec.rb +23 -4
  239. data/spec/unit/chef_fs/path_util_spec.rb +108 -0
  240. data/spec/unit/client_spec.rb +6 -1
  241. data/spec/unit/config_spec.rb +31 -0
  242. data/spec/unit/cookbook/metadata_spec.rb +23 -3
  243. data/spec/unit/cookbook/syntax_check_spec.rb +3 -0
  244. data/spec/unit/deprecation_spec.rb +3 -6
  245. data/spec/unit/dsl/reboot_pending_spec.rb +12 -6
  246. data/spec/unit/event_dispatch/dispatcher_spec.rb +65 -3
  247. data/spec/unit/event_dispatch/dsl_spec.rb +83 -0
  248. data/spec/unit/formatters/doc_spec.rb +32 -0
  249. data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +26 -0
  250. data/spec/unit/json_compat_spec.rb +4 -3
  251. data/spec/unit/knife/bootstrap/client_builder_spec.rb +27 -0
  252. data/spec/unit/knife/bootstrap_spec.rb +55 -3
  253. data/spec/unit/knife/cookbook_site_share_spec.rb +3 -3
  254. data/spec/unit/knife/core/bootstrap_context_spec.rb +21 -4
  255. data/spec/unit/knife/core/custom_manifest_loader_spec.rb +41 -0
  256. data/spec/unit/knife/core/gem_glob_loader_spec.rb +210 -0
  257. data/spec/unit/knife/core/hashed_command_loader_spec.rb +93 -0
  258. data/spec/unit/knife/core/subcommand_loader_spec.rb +16 -192
  259. data/spec/unit/knife/node_run_list_remove_spec.rb +17 -0
  260. data/spec/unit/knife/ssl_check_spec.rb +4 -0
  261. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +10 -10
  262. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  263. data/spec/unit/mixin/template_spec.rb +5 -1
  264. data/spec/unit/mixin/windows_architecture_helper_spec.rb +13 -8
  265. data/spec/unit/node_spec.rb +220 -0
  266. data/spec/unit/platform/query_helpers_spec.rb +146 -3
  267. data/spec/unit/policy_builder/dynamic_spec.rb +275 -0
  268. data/spec/unit/policy_builder/expand_node_object_spec.rb +37 -38
  269. data/spec/unit/policy_builder/policyfile_spec.rb +260 -46
  270. data/spec/unit/property/state_spec.rb +506 -0
  271. data/spec/unit/property/validation_spec.rb +663 -0
  272. data/spec/unit/property_spec.rb +1094 -0
  273. data/spec/unit/provider/deploy_spec.rb +5 -5
  274. data/spec/unit/provider/directory_spec.rb +35 -0
  275. data/spec/unit/provider/dsc_resource_spec.rb +3 -10
  276. data/spec/unit/provider/ifconfig_spec.rb +22 -2
  277. data/spec/unit/provider/mount/aix_spec.rb +2 -1
  278. data/spec/unit/provider/mount/mount_spec.rb +6 -0
  279. data/spec/unit/provider/mount/windows_spec.rb +14 -0
  280. data/spec/unit/provider/mount_spec.rb +12 -1
  281. data/spec/unit/provider/package/dpkg_spec.rb +8 -1
  282. data/spec/unit/provider/package/rpm_spec.rb +18 -1
  283. data/spec/unit/provider/package/rubygems_spec.rb +18 -0
  284. data/spec/unit/provider/package/yum_spec.rb +97 -24
  285. data/spec/unit/provider/powershell_script_spec.rb +106 -0
  286. data/spec/unit/provider/registry_key_spec.rb +12 -0
  287. data/spec/unit/provider/remote_directory_spec.rb +1 -2
  288. data/spec/unit/provider/service/aix_service_spec.rb +3 -3
  289. data/spec/unit/provider/service/gentoo_service_spec.rb +4 -4
  290. data/spec/unit/provider/service/macosx_spec.rb +4 -4
  291. data/spec/unit/provider/service/openbsd_service_spec.rb +10 -8
  292. data/spec/unit/provider/service/redhat_spec.rb +88 -8
  293. data/spec/unit/provider/service/upstart_service_spec.rb +11 -7
  294. data/spec/unit/provider/service/windows_spec.rb +211 -200
  295. data/spec/unit/provider/subversion_spec.rb +50 -31
  296. data/spec/unit/provider/template/content_spec.rb +93 -2
  297. data/spec/unit/provider/user/solaris_spec.rb +66 -9
  298. data/spec/unit/provider_resolver_spec.rb +707 -650
  299. data/spec/unit/provider_spec.rb +1 -3
  300. data/spec/unit/recipe_spec.rb +0 -4
  301. data/spec/unit/resource/deploy_spec.rb +7 -1
  302. data/spec/unit/resource/dsc_script_spec.rb +4 -0
  303. data/spec/unit/resource/file/verification_spec.rb +33 -5
  304. data/spec/unit/resource/{powershell_spec.rb → powershell_script_spec.rb} +17 -13
  305. data/spec/unit/resource/service_spec.rb +4 -4
  306. data/spec/unit/resource/subversion_spec.rb +4 -0
  307. data/spec/unit/resource/yum_package_spec.rb +10 -1
  308. data/spec/unit/resource_spec.rb +2 -2
  309. data/spec/unit/run_context/child_run_context_spec.rb +133 -0
  310. data/spec/unit/run_context_spec.rb +7 -0
  311. data/spec/unit/run_list/versioned_recipe_list_spec.rb +5 -0
  312. data/spec/unit/win32/registry_spec.rb +394 -0
  313. data/tasks/external_tests.rb +47 -23
  314. data/tasks/maintainers.rb +155 -14
  315. metadata +64 -53
  316. data/lib/chef/knife/bootstrap/templates/archlinux-gems.erb +0 -76
  317. data/lib/chef/knife/bootstrap/templates/chef-aix.erb +0 -72
  318. data/spec/unit/provider/powershell_spec.rb +0 -80
  319. data/spec/unit/registry_helper_spec.rb +0 -376
  320. data/spec/unit/workstation_config_loader_spec.rb +0 -283
@@ -49,7 +49,7 @@ class Chef
49
49
  end
50
50
  end
51
51
 
52
- raise Chef::Exceptions::FileContentStagingError(errors) if tf.nil?
52
+ raise Chef::Exceptions::FileContentStagingError, errors if tf.nil?
53
53
 
54
54
  # We always process the tempfile in binmode so that we
55
55
  # preserve the line endings of the content.
@@ -212,6 +212,9 @@ class Chef
212
212
  file_load_failed(path, exception)
213
213
  end
214
214
 
215
+ def deprecation(message, location=caller(2..2)[0])
216
+ Chef::Log.deprecation("#{message} at #{location}")
217
+ end
215
218
  end
216
219
 
217
220
 
@@ -22,18 +22,31 @@ class Chef
22
22
  @failed_audits = 0
23
23
  @start_time = Time.now
24
24
  @end_time = @start_time
25
+ @skipped_resources = 0
25
26
  end
26
27
 
27
28
  def elapsed_time
28
29
  end_time - start_time
29
30
  end
30
31
 
32
+ def pretty_elapsed_time
33
+ time = elapsed_time
34
+ if time < 60 then
35
+ message = Time.at(time).utc.strftime("%S seconds")
36
+ elsif time < 3600 then
37
+ message = Time.at(time).utc.strftime("%M minutes %S seconds")
38
+ else
39
+ message = Time.at(time).utc.strftime("%H hours %M minutes %S seconds")
40
+ end
41
+ message
42
+ end
43
+
31
44
  def run_start(version)
32
45
  puts_line "Starting Chef Client, version #{version}"
33
46
  end
34
47
 
35
48
  def total_resources
36
- @up_to_date_resources + @updated_resources
49
+ @up_to_date_resources + @updated_resources + @skipped_resources
37
50
  end
38
51
 
39
52
  def total_audits
@@ -42,10 +55,30 @@ class Chef
42
55
 
43
56
  def run_completed(node)
44
57
  @end_time = Time.now
58
+ # Print out deprecations.
59
+ if !deprecations.empty?
60
+ puts_line ""
61
+ puts_line "Deprecated features used!"
62
+ deprecations.each do |message, locations|
63
+ if locations.size == 1
64
+ puts_line " #{message} at #{locations.size} location:"
65
+ else
66
+ puts_line " #{message} at #{locations.size} locations:"
67
+ end
68
+ locations.each do |location|
69
+ prefix = " - "
70
+ Array(location).each do |line|
71
+ puts_line "#{prefix}#{line}"
72
+ prefix = " "
73
+ end
74
+ end
75
+ end
76
+ puts_line ""
77
+ end
45
78
  if Chef::Config[:why_run]
46
79
  puts_line "Chef Client finished, #{@updated_resources}/#{total_resources} resources would have been updated"
47
80
  else
48
- puts_line "Chef Client finished, #{@updated_resources}/#{total_resources} resources updated in #{elapsed_time} seconds"
81
+ puts_line "Chef Client finished, #{@updated_resources}/#{total_resources} resources updated in #{pretty_elapsed_time}"
49
82
  if total_audits > 0
50
83
  puts_line " #{successful_audits}/#{total_audits} controls succeeded"
51
84
  end
@@ -57,7 +90,7 @@ class Chef
57
90
  if Chef::Config[:why_run]
58
91
  puts_line "Chef Client failed. #{@updated_resources} resources would have been updated"
59
92
  else
60
- puts_line "Chef Client failed. #{@updated_resources} resources updated in #{elapsed_time} seconds"
93
+ puts_line "Chef Client failed. #{@updated_resources} resources updated in #{pretty_elapsed_time}"
61
94
  if total_audits > 0
62
95
  puts_line " #{successful_audits} controls succeeded"
63
96
  end
@@ -132,9 +165,9 @@ class Chef
132
165
  indent
133
166
  end
134
167
 
135
- # Called when cookbook +cookbook_name+ has been sync'd
136
- def synchronized_cookbook(cookbook_name)
137
- puts_line "- #{cookbook_name}"
168
+ # Called when cookbook +cookbook+ has been sync'd
169
+ def synchronized_cookbook(cookbook_name, cookbook)
170
+ puts_line "- #{cookbook.name} (#{cookbook.version})"
138
171
  end
139
172
 
140
173
  # Called when an individual file in a cookbook has been updated
@@ -236,6 +269,7 @@ class Chef
236
269
 
237
270
  # Called when a resource action has been skipped b/c of a conditional
238
271
  def resource_skipped(resource, action, conditional)
272
+ @skipped_resources += 1
239
273
  # TODO: more info about conditional
240
274
  puts " (skipped due to #{conditional.short_description})", :stream => resource
241
275
  unindent
@@ -334,6 +368,16 @@ class Chef
334
368
  end
335
369
  end
336
370
 
371
+ def deprecation(message, location=caller(2..2)[0])
372
+ if Chef::Config[:treat_deprecation_warnings_as_errors]
373
+ super
374
+ end
375
+
376
+ # Save deprecations to the screen until the end
377
+ deprecations[message] ||= Set.new
378
+ deprecations[message] << location
379
+ end
380
+
337
381
  def indent
338
382
  indent_by(2)
339
383
  end
@@ -341,6 +385,12 @@ class Chef
341
385
  def unindent
342
386
  indent_by(-2)
343
387
  end
388
+
389
+ protected
390
+
391
+ def deprecations
392
+ @deprecations ||= {}
393
+ end
344
394
  end
345
395
  end
346
396
  end
@@ -44,6 +44,38 @@ class Chef
44
44
  error_description.section("Cookbook Trace:", traceback)
45
45
  error_description.section("Relevant File Content:", context)
46
46
  end
47
+
48
+ if exception_message_modifying_frozen?
49
+ msg = <<-MESSAGE
50
+ Ruby objects are often frozen to prevent further modifications
51
+ when they would negatively impact the process (e.g. values inside
52
+ Ruby's ENV class) or to prevent polluting other objects when default
53
+ values are passed by reference to many instances of an object (e.g.
54
+ the empty Array as a Chef resource default, passed by reference
55
+ to every instance of the resource).
56
+
57
+ Chef uses Object#freeze to ensure the default values of properties
58
+ inside Chef resources are not modified, so that when a new instance
59
+ of a Chef resource is created, and Object#dup copies values by
60
+ reference, the new resource is not receiving a default value that
61
+ has been by a previous instance of that resource.
62
+
63
+ Instead of modifying an object that contains a default value for all
64
+ instances of a Chef resource, create a new object and assign it to
65
+ the resource's parameter, e.g.:
66
+
67
+ fruit_basket = resource(:fruit_basket, 'default')
68
+
69
+ # BAD: modifies 'contents' object for all new fruit_basket instances
70
+ fruit_basket.contents << 'apple'
71
+
72
+ # GOOD: allocates new array only owned by this fruit_basket instance
73
+ fruit_basket.contents %w(apple)
74
+
75
+ MESSAGE
76
+
77
+ error_description.section("Additional information:", msg.gsub(/^ {6}/, ''))
78
+ end
47
79
  end
48
80
 
49
81
  def context
@@ -111,6 +143,10 @@ class Chef
111
143
  end
112
144
  end
113
145
 
146
+ def exception_message_modifying_frozen?
147
+ exception.message.include?("can't modify frozen")
148
+ end
149
+
114
150
  end
115
151
 
116
152
  end
@@ -109,8 +109,8 @@ class Chef
109
109
  puts "Synchronizing cookbooks"
110
110
  end
111
111
 
112
- # Called when cookbook +cookbook_name+ has been sync'd
113
- def synchronized_cookbook(cookbook_name)
112
+ # Called when cookbook +cookbook+ has been sync'd
113
+ def synchronized_cookbook(cookbook_name, cookbook)
114
114
  print "."
115
115
  end
116
116
 
@@ -68,7 +68,9 @@ class Chef
68
68
  run_action = action || @resource.action
69
69
 
70
70
  begin
71
- # Coerce to an array to be safe.
71
+ # Coerce to an array to be safe. This could happen with a legacy
72
+ # resource or something overriding the default_action code in a
73
+ # subclass.
72
74
  Array(run_action).each {|action_to_run| @resource.run_action(action_to_run) }
73
75
  resource_updated = @resource.updated
74
76
  rescue Mixlib::ShellOut::ShellCommandFailed
@@ -40,7 +40,7 @@ class Chef
40
40
 
41
41
  engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
42
42
 
43
- UA_COMMON = "/#{::Chef::VERSION} (#{engine}-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}; ohai-#{Ohai::VERSION}; #{RUBY_PLATFORM}; +http://opscode.com)"
43
+ UA_COMMON = "/#{::Chef::VERSION} (#{engine}-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}; ohai-#{Ohai::VERSION}; #{RUBY_PLATFORM}; +https://chef.io)"
44
44
  DEFAULT_UA = "Chef Client" << UA_COMMON
45
45
 
46
46
  USER_AGENT = "User-Agent".freeze
@@ -87,6 +87,7 @@ class Chef
87
87
  def self.inherited(subclass)
88
88
  unless subclass.unnamed?
89
89
  subcommands[subclass.snake_case_name] = subclass
90
+ subcommand_files[subclass.snake_case_name] += [caller[0].split(/:\d+/).first]
90
91
  end
91
92
  end
92
93
 
@@ -121,17 +122,29 @@ class Chef
121
122
  end
122
123
 
123
124
  def self.subcommand_loader
124
- @subcommand_loader ||= Knife::SubcommandLoader.new(chef_config_dir)
125
+ @subcommand_loader ||= Chef::Knife::SubcommandLoader.for_config(chef_config_dir)
125
126
  end
126
127
 
127
128
  def self.load_commands
128
129
  @commands_loaded ||= subcommand_loader.load_commands
129
130
  end
130
131
 
132
+ def self.guess_category(args)
133
+ subcommand_loader.guess_category(args)
134
+ end
135
+
136
+ def self.subcommand_class_from(args)
137
+ subcommand_loader.command_class_from(args) || subcommand_not_found!(args)
138
+ end
139
+
131
140
  def self.subcommands
132
141
  @@subcommands ||= {}
133
142
  end
134
143
 
144
+ def self.subcommand_files
145
+ @@subcommand_files ||= Hash.new([])
146
+ end
147
+
135
148
  def self.subcommands_by_category
136
149
  unless @subcommands_by_category
137
150
  @subcommands_by_category = Hash.new { |hash, key| hash[key] = [] }
@@ -142,30 +155,6 @@ class Chef
142
155
  @subcommands_by_category
143
156
  end
144
157
 
145
- # Print the list of subcommands knife knows about. If +preferred_category+
146
- # is given, only subcommands in that category are shown
147
- def self.list_commands(preferred_category=nil)
148
- load_commands
149
-
150
- category_desc = preferred_category ? preferred_category + " " : ''
151
- msg "Available #{category_desc}subcommands: (for details, knife SUB-COMMAND --help)\n\n"
152
-
153
- if preferred_category && subcommands_by_category.key?(preferred_category)
154
- commands_to_show = {preferred_category => subcommands_by_category[preferred_category]}
155
- else
156
- commands_to_show = subcommands_by_category
157
- end
158
-
159
- commands_to_show.sort.each do |category, commands|
160
- next if category =~ /deprecated/i
161
- msg "** #{category.upcase} COMMANDS **"
162
- commands.sort.each do |command|
163
- msg subcommands[command].banner if subcommands[command]
164
- end
165
- msg
166
- end
167
- end
168
-
169
158
  # Shared with subclasses
170
159
  @@chef_config_dir = nil
171
160
 
@@ -206,7 +195,6 @@ class Chef
206
195
  Chef::Log.level(:debug)
207
196
  end
208
197
 
209
- load_commands
210
198
  subcommand_class = subcommand_class_from(args)
211
199
  subcommand_class.options = options.merge!(subcommand_class.options)
212
200
  subcommand_class.load_deps
@@ -215,34 +203,6 @@ class Chef
215
203
  instance.run_with_pretty_exceptions
216
204
  end
217
205
 
218
- def self.guess_category(args)
219
- category_words = args.select {|arg| arg =~ /^(([[:alnum:]])[[:alnum:]\_\-]+)$/ }
220
- category_words.map! {|w| w.split('-')}.flatten!
221
- matching_category = nil
222
- while (!matching_category) && (!category_words.empty?)
223
- candidate_category = category_words.join(' ')
224
- matching_category = candidate_category if subcommands_by_category.key?(candidate_category)
225
- matching_category || category_words.pop
226
- end
227
- matching_category
228
- end
229
-
230
- def self.subcommand_class_from(args)
231
- command_words = args.select {|arg| arg =~ /^(([[:alnum:]])[[:alnum:]\_\-]+)$/ }
232
-
233
- subcommand_class = nil
234
-
235
- while ( !subcommand_class ) && ( !command_words.empty? )
236
- snake_case_class_name = command_words.join("_")
237
- unless subcommand_class = subcommands[snake_case_class_name]
238
- command_words.pop
239
- end
240
- end
241
- # see if we got the command as e.g., knife node-list
242
- subcommand_class ||= subcommands[args.first.gsub('-', '_')]
243
- subcommand_class || subcommand_not_found!(args)
244
- end
245
-
246
206
  def self.dependency_loaders
247
207
  @dependency_loaders ||= []
248
208
  end
@@ -265,7 +225,13 @@ class Chef
265
225
  # Error out and print usage. probably because the arguments given by the
266
226
  # user could not be resolved to a subcommand.
267
227
  def self.subcommand_not_found!(args)
268
- ui.fatal("Cannot find sub command for: '#{args.join(' ')}'")
228
+ ui.fatal("Cannot find subcommand for: '#{args.join(' ')}'")
229
+
230
+ # Mention rehash when the subcommands cache(plugin_manifest.json) is used
231
+ if subcommand_loader.is_a?(Chef::Knife::SubcommandLoader::HashedCommandLoader) ||
232
+ subcommand_loader.is_a?(Chef::Knife::SubcommandLoader::CustomManifestLoader)
233
+ ui.info("If this is a recently installed plugin, please run 'knife rehash' to update the subcommands cache.")
234
+ end
269
235
 
270
236
  if category_commands = guess_category(args)
271
237
  list_commands(category_commands)
@@ -280,6 +246,20 @@ class Chef
280
246
  exit 10
281
247
  end
282
248
 
249
+ def self.list_commands(preferred_category=nil)
250
+ category_desc = preferred_category ? preferred_category + " " : ''
251
+ msg "Available #{category_desc}subcommands: (for details, knife SUB-COMMAND --help)\n\n"
252
+ subcommand_loader.list_commands(preferred_category).sort.each do |category, commands|
253
+ next if category =~ /deprecated/i
254
+ msg "** #{category.upcase} COMMANDS **"
255
+ commands.sort.each do |command|
256
+ subcommand_loader.load_command(command)
257
+ msg subcommands[command].banner if subcommands[command]
258
+ end
259
+ msg
260
+ end
261
+ end
262
+
283
263
  def self.reset_config_path!
284
264
  @@chef_config_dir = nil
285
265
  end
@@ -143,6 +143,22 @@ class Chef
143
143
  :proc => lambda { |o| o.split(/[\s,]+/) },
144
144
  :default => []
145
145
 
146
+ option :policy_name,
147
+ :long => "--policy-name POLICY_NAME",
148
+ :description => "Policyfile name to use (--policy-group must also be given)",
149
+ :default => nil
150
+
151
+ option :policy_group,
152
+ :long => "--policy-group POLICY_GROUP",
153
+ :description => "Policy group name to use (--policy-name must also be given)",
154
+ :default => nil
155
+
156
+ option :tags,
157
+ :long => "--tags TAGS",
158
+ :description => "Comma separated list of tags to apply to the node",
159
+ :proc => lambda { |o| o.split(/[\s,]+/) },
160
+ :default => []
161
+
146
162
  option :first_boot_attributes,
147
163
  :short => "-j JSON_ATTRIBS",
148
164
  :long => "--json-attributes",
@@ -309,6 +325,7 @@ class Chef
309
325
 
310
326
  def run
311
327
  validate_name_args!
328
+ validate_options!
312
329
 
313
330
  $stdout.sync = true
314
331
 
@@ -357,6 +374,17 @@ class Chef
357
374
  end
358
375
  end
359
376
 
377
+ def validate_options!
378
+ if incomplete_policyfile_options?
379
+ ui.error("--policy-name and --policy-group must be specified together")
380
+ exit 1
381
+ elsif policyfile_and_run_list_given?
382
+ ui.error("Policyfile options and --run-list are exclusive")
383
+ exit 1
384
+ end
385
+ true
386
+ end
387
+
360
388
  def knife_ssh
361
389
  ssh = Chef::Knife::Ssh.new
362
390
  ssh.ui = ui
@@ -389,6 +417,19 @@ class Chef
389
417
 
390
418
  command
391
419
  end
420
+
421
+ private
422
+
423
+ # True if policy_name and run_list are both given
424
+ def policyfile_and_run_list_given?
425
+ !config[:run_list].empty? && !!config[:policy_name]
426
+ end
427
+
428
+ # True if one of policy_name or policy_group was given, but not both
429
+ def incomplete_policyfile_options?
430
+ (!!config[:policy_name] ^ config[:policy_group])
431
+ end
432
+
392
433
  end
393
434
  end
394
435
  end
@@ -15,6 +15,7 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
+ require 'chef/knife/bootstrap'
18
19
 
19
20
  class Chef
20
21
  class Knife