chef 12.4.3-universal-mingw32 → 12.5.1-universal-mingw32

Sign up to get free protection for your applications and to get access to all the features.
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