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
@@ -26,6 +26,7 @@ require 'chef/mixin/powershell_out'
26
26
  require 'chef/mixin/provides'
27
27
  require 'chef/platform/service_helpers'
28
28
  require 'chef/node_map'
29
+ require 'forwardable'
29
30
 
30
31
  class Chef
31
32
  class Provider
@@ -65,6 +66,7 @@ class Chef
65
66
 
66
67
  @recipe_name = nil
67
68
  @cookbook_name = nil
69
+ self.class.include_resource_dsl_module(new_resource)
68
70
  end
69
71
 
70
72
  def whyrun_mode?
@@ -119,11 +121,11 @@ class Chef
119
121
  check_resource_semantics!
120
122
 
121
123
  # user-defined LWRPs may include unsafe load_current_resource methods that cannot be run in whyrun mode
122
- if !whyrun_mode? || whyrun_supported?
124
+ if whyrun_mode? && !whyrun_supported?
125
+ events.resource_current_state_load_bypassed(@new_resource, @action, @current_resource)
126
+ else
123
127
  load_current_resource
124
128
  events.resource_current_state_loaded(@new_resource, @action, @current_resource)
125
- elsif whyrun_mode? && !whyrun_supported?
126
- events.resource_current_state_load_bypassed(@new_resource, @action, @current_resource)
127
129
  end
128
130
 
129
131
  define_resource_requirements
@@ -136,9 +138,7 @@ class Chef
136
138
  # we can't execute the action.
137
139
  # in non-whyrun mode, this will still cause the action to be
138
140
  # executed normally.
139
- if whyrun_supported? && !requirements.action_blocked?(@action)
140
- send("action_#{@action}")
141
- elsif whyrun_mode?
141
+ if whyrun_mode? && (!whyrun_supported? || requirements.action_blocked?(@action))
142
142
  events.resource_bypassed(@new_resource, @action, self)
143
143
  else
144
144
  send("action_#{@action}")
@@ -175,6 +175,62 @@ class Chef
175
175
  converge_actions.add_action(descriptions, &block)
176
176
  end
177
177
 
178
+ #
179
+ # Handle patchy convergence safely.
180
+ #
181
+ # - Does *not* call the block if the current_resource's properties match
182
+ # the properties the user specified on the resource.
183
+ # - Calls the block if current_resource does not exist
184
+ # - Calls the block if the user has specified any properties in the resource
185
+ # whose values are *different* from current_resource.
186
+ # - Does *not* call the block if why-run is enabled (just prints out text).
187
+ # - Prints out automatic green text saying what properties have changed.
188
+ #
189
+ # @param properties An optional list of property names (symbols). If not
190
+ # specified, `new_resource.class.state_properties` will be used.
191
+ # @param converge_block The block to do the converging in.
192
+ #
193
+ # @return [Boolean] whether the block was executed.
194
+ #
195
+ def converge_if_changed(*properties, &converge_block)
196
+ if !converge_block
197
+ raise ArgumentError, "converge_if_changed must be passed a block!"
198
+ end
199
+
200
+ properties = new_resource.class.state_properties.map { |p| p.name } if properties.empty?
201
+ properties = properties.map { |p| p.to_sym }
202
+ if current_resource
203
+ # Collect the list of modified properties
204
+ specified_properties = properties.select { |property| new_resource.property_is_set?(property) }
205
+ modified = specified_properties.select { |p| new_resource.send(p) != current_resource.send(p) }
206
+ if modified.empty?
207
+ Chef::Log.debug("Skipping update of #{new_resource.to_s}: has not changed any of the specified properties #{specified_properties.map { |p| "#{p}=#{new_resource.send(p).inspect}" }.join(", ")}.")
208
+ return false
209
+ end
210
+
211
+ # Print the pretty green text and run the block
212
+ property_size = modified.map { |p| p.size }.max
213
+ modified = modified.map { |p| " set #{p.to_s.ljust(property_size)} to #{new_resource.send(p).inspect} (was #{current_resource.send(p).inspect})" }
214
+ converge_by([ "update #{current_resource.identity}" ] + modified, &converge_block)
215
+
216
+ else
217
+ # The resource doesn't exist. Mark that we are *creating* this, and
218
+ # write down any properties we are setting.
219
+ property_size = properties.map { |p| p.size }.max
220
+ created = []
221
+ properties.each do |property|
222
+ if new_resource.property_is_set?(property)
223
+ created << " set #{property.to_s.ljust(property_size)} to #{new_resource.send(property).inspect}"
224
+ else
225
+ created << " set #{property.to_s.ljust(property_size)} to #{new_resource.send(property).inspect} (default value)"
226
+ end
227
+ end
228
+
229
+ converge_by([ "create #{new_resource.identity}" ] + created, &converge_block)
230
+ end
231
+ true
232
+ end
233
+
178
234
  def self.provides(short_name, opts={}, &block)
179
235
  Chef.provider_handler_map.set(short_name, self, opts, &block)
180
236
  end
@@ -183,6 +239,157 @@ class Chef
183
239
  Chef::ProviderResolver.new(node, resource, :nothing).provided_by?(self)
184
240
  end
185
241
 
242
+ #
243
+ # Include attributes, public and protected methods from this Resource in
244
+ # the provider.
245
+ #
246
+ # If this is set to true, delegate methods are included in the provider so
247
+ # that you can call (for example) `attrname` and it will call
248
+ # `new_resource.attrname`.
249
+ #
250
+ # The actual include does not happen until the first time the Provider
251
+ # is instantiated (so that we don't have to worry about load order issues).
252
+ #
253
+ # @param include_resource_dsl [Boolean] Whether to include resource DSL or
254
+ # not (defaults to `false`).
255
+ #
256
+ def self.include_resource_dsl(include_resource_dsl)
257
+ @include_resource_dsl = include_resource_dsl
258
+ end
259
+
260
+ # Create the resource DSL module that forwards resource methods to new_resource
261
+ #
262
+ # @api private
263
+ def self.include_resource_dsl_module(resource)
264
+ if @include_resource_dsl && !defined?(@included_resource_dsl_module)
265
+ provider_class = self
266
+ @included_resource_dsl_module = Module.new do
267
+ extend Forwardable
268
+ define_singleton_method(:to_s) { "forwarder module for #{provider_class}" }
269
+ define_singleton_method(:inspect) { to_s }
270
+ # Add a delegator for each explicit property that will get the *current* value
271
+ # of the property by default instead of the *actual* value.
272
+ resource.class.properties.each do |name, property|
273
+ class_eval(<<-EOM, __FILE__, __LINE__)
274
+ def #{name}(*args, &block)
275
+ # If no arguments were passed, we process "get" by defaulting
276
+ # the value to current_resource, not new_resource. This helps
277
+ # avoid issues where resources accidentally overwrite perfectly
278
+ # valid stuff with default values.
279
+ if args.empty? && !block
280
+ if !new_resource.property_is_set?(__method__) && current_resource
281
+ return current_resource.public_send(__method__)
282
+ end
283
+ end
284
+ new_resource.public_send(__method__, *args, &block)
285
+ end
286
+ EOM
287
+ end
288
+ dsl_methods =
289
+ resource.class.public_instance_methods +
290
+ resource.class.protected_instance_methods -
291
+ provider_class.instance_methods -
292
+ resource.class.properties.keys
293
+ def_delegators(:new_resource, *dsl_methods)
294
+ end
295
+ include @included_resource_dsl_module
296
+ end
297
+ end
298
+
299
+ # Enables inline evaluation of resources in provider actions.
300
+ #
301
+ # Without this option, any resources declared inside the Provider are added
302
+ # to the resource collection after the current position at the time the
303
+ # action is executed. Because they are added to the primary resource
304
+ # collection for the chef run, they can notify other resources outside
305
+ # the Provider, and potentially be notified by resources outside the Provider
306
+ # (but this is complicated by the fact that they don't exist until the
307
+ # provider executes). In this mode, it is impossible to correctly set the
308
+ # updated_by_last_action flag on the parent Provider resource, since it
309
+ # executes and returns before its component resources are run.
310
+ #
311
+ # With this option enabled, each action creates a temporary run_context
312
+ # with its own resource collection, evaluates the action's code in that
313
+ # context, and then converges the resources created. If any resources
314
+ # were updated, then this provider's new_resource will be marked updated.
315
+ #
316
+ # In this mode, resources created within the Provider cannot interact with
317
+ # external resources via notifies, though notifications to other
318
+ # resources within the Provider will work. Delayed notifications are executed
319
+ # at the conclusion of the provider's action, *not* at the end of the
320
+ # main chef run.
321
+ #
322
+ # This mode of evaluation is experimental, but is believed to be a better
323
+ # set of tradeoffs than the append-after mode, so it will likely become
324
+ # the default in a future major release of Chef.
325
+ #
326
+ def self.use_inline_resources
327
+ extend InlineResources::ClassMethods
328
+ include InlineResources
329
+ end
330
+
331
+ # Chef::Provider::InlineResources
332
+ # Implementation of inline resource convergence for providers. See
333
+ # Provider.use_inline_resources for a longer explanation.
334
+ #
335
+ # This code is restricted to a module so that it can be selectively
336
+ # applied to providers on an opt-in basis.
337
+ #
338
+ # @api private
339
+ module InlineResources
340
+
341
+ # Our run context is a child of the main run context; that gives us a
342
+ # whole new resource collection and notification set.
343
+ def initialize(resource, run_context)
344
+ super(resource, run_context.create_child)
345
+ end
346
+
347
+ # Class methods for InlineResources. Overrides the `action` DSL method
348
+ # with one that enables inline resource convergence.
349
+ #
350
+ # @api private
351
+ module ClassMethods
352
+ # Defines an action method on the provider, running the block to
353
+ # compile the resources, converging them, and then checking if any
354
+ # were updated (and updating new-resource if so)
355
+ def action(name, &block)
356
+ # We first try to create the method using "def method_name", which is
357
+ # preferred because it actually shows up in stack traces. If that
358
+ # fails, we try define_method.
359
+ begin
360
+ class_eval <<-EOM, __FILE__, __LINE__+1
361
+ def action_#{name}
362
+ return_value = compile_action_#{name}
363
+ Chef::Runner.new(run_context).converge
364
+ return_value
365
+ ensure
366
+ if run_context.resource_collection.any? {|r| r.updated? }
367
+ new_resource.updated_by_last_action(true)
368
+ end
369
+ end
370
+ EOM
371
+ rescue SyntaxError
372
+ define_method("action_#{name}") do
373
+ begin
374
+ return_value = send("compile_action_#{name}")
375
+ Chef::Runner.new(run_context).converge
376
+ return_value
377
+ ensure
378
+ if run_context.resource_collection.any? {|r| r.updated? }
379
+ new_resource.updated_by_last_action(true)
380
+ end
381
+ end
382
+ end
383
+ end
384
+ # We put the action in its own method so that super() works.
385
+ define_method("compile_action_#{name}", &block)
386
+ end
387
+ end
388
+
389
+ require 'chef/dsl/recipe'
390
+ include Chef::DSL::Recipe::FullDSL
391
+ end
392
+
186
393
  protected
187
394
 
188
395
  def converge_actions
@@ -200,19 +407,21 @@ class Chef
200
407
  # manipulating notifies.
201
408
 
202
409
  converge_by ("evaluate block and run any associated actions") do
203
- saved_run_context = @run_context
204
- @run_context = @run_context.dup
205
- @run_context.resource_collection = Chef::ResourceCollection.new
206
- instance_eval(&block)
207
- Chef::Runner.new(@run_context).converge
208
- @run_context = saved_run_context
410
+ saved_run_context = run_context
411
+ begin
412
+ @run_context = run_context.create_child
413
+ instance_eval(&block)
414
+ Chef::Runner.new(run_context).converge
415
+ ensure
416
+ @run_context = saved_run_context
417
+ end
209
418
  end
210
419
  end
211
420
 
212
421
  module DeprecatedLWRPClass
213
422
  def const_missing(class_name)
214
423
  if deprecated_constants[class_name.to_sym]
215
- Chef::Log.deprecation("Using an LWRP provider by its name (#{class_name}) directly is no longer supported in Chef 12 and will be removed. Use Chef::ProviderResolver.new(node, resource, action) instead.")
424
+ Chef.log_deprecation("Using an LWRP provider by its name (#{class_name}) directly is no longer supported in Chef 12 and will be removed. Use Chef::ProviderResolver.new(node, resource, action) instead.")
216
425
  deprecated_constants[class_name.to_sym]
217
426
  else
218
427
  raise NameError, "uninitialized constant Chef::Provider::#{class_name}"
@@ -28,6 +28,14 @@ class Chef
28
28
  super(new_resource, run_context, '.bat')
29
29
  end
30
30
 
31
+ def command
32
+ basepath = is_forced_32bit ? wow64_directory : run_context.node.kernel.os_info.system_directory
33
+
34
+ interpreter_path = Chef::Util::PathHelper.join(basepath, interpreter)
35
+
36
+ "\"#{interpreter_path}\" #{flags} \"#{script_file.path}\""
37
+ end
38
+
31
39
  def flags
32
40
  @new_resource.flags.nil? ? '/c' : new_resource.flags + ' /c'
33
41
  end
@@ -201,7 +201,7 @@ class Chef
201
201
 
202
202
  converge_by("execute migration command #{@new_resource.migration_command}") do
203
203
  Chef::Log.info "#{@new_resource} migrating #{@new_resource.user} with environment #{env_info}"
204
- run_command(run_options(:command => @new_resource.migration_command, :cwd=>release_path, :log_level => :info))
204
+ shell_out!(@new_resource.migration_command,run_options(:cwd=>release_path, :log_level => :info))
205
205
  end
206
206
  end
207
207
  end
@@ -221,7 +221,7 @@ class Chef
221
221
  else
222
222
  converge_by("restart app using command #{@new_resource.restart_command}") do
223
223
  Chef::Log.info("#{@new_resource} restarting app")
224
- run_command(run_options(:command => @new_resource.restart_command, :cwd => @new_resource.current_path))
224
+ shell_out!(@new_resource.restart_command,run_options(:cwd=>@new_resource.current_path))
225
225
  end
226
226
  end
227
227
  end
@@ -373,11 +373,9 @@ class Chef
373
373
  end
374
374
 
375
375
  def gem_resource_collection_runner
376
- gems_collection = Chef::ResourceCollection.new
377
- gem_packages.each { |rbgem| gems_collection.insert(rbgem) }
378
- gems_run_context = run_context.dup
379
- gems_run_context.resource_collection = gems_collection
380
- Chef::Runner.new(gems_run_context)
376
+ child_context = run_context.create_child
377
+ gem_packages.each { |rbgem| child_context.resource_collection.insert(rbgem) }
378
+ Chef::Runner.new(child_context)
381
379
  end
382
380
 
383
381
  def gem_packages
@@ -64,7 +64,13 @@ class Chef
64
64
  is_parent_writable = lambda do |base_dir|
65
65
  base_dir = ::File.dirname(base_dir)
66
66
  if ::File.exists?(base_dir)
67
- Chef::FileAccessControl.writable?(base_dir)
67
+ if Chef::FileAccessControl.writable?(base_dir)
68
+ true
69
+ elsif Chef::Util::PathHelper.is_sip_path?(base_dir, node)
70
+ Chef::Util::PathHelper.writable_sip_path?(base_dir)
71
+ else
72
+ false
73
+ end
68
74
  else
69
75
  is_parent_writable.call(base_dir)
70
76
  end
@@ -74,7 +80,13 @@ class Chef
74
80
  # in why run mode & parent directory does not exist no permissions check is required
75
81
  # If not in why run, permissions must be valid and we rely on prior assertion that dir exists
76
82
  if !whyrun_mode? || ::File.exists?(parent_directory)
77
- Chef::FileAccessControl.writable?(parent_directory)
83
+ if Chef::FileAccessControl.writable?(parent_directory)
84
+ true
85
+ elsif Chef::Util::PathHelper.is_sip_path?(parent_directory, node)
86
+ Chef::Util::PathHelper.writable_sip_path?(@new_resource.path)
87
+ else
88
+ false
89
+ end
78
90
  else
79
91
  true
80
92
  end
@@ -59,9 +59,7 @@ class Chef
59
59
  a.block_action!
60
60
  end
61
61
  requirements.assert(:run) do |a|
62
- a.assertion {
63
- meta_configuration['RefreshMode'] == 'Disabled'
64
- }
62
+ a.assertion { dsc_refresh_mode_disabled? }
65
63
  err = ["The LCM must have its RefreshMode set to Disabled. "]
66
64
  a.failure_message Chef::Exceptions::ProviderNotFound, err.join(' ')
67
65
  a.whyrun err + ["Assuming a previous resource sets the RefreshMode."]
@@ -85,6 +83,10 @@ class Chef
85
83
  def supports_dsc_invoke_resource?
86
84
  run_context && Chef::Platform.supports_dsc_invoke_resource?(node)
87
85
  end
86
+
87
+ def dsc_refresh_mode_disabled?
88
+ Chef::Platform.dsc_refresh_mode_disabled?(node)
89
+ end
88
90
 
89
91
  def generate_description
90
92
  @converge_description
@@ -153,12 +155,6 @@ class Chef
153
155
  cmdlet.run!
154
156
  end
155
157
 
156
- def meta_configuration
157
- cmdlet = Chef::Util::Powershell::Cmdlet.new(node, "Get-DscLocalConfigurationManager", :object)
158
- result = cmdlet.run!
159
- result.return_value
160
- end
161
-
162
158
  end
163
159
  end
164
160
  end
@@ -109,7 +109,7 @@ class Chef
109
109
  else
110
110
  # Append is not set so we're resetting the membership of
111
111
  # the group to the given members.
112
- members_to_be_added = @new_resource.members
112
+ members_to_be_added = @new_resource.members.dup
113
113
  @current_resource.members.each do |member|
114
114
  # No need to re-add a member if it's present in the new
115
115
  # list of members
@@ -194,7 +194,7 @@ class Chef
194
194
 
195
195
  private
196
196
  def add_command
197
- command = "ifconfig #{@new_resource.device} #{@new_resource.name}"
197
+ command = "ifconfig #{@new_resource.device} #{@new_resource.target}"
198
198
  command << " netmask #{@new_resource.mask}" if @new_resource.mask
199
199
  command << " metric #{@new_resource.metric}" if @new_resource.metric
200
200
  command << " mtu #{@new_resource.mtu}" if @new_resource.mtu
@@ -202,7 +202,7 @@ class Chef
202
202
  end
203
203
 
204
204
  def enable_command
205
- command = "ifconfig #{@new_resource.device} #{@new_resource.name}"
205
+ command = "ifconfig #{@new_resource.device} #{@new_resource.target}"
206
206
  command << " netmask #{@new_resource.mask}" if @new_resource.mask
207
207
  command << " metric #{@new_resource.metric}" if @new_resource.metric
208
208
  command << " mtu #{@new_resource.mtu}" if @new_resource.mtu
@@ -28,52 +28,10 @@ class Chef
28
28
  # Base class from which LWRP providers inherit.
29
29
  class LWRPBase < Provider
30
30
 
31
- # Chef::Provider::LWRPBase::InlineResources
32
- # Implementation of inline resource convergence for LWRP providers. See
33
- # Provider::LWRPBase.use_inline_resources for a longer explanation.
34
- #
35
- # This code is restricted to a module so that it can be selectively
36
- # applied to providers on an opt-in basis.
37
- module InlineResources
38
-
39
- # Class methods for InlineResources. Overrides the `action` DSL method
40
- # with one that enables inline resource convergence.
41
- module ClassMethods
42
- # Defines an action method on the provider, using
43
- # recipe_eval_with_update_check to execute the given block.
44
- def action(name, &block)
45
- define_method("action_#{name}") do
46
- recipe_eval_with_update_check(&block)
47
- end
48
- end
49
- end
50
-
51
- # Executes the given block in a temporary run_context with its own
52
- # resource collection. After the block is executed, any resources
53
- # declared inside are converged, and if any are updated, the
54
- # new_resource will be marked updated.
55
- def recipe_eval_with_update_check(&block)
56
- saved_run_context = @run_context
57
- temp_run_context = @run_context.dup
58
- @run_context = temp_run_context
59
- @run_context.resource_collection = Chef::ResourceCollection.new
60
-
61
- return_value = instance_eval(&block)
62
- Chef::Runner.new(@run_context).converge
63
- return_value
64
- ensure
65
- @run_context = saved_run_context
66
- if temp_run_context.resource_collection.any? {|r| r.updated? }
67
- new_resource.updated_by_last_action(true)
68
- end
69
- end
70
-
71
- end
72
-
73
31
  include Chef::DSL::Recipe
74
32
 
75
33
  # These were previously provided by Chef::Mixin::RecipeDefinitionDSLCore.
76
- # They are not included by its replacment, Chef::DSL::Recipe, but
34
+ # They are not included by its replacement, Chef::DSL::Recipe, but
77
35
  # they may be used in existing LWRPs.
78
36
  include Chef::DSL::PlatformIntrospection
79
37
  include Chef::DSL::DataQuery
@@ -122,38 +80,6 @@ class Chef
122
80
  provider_class
123
81
  end
124
82
 
125
- # Enables inline evaluation of resources in provider actions.
126
- #
127
- # Without this option, any resources declared inside the LWRP are added
128
- # to the resource collection after the current position at the time the
129
- # action is executed. Because they are added to the primary resource
130
- # collection for the chef run, they can notify other resources outside
131
- # the LWRP, and potentially be notified by resources outside the LWRP
132
- # (but this is complicated by the fact that they don't exist until the
133
- # provider executes). In this mode, it is impossible to correctly set the
134
- # updated_by_last_action flag on the parent LWRP resource, since it
135
- # executes and returns before its component resources are run.
136
- #
137
- # With this option enabled, each action creates a temporary run_context
138
- # with its own resource collection, evaluates the action's code in that
139
- # context, and then converges the resources created. If any resources
140
- # were updated, then this provider's new_resource will be marked updated.
141
- #
142
- # In this mode, resources created within the LWRP cannot interact with
143
- # external resources via notifies, though notifications to other
144
- # resources within the LWRP will work. Delayed notifications are executed
145
- # at the conclusion of the provider's action, *not* at the end of the
146
- # main chef run.
147
- #
148
- # This mode of evaluation is experimental, but is believed to be a better
149
- # set of tradeoffs than the append-after mode, so it will likely become
150
- # the default in a future major release of Chef.
151
- #
152
- def use_inline_resources
153
- extend InlineResources::ClassMethods
154
- include InlineResources
155
- end
156
-
157
83
  # DSL for defining a provider's actions.
158
84
  def action(name, &block)
159
85
  define_method("action_#{name}") do